diff --git a/roles/dbscripts/files/lsrepo b/roles/dbscripts/files/lsrepo index f88ff61b87baced0c9a78dfe3ce4e599c90fec01..7b10ac59916a36f9669a70037e2bef7abb33a764 100755 --- a/roles/dbscripts/files/lsrepo +++ b/roles/dbscripts/files/lsrepo @@ -1,12 +1,11 @@ #!/usr/bin/env python3 +import logging from argparse import ArgumentParser -from asyncio import gather, get_event_loop, create_subprocess_exec +from asyncio import create_subprocess_exec, gather, run from asyncio.subprocess import DEVNULL, PIPE from pathlib import Path from shlex import quote from warnings import warn -import logging - log = logging.getLogger(__name__) @@ -17,7 +16,9 @@ class DBParser: self._packages = {} def _assert_state(self, *wanted): - assert self._state in wanted, "state is {!r}, not in {!r}".format(self._state, wanted) + assert self._state in wanted, "state is {!r}, not in {!r}".format( + self._state, wanted + ) def _add_package(self): name, base, version = self._name, self._base, self._version @@ -31,8 +32,11 @@ class DBParser: pkg = self._packages.setdefault(base, {}) pkg.setdefault("names", set()).add(name) if pkg.setdefault("version", version) != version: - warn("Conflicting versions for pkgbase {!r}: {!r} {!r}".format( - base, pkg["version"], version)) + warn( + "Conflicting versions for pkgbase {!r}: {!r} {!r}".format( + base, pkg["version"], version + ) + ) self._name = self._base = self._version = None @@ -86,21 +90,18 @@ async def open_db(dbfile): args = "/usr/bin/bsdtar", "-xOf", str(dbfile), "*/desc" cmdline = " ".join(quote(a) for a in args) log.debug("Running %s", cmdline) - process = await create_subprocess_exec( - *args, stdout=PIPE, stderr=DEVNULL, env={} - ) - process.cmdline = cmdline + process = await create_subprocess_exec(*args, stdout=PIPE, stderr=DEVNULL, env={}) + process.cmdline = cmdline # type: ignore return process async def read_db(dbfile): - state = name = base = version = None packages = {} process = await open_db(dbfile) with DBParser() as parser: while True: - line = await process.stdout.readline() + line = await process.stdout.readline() # type: ignore if not line: break parser.parse_line(line.decode()) @@ -118,11 +119,11 @@ async def read_repo(name, archs): path = Path("/srv/ftp") / name / "os" / arch / (name + ".db") db = {} if path.exists(): - try: - db = await read_db(path) - log.debug("Loaded repo name=%r arch=%r pkgs=%d", name, arch, len(db)) - except Exception as e: - log.warning("Failed to read repo name=%r arch=%r: %s", name, arch, e) + try: + db = await read_db(path) + log.debug("Loaded repo name=%r arch=%r pkgs=%d", name, arch, len(db)) + except Exception as e: + log.warning("Failed to read repo name=%r arch=%r: %s", name, arch, e) return frozenset([arch]), db repo = {} @@ -153,12 +154,30 @@ def packages(repos): def parse_args(): parser = ArgumentParser(description="List packages in FTP repositories") mode = parser.add_mutually_exclusive_group() - mode.add_argument("-b", "--bases", dest="mode", action="store_const", const="bases", - help="Only list pkgbases") - mode.add_argument("-n", "--names", dest="mode", action="store_const", const="names", - help="Only list pkgnames") - parser.add_argument("-a", "--arch", metavar="ARCH", dest="archs", action="append", - help="Arch to read") + mode.add_argument( + "-b", + "--bases", + dest="mode", + action="store_const", + const="bases", + help="Only list pkgbases", + ) + mode.add_argument( + "-n", + "--names", + dest="mode", + action="store_const", + const="names", + help="Only list pkgnames", + ) + parser.add_argument( + "-a", + "--arch", + metavar="ARCH", + dest="archs", + action="append", + help="Arch to read", + ) parser.add_argument("--debug", action="store_true", help="Enable debug output") parser.add_argument("repos", metavar="REPO", nargs="+", help="Repository to read") return parser.parse_args() @@ -171,12 +190,7 @@ if args.debug: logging.root.setLevel(logging.DEBUG) archs = frozenset(args.archs or ["x86_64"]) -loop = get_event_loop() -try: - repos = loop.run_until_complete(read_repos(args.repos, archs)) -finally: - loop.close() - +repos = run(read_repos(args.repos, archs)) if args.mode == "bases": for base in set(bases(repos)): @@ -185,6 +199,7 @@ elif args.mode == "names": for name in {n for p in packages(repos) for n in p["names"]}: print(name) else: + longestbase = longestarch = longestver = 0 if any(repos.values()): longestbase = max(len(b) for b in bases(repos)) longestarch = len(" ".join(archs)) @@ -203,9 +218,13 @@ else: " \033[{}m{:^{}s}\033[39m" " \033[36m{:<{}s}\033[39m" " {}".format( - base, longestbase, - 34 if arch == archs else 31, " ".join(sorted(arch)), longestarch, - pkg["version"], longestver, - " ".join(sorted(pkg["names"])) + base, + longestbase, + 34 if arch == archs else 31, + " ".join(sorted(arch)), + longestarch, + pkg["version"], + longestver, + " ".join(sorted(pkg["names"])), ) )