def main(): """The main function.""" module = AnsibleModule( argument_spec=dict( name=dict(aliases=['pkg'], type='list'), state=dict( default='installed', choices=[ 'absent', 'present', 'installed', 'removed', 'latest']), enablerepo=dict(type='list', default=[]), disablerepo=dict(type='list', default=[]), list=dict(), conf_file=dict(default=None), disable_gpg_check=dict(default=False, type='bool'), ), required_one_of=[['name', 'list']], mutually_exclusive=[['name', 'list']], supports_check_mode=True) params = module.params if params['list']: base = _base( module, params['conf_file'], params['disable_gpg_check'], params['disablerepo'], params['enablerepo']) list_items(module, base, params['list']) else: # Note: base takes a long time to run so we want to check for failure # before running it. if not util.am_i_root(): module.fail_json(msg="This command has to be run under the root user.") base = _base( module, params['conf_file'], params['disable_gpg_check'], params['disablerepo'], params['enablerepo']) ensure(module, base, params['state'], params['name'])
def _make_ready(self): if self._ready: return self._ready = True self._system_cachedir = self.prefix if util.am_i_root(): self._cachedir = self._system_cachedir else: try: user_prefix = misc.getCacheDir() self._cachedir = user_prefix except (IOError, OSError) as e: logger.critical(_('Could not set cachedir: %s'), ucd(e))
def do_set(inp): if not util.am_i_root(): return { "error": { "message": "only the root user can make package changes", "kind": "failed" } } try: upds=inp["updates"] noop=inp["ral"]["noop"] base=dnf_base() was = {} for upd in upds: name=upd["name"] ensure=upd["should"]["ensure"] is_pkg=find_installed(base, name) if is_pkg: was[name]=is_pkg.evr else: was[name]="absent" if ensure == "present" or ensure == "installed": if not is_pkg: base.install(name) elif ensure == "absent" or ensure == "purged": if is_pkg: base.remove(name) elif ensure == "held": # No idea what this is supposed to do return { "error": { "message": "not implemented", "kind": "failed" }} elif ensure == "latest": if is_pkg: base.upgrade(name) else: base.install(name) else: # ensure must be a version number target=("%s-%s" % (name, ensure)) if is_pkg: base.upgrade(target) else: base.install(target) # Run the transaction base.resolve() if not noop: base.download_packages(base.transaction.install_set) base.do_transaction() # Generate changes result = { "changes": [], "derive": False } names = [ upd["name"] for upd in upds ] pkgs=[p for p in base.transaction.install_set if p.name in names] for pkg in pkgs: change={ "name": pkg.name, "ensure": { "is": pkgs[0].evr, "was": was[pkg.name] } } result["changes"].append(change) pkgs=[p for p in base.transaction.remove_set if p.name in names] for pkg in pkgs: change={ "name": pkg.name, "ensure": { "is": "absent", "was": was[p.name] } } result["changes"].append(change) return result except exceptions.Error as e: return { "error": { "message": str(e), "kind": "failed" } } finally: base.close()
def ensure(module, base, state, names): if not util.am_i_root(): module.fail_json(msg="This command has to be run under the root user.") if names == ['*'] and state == 'latest': base.upgrade_all() else: pkg_specs, group_specs, filenames = cli.commands.parse_spec_group_file( names) if group_specs: base.read_comps() groups = [] for group_spec in group_specs: group = base.comps.group_by_pattern(group_spec) if group: groups.append(group) else: module.fail_json( msg="No group {} available.".format(group_spec)) if state in ['installed', 'present']: # Install files. for filename in filenames: base.package_install(base.add_remote_rpm(filename)) # Install groups. for group in groups: base.group_install(group, const.GROUP_PACKAGE_TYPES) # Install packages. for pkg_spec in pkg_specs: _mark_package_install(module, base, pkg_spec) elif state == 'latest': # "latest" is same as "installed" for filenames. for filename in filenames: base.package_install(base.add_remote_rpm(filename)) for group in groups: try: base.group_upgrade(group) except exceptions.CompsError: # If not already installed, try to install. base.group_install(group, const.GROUP_PACKAGE_TYPES) for pkg_spec in pkg_specs: try: base.upgrade(pkg_spec) except dnf.exceptions.MarkingError: # If not already installed, try to install. _mark_package_install(module, base, pkg_spec) else: if filenames: module.fail_json( msg="Cannot remove paths -- please specify package name.") installed = base.sack.query().installed() for group in groups: if installed.filter(name=group.name): base.group_remove(group) for pkg_spec in pkg_specs: if installed.filter(name=pkg_spec): base.remove(pkg_spec) if not base.resolve(): module.exit_json(msg="Nothing to do") else: if module.check_mode: module.exit_json(changed=True) base.download_packages(base.transaction.install_set) base.do_transaction() response = {'changed': True, 'results': []} for package in base.transaction.install_set: response['results'].append("Installed: {}".format(package)) for package in base.transaction.remove_set: response['results'].append("Removed: {}".format(package)) module.exit_json(**response)