--- ./lib/ansible/modules/packaging/os/slackpkg.py 2021-04-13 02:00:55.000000000 +0200 +++ ./lib/ansible/modules/packaging/os/slackpkg.py.BBqse 2024-06-26 16:35:57.719328280 +0200 @@ -68,8 +68,41 @@ state: latest ''' +import platform +import os +import re from ansible.module_utils.basic import AnsibleModule +# check package(s) at PACKAGES.TXT file +# and return a list of valid package names +def get_packages(module, slackpkg_path, packages): + + package_c = 0 + pkgs = [] + + machine = platform.machine() + + for package in packages: + + # Exception for kernel-headers package on x86_64 + if package == "kernel-headers" and machine == "x86_64": + machine = "x86" + + PKG_FILE = "/var/lib/slackpkg/PACKAGES.TXT" + pattern = re.compile('%s.*-(%s|noarch|fw)-[^-]+$' % (re.escape(str(package)), re.escape(machine))) + + fh = open(PKG_FILE, "r").read() + for line in re.findall("PACKAGE NAME: %s.*" % re.escape(str(package)), fh): + pkg_name = line.split(":")[1].replace(' ','').replace('.txz','') + if pattern.match(pkg_name): + package_c += 1 + pkgs.append(pkg_name) + break + + if not package_c > 0: + module.fail_json(msg="package %s not at PACKAGES.TXT" % package) + + return pkgs def query_package(module, slackpkg_path, name): @@ -77,8 +110,7 @@ import platform machine = platform.machine() - packages = glob.glob("/var/log/packages/%s-*-[%s|noarch]*" % (name, - machine)) + packages = glob.glob("/var/log/packages/%s" % (name)) if len(packages) > 0: return True @@ -91,17 +123,12 @@ remove_c = 0 # Using a for loop in case of error, we can report the package that failed for package in packages: - # Query the package first, to see if we even need to remove - if not query_package(module, slackpkg_path, package): - continue - if not module.check_mode: rc, out, err = module.run_command("%s -default_answer=y -batch=on \ remove %s" % (slackpkg_path, package)) - if not module.check_mode and query_package(module, slackpkg_path, - package): + if not module.check_mode: module.fail_json(msg="failed to remove %s: %s" % (package, out)) remove_c += 1 @@ -168,12 +195,17 @@ if rc != 0: module.fail_json(msg="Could not update package cache") +def set_mirror(module, slackpkg_path): + rc, out, err = module.run_command("echo %s > /etc/slackpkg/mirrors") + if rc != 0: + module.fail_json(msg="Could not set mirror") def main(): module = AnsibleModule( argument_spec=dict( state=dict(default="installed", choices=['installed', 'removed', 'absent', 'present', 'latest']), name=dict(aliases=["pkg"], required=True, type='list'), + mirror=dict(aliases=["mirror"], required=False, type='string'), update_cache=dict(default=False, aliases=["update-cache"], type='bool'), ), @@ -185,13 +217,23 @@ pkgs = p['name'] + # format pkgs list + pkgs = (' '.join(map(str, pkgs))).replace(',',' ') + pkgs = " ".join(pkgs.split()) + pkgs = list(pkgs.split(' ')) + if p["update_cache"]: update_cache(module, slackpkg_path) + if p["mirror"]: + set_mirror(module, slackpkg_path) + if p['state'] == 'latest': + pkgs = get_packages(module, slackpkg_path, pkgs) upgrade_packages(module, slackpkg_path, pkgs) elif p['state'] in ['present', 'installed']: + pkgs = get_packages(module, slackpkg_path, pkgs) install_packages(module, slackpkg_path, pkgs) elif p["state"] in ['removed', 'absent']: