From 57b548598c07afda1db9e0c79dca019114a6e392 Mon Sep 17 00:00:00 2001 From: Julien Date: Wed, 15 Jul 2020 12:40:25 -0400 Subject: [PATCH] add alpine apk package manager to package_facts [wip] (#70587) * add alpine apk package manager to package_facts --- .../fragments/70587-package_facts-apk.yml | 2 ++ lib/ansible/modules/package_facts.py | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/70587-package_facts-apk.yml diff --git a/changelogs/fragments/70587-package_facts-apk.yml b/changelogs/fragments/70587-package_facts-apk.yml new file mode 100644 index 00000000000..68a0a313e77 --- /dev/null +++ b/changelogs/fragments/70587-package_facts-apk.yml @@ -0,0 +1,2 @@ +bugfixes: + - add support for alpine linux 'apk' package manager in package_facts diff --git a/lib/ansible/modules/package_facts.py b/lib/ansible/modules/package_facts.py index e957e8300b9..255ab5f09a5 100644 --- a/lib/ansible/modules/package_facts.py +++ b/lib/ansible/modules/package_facts.py @@ -19,8 +19,9 @@ options: - The package manager used by the system so we can query the package information. - Since 2.8 this is a list and can support multiple package managers per system. - The 'portage' and 'pkg' options were added in version 2.8. + - The 'apk' option was added in version 2.11. default: ['auto'] - choices: ['auto', 'rpm', 'apt', 'portage', 'pkg', 'pacman'] + choices: ['auto', 'rpm', 'apt', 'portage', 'pkg', 'pacman', 'apk'] required: False type: list strategy: @@ -376,6 +377,28 @@ class PORTAGE(CLIMgr): return dict(zip(self.atoms, package.split())) +class APK(CLIMgr): + + CLI = 'apk' + atoms = ['name', 'version'] + + def list_installed(self): + rc, out, err = module.run_command([self._cli, 'info', '-v']) + if rc != 0 or err: + raise Exception("Unable to list packages rc=%s : %s" % (rc, err)) + return out.splitlines() + + def get_package_details(self, package): + raw_pkg_details = {} + for line in package.splitlines(): + m = re.match(r"([\w ].*?)-([0-9-\.]+[0-9a-z-\.]*-r[0-9]+)", to_native(line)) + if m: + raw_pkg_details['name'] = m.group(1) + raw_pkg_details['version'] = m.group(2) + + return raw_pkg_details + + def main(): # get supported pkg managers