From b984dd9c59dd43d50f5aafa91cfde29405f2fbd9 Mon Sep 17 00:00:00 2001 From: Romain Goncalves Date: Fri, 7 Jan 2022 15:59:21 +0100 Subject: [PATCH] package_facts: Support pkg_info OpenBSD, FreeBSD and NetBSD (#76580) --- ...-add-pkg_info-support-to-package_facts.yml | 2 + lib/ansible/modules/package_facts.py | 45 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/76580-add-pkg_info-support-to-package_facts.yml diff --git a/changelogs/fragments/76580-add-pkg_info-support-to-package_facts.yml b/changelogs/fragments/76580-add-pkg_info-support-to-package_facts.yml new file mode 100644 index 00000000000..4d84fa4dc57 --- /dev/null +++ b/changelogs/fragments/76580-add-pkg_info-support-to-package_facts.yml @@ -0,0 +1,2 @@ +minor_changes: + - package_facts - add pkg_info support for OpenBSD and NetBSD (https://github.com/ansible/ansible/pull/76580) diff --git a/lib/ansible/modules/package_facts.py b/lib/ansible/modules/package_facts.py index 41af47039b4..57c1d3ea751 100644 --- a/lib/ansible/modules/package_facts.py +++ b/lib/ansible/modules/package_facts.py @@ -19,8 +19,9 @@ options: - 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. + - The 'pkg_info' option was added in version 2.13. default: ['auto'] - choices: ['auto', 'rpm', 'apt', 'portage', 'pkg', 'pacman', 'apk'] + choices: ['auto', 'rpm', 'apt', 'portage', 'pkg', 'pacman', 'apk', 'pkg_info'] type: list elements: str strategy: @@ -214,6 +215,25 @@ ansible_facts: ], } } + # Sample pkg_info + { + "packages": { + "curl": [ + { + "name": "curl", + "source": "pkg_info", + "version": "7.79.0" + } + ], + "intel-firmware": [ + { + "name": "intel-firmware", + "source": "pkg_info", + "version": "20210608v0" + } + ], + } + } ''' import re @@ -436,6 +456,29 @@ class APK(CLIMgr): return raw_pkg_details +class PKG_INFO(CLIMgr): + + CLI = 'pkg_info' + + def list_installed(self): + rc, out, err = module.run_command([self._cli, '-a']) + 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 = {'name': package, 'version': ''} + details = package.split(maxsplit=1)[0].rsplit('-', maxsplit=1) + + try: + return { + 'name': details[0], + 'version': details[1], + } + except IndexError: + return raw_pkg_details + + def main(): # get supported pkg managers