Code review changes
1. Passing the module to the various functions so that they can use module.fail_json and module.exit_json methods inside. 2. Because of point 1, install and remove methods do not return anything. Instead, they use the module functions itself. 3. Move the import statement (for apt and apt_pkg) inside main function so on import error, we can use module.fail_json to print the error.
This commit is contained in:
parent
dd9e09dee6
commit
daf44331c4
1 changed files with 29 additions and 33 deletions
62
library/apt
62
library/apt
|
@ -22,15 +22,10 @@ import traceback
|
|||
import warnings;
|
||||
warnings.filterwarnings('ignore', "apt API not stable yet", FutureWarning)
|
||||
|
||||
# APT related constants
|
||||
APT_PATH = "/usr/bin/apt-get"
|
||||
APT = "DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical %s" % APT_PATH
|
||||
|
||||
try:
|
||||
import apt, apt_pkg
|
||||
except ImportError:
|
||||
json.dumps(dict(msg="could not import apt, please install the python-apt package on this host", failed=True))
|
||||
sys.exit(1)
|
||||
|
||||
def run_apt(command):
|
||||
try:
|
||||
cmd = subprocess.Popen(command, shell=True,
|
||||
|
@ -55,11 +50,11 @@ def package_split(pkgspec):
|
|||
else:
|
||||
return parts[0], None
|
||||
|
||||
def package_status(pkgname, version, cache):
|
||||
def package_status(m, pkgname, version, cache):
|
||||
try:
|
||||
pkg = cache[pkgname]
|
||||
except KeyError:
|
||||
fail_json(msg="No package matching '%s' is available" % pkgname)
|
||||
m.fail_json(msg="No package matching '%s' is available" % pkgname)
|
||||
if version:
|
||||
try :
|
||||
return pkg.is_installed and pkg.installed.version == version, False
|
||||
|
@ -73,9 +68,9 @@ def package_status(pkgname, version, cache):
|
|||
#assume older version of python-apt is installed
|
||||
return pkg.isInstalled, pkg.isUpgradable
|
||||
|
||||
def install(pkgspec, cache, upgrade=False, default_release=None, install_recommends=True, force=False):
|
||||
def install(m, pkgspec, cache, upgrade=False, default_release=None, install_recommends=True, force=False):
|
||||
name, version = package_split(pkgspec)
|
||||
installed, upgradable = package_status(name, version, cache)
|
||||
installed, upgradable = package_status(m, name, version, cache)
|
||||
if not installed or (upgrade and upgradable):
|
||||
if force:
|
||||
force_yes = '--force-yes'
|
||||
|
@ -89,20 +84,25 @@ def install(pkgspec, cache, upgrade=False, default_release=None, install_recomme
|
|||
cmd += " --no-install-recommends"
|
||||
|
||||
rc, out, err = run_apt(cmd)
|
||||
return rc, out, err
|
||||
if rc:
|
||||
m.fail_json(msg="'apt-get install %s' failed: %s" % (pkgspec, err))
|
||||
else:
|
||||
m.exit_json(changed=True)
|
||||
else:
|
||||
return -1, "", "" # -1 depicts that nothing was changed
|
||||
m.exit_json(changed=False)
|
||||
|
||||
def remove(pkgspec, cache, purge=False):
|
||||
def remove(m, pkgspec, cache, purge=False):
|
||||
name, version = package_split(pkgspec)
|
||||
installed, upgradable = package_status(name, version, cache)
|
||||
installed, upgradable = package_status(m, name, version, cache)
|
||||
if not installed:
|
||||
return -1, "", "" # -1 depicts nothing was changed
|
||||
m.exit_json(changed=False)
|
||||
else:
|
||||
purge = '--purge' if purge else ''
|
||||
cmd = "%s -q -y %s remove '%s'" % (APT, purge, name)
|
||||
rc, out, err = run_apt(cmd)
|
||||
return rc, out, error
|
||||
if rc:
|
||||
m.fail_json(msg="'apt-get remove %s' failed: %s" % (name, err))
|
||||
m.exit_json(changed=True)
|
||||
|
||||
|
||||
def main():
|
||||
|
@ -118,6 +118,11 @@ def main():
|
|||
)
|
||||
)
|
||||
|
||||
try:
|
||||
import apt, apt_pkg
|
||||
except:
|
||||
module.fail_json("Could not import python modules: apt, apt_pkg. Please install python-apt package.")
|
||||
|
||||
if not os.path.exists(APT_PATH):
|
||||
module.fail_json(msg="Cannot find apt-get")
|
||||
|
||||
|
@ -148,27 +153,18 @@ def main():
|
|||
module.fail_json(msg='invalid package spec')
|
||||
|
||||
if p['state'] == 'latest':
|
||||
if '=' in package:
|
||||
if '=' in p['package']:
|
||||
module.fail_json(msg='version number inconsistent with state=latest')
|
||||
|
||||
rc, out, err = install(p['package'], cache, upgrade=True,
|
||||
default_release=p['default_release'],
|
||||
install_recommends=install_recommends,
|
||||
force=force_yes)
|
||||
install(module, p['package'], cache, upgrade=True,
|
||||
default_release=p['default_release'],
|
||||
install_recommends=install_recommends,
|
||||
force=force_yes)
|
||||
|
||||
elif p['state'] == 'installed':
|
||||
rc, out, err = install(p['package'], cache, default_release=p['default_release'],
|
||||
install_recommends=install_recommends,force=force_yes)
|
||||
install(module, p['package'], cache, default_release=p['default_release'],
|
||||
install_recommends=install_recommends,force=force_yes)
|
||||
elif p['state'] == 'removed':
|
||||
rc, out, err = remove(p['package'], cache, purge == 'yes')
|
||||
|
||||
if rc:
|
||||
if rc == -1:
|
||||
module.exit_json(changed=False)
|
||||
else:
|
||||
module.fail_json(msg=err)
|
||||
else:
|
||||
module.exit_json(changed=True)
|
||||
remove(module, p['package'], cache, purge == 'yes')
|
||||
|
||||
# this is magic, see lib/ansible/module_common.py
|
||||
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
|
||||
|
|
Loading…
Reference in a new issue