homebrew_cask - add sudo_password parameter(#46471)
* Fixes #29403: homebrew_cask: Add SUDO_ASKPASS to module.run_command * homebrew_cask: refactor sudo_password code * homebrew_cask: more refactoring * homebrew_cask: use %s instead of string addition
This commit is contained in:
parent
94ee3712ae
commit
c9bc47b354
1 changed files with 80 additions and 14 deletions
|
@ -43,6 +43,11 @@ options:
|
|||
- state of the cask
|
||||
choices: [ 'present', 'absent', 'upgraded' ]
|
||||
default: present
|
||||
sudo_password:
|
||||
description:
|
||||
- The sudo password to be passed to SUDO_ASKPASS.
|
||||
required: false
|
||||
version_added: 2.8
|
||||
update_homebrew:
|
||||
description:
|
||||
- update homebrew itself first. Note that C(brew cask update) is
|
||||
|
@ -125,11 +130,18 @@ EXAMPLES = '''
|
|||
state: upgraded
|
||||
greedy: True
|
||||
|
||||
- homebrew_cask:
|
||||
name: wireshark
|
||||
state: present
|
||||
sudo_password: "{{ ansible_become_pass }}"
|
||||
|
||||
'''
|
||||
|
||||
import os.path
|
||||
import os
|
||||
import re
|
||||
import tempfile
|
||||
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.six import iteritems, string_types
|
||||
|
||||
|
@ -347,14 +359,15 @@ class HomebrewCask(object):
|
|||
# /class properties -------------------------------------------- }}}
|
||||
|
||||
def __init__(self, module, path=path, casks=None, state=None,
|
||||
update_homebrew=False, install_options=None,
|
||||
accept_external_apps=False, upgrade_all=False,
|
||||
greedy=False):
|
||||
sudo_password=None, update_homebrew=False,
|
||||
install_options=None, accept_external_apps=False,
|
||||
upgrade_all=False, greedy=False):
|
||||
if not install_options:
|
||||
install_options = list()
|
||||
self._setup_status_vars()
|
||||
self._setup_instance_vars(module=module, path=path, casks=casks,
|
||||
state=state, update_homebrew=update_homebrew,
|
||||
state=state, sudo_password=sudo_password,
|
||||
update_homebrew=update_homebrew,
|
||||
install_options=install_options,
|
||||
accept_external_apps=accept_external_apps,
|
||||
upgrade_all=upgrade_all,
|
||||
|
@ -472,6 +485,25 @@ class HomebrewCask(object):
|
|||
self.message = "You must select a cask to install."
|
||||
raise HomebrewCaskException(self.message)
|
||||
|
||||
# sudo_password fix ---------------------- {{{
|
||||
def _run_command_with_sudo_password(self, cmd):
|
||||
rc, out, err = '', '', ''
|
||||
|
||||
with tempfile.NamedTemporaryFile() as sudo_askpass_file:
|
||||
sudo_askpass_file.write(b"#!/bin/sh\n\necho '%s'\n" % to_bytes(self.sudo_password))
|
||||
os.chmod(sudo_askpass_file.name, 0o700)
|
||||
sudo_askpass_file.file.close()
|
||||
|
||||
rc, out, err = self.module.run_command(
|
||||
cmd,
|
||||
environ_update={'SUDO_ASKPASS': sudo_askpass_file.name}
|
||||
)
|
||||
|
||||
self.module.add_cleanup_file(sudo_askpass_file.name)
|
||||
|
||||
return (rc, out, err)
|
||||
# /sudo_password fix --------------------- }}}
|
||||
|
||||
# updated -------------------------------- {{{
|
||||
def _update_homebrew(self):
|
||||
rc, out, err = self.module.run_command([
|
||||
|
@ -505,11 +537,19 @@ class HomebrewCask(object):
|
|||
self.message = 'Casks would be upgraded.'
|
||||
raise HomebrewCaskException(self.message)
|
||||
|
||||
rc, out, err = self.module.run_command([
|
||||
self.brew_path,
|
||||
'cask',
|
||||
'upgrade',
|
||||
])
|
||||
opts = (
|
||||
[self.brew_path, 'cask', 'upgrade']
|
||||
)
|
||||
|
||||
cmd = [opt for opt in opts if opt]
|
||||
|
||||
rc, out, err = '', '', ''
|
||||
|
||||
if self.sudo_password:
|
||||
rc, out, err = self._run_command_with_sudo_password(cmd)
|
||||
else:
|
||||
rc, out, err = self.module.run_command(cmd)
|
||||
|
||||
if rc == 0:
|
||||
if re.search(r'==> No Casks to upgrade', out.strip(), re.IGNORECASE):
|
||||
self.message = 'Homebrew casks already upgraded.'
|
||||
|
@ -552,7 +592,13 @@ class HomebrewCask(object):
|
|||
)
|
||||
|
||||
cmd = [opt for opt in opts if opt]
|
||||
rc, out, err = self.module.run_command(cmd)
|
||||
|
||||
rc, out, err = '', '', ''
|
||||
|
||||
if self.sudo_password:
|
||||
rc, out, err = self._run_command_with_sudo_password(cmd)
|
||||
else:
|
||||
rc, out, err = self.module.run_command(cmd)
|
||||
|
||||
if self._current_cask_is_installed():
|
||||
self.changed_count += 1
|
||||
|
@ -610,7 +656,13 @@ class HomebrewCask(object):
|
|||
+ [self.current_cask]
|
||||
)
|
||||
cmd = [opt for opt in opts if opt]
|
||||
rc, out, err = self.module.run_command(cmd)
|
||||
|
||||
rc, out, err = '', '', ''
|
||||
|
||||
if self.sudo_password:
|
||||
rc, out, err = self._run_command_with_sudo_password(cmd)
|
||||
else:
|
||||
rc, out, err = self.module.run_command(cmd)
|
||||
|
||||
if self._current_cask_is_installed() and not self._current_cask_is_outdated():
|
||||
self.changed_count += 1
|
||||
|
@ -657,7 +709,13 @@ class HomebrewCask(object):
|
|||
)
|
||||
|
||||
cmd = [opt for opt in opts if opt]
|
||||
rc, out, err = self.module.run_command(cmd)
|
||||
|
||||
rc, out, err = '', '', ''
|
||||
|
||||
if self.sudo_password:
|
||||
rc, out, err = self._run_command_with_sudo_password(cmd)
|
||||
else:
|
||||
rc, out, err = self.module.run_command(cmd)
|
||||
|
||||
if not self._current_cask_is_installed():
|
||||
self.changed_count += 1
|
||||
|
@ -700,6 +758,11 @@ def main():
|
|||
"absent", "removed", "uninstalled",
|
||||
],
|
||||
),
|
||||
sudo_password=dict(
|
||||
type="str",
|
||||
required=False,
|
||||
no_log=True,
|
||||
),
|
||||
update_homebrew=dict(
|
||||
default=False,
|
||||
aliases=["update-brew"],
|
||||
|
@ -748,6 +811,8 @@ def main():
|
|||
if state in ('absent', 'removed', 'uninstalled'):
|
||||
state = 'absent'
|
||||
|
||||
sudo_password = p['sudo_password']
|
||||
|
||||
update_homebrew = p['update_homebrew']
|
||||
upgrade_all = p['upgrade_all']
|
||||
greedy = p['greedy']
|
||||
|
@ -758,7 +823,8 @@ def main():
|
|||
accept_external_apps = p['accept_external_apps']
|
||||
|
||||
brew_cask = HomebrewCask(module=module, path=path, casks=casks,
|
||||
state=state, update_homebrew=update_homebrew,
|
||||
state=state, sudo_password=sudo_password,
|
||||
update_homebrew=update_homebrew,
|
||||
install_options=install_options,
|
||||
accept_external_apps=accept_external_apps,
|
||||
upgrade_all=upgrade_all,
|
||||
|
|
Loading…
Reference in a new issue