import json import re import subprocess from os import environ from pathlib import Path def run(command, **kwargs): return subprocess.run(command, shell=True, check=True, **kwargs) def cap_run(command, **kwargs): return run( command, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, **kwargs ).stdout.strip() def cap_run_in_build(command, **kwargs): export_container_path = ( "export PATH=/root/.cargo/bin:/root/.npm-global/bin:$PATH && " ) command_in_build = ( f"podman exec -it build bash -c '{export_container_path}{command}'" ) return cap_run(command_in_build, **kwargs) def rpm_ostree_packages(output_dir): out = cap_run("rpm-ostree status --json") json_out = json.loads(out) deployments = json_out["deployments"] booted_deployment = deployments[0] if not booted_deployment["booted"]: for depl in deployments: if depl["booted"]: booted_deployment = depl break removals = booted_deployment["requested-base-removals"] additions = booted_deployment["requested-packages"] file = output_dir / "rpm-ostree.json" with file.open("w") as f: dict = {"Removed": removals, "Added": additions} json.dump(dict, f, indent=4) def cargo_packages(output_dir): out = cap_run_in_build("cargo install --list") pattern = r"(.+) .+:.*" crates = re.findall(pattern, out) file = output_dir / "cargo.txt" with file.open("w") as f: for crate in crates: f.write(crate + "\n") def npm_packages(output_dir): out = cap_run_in_build("npm list --json --location=global") json_out = json.loads(out) deps = json_out["dependencies"].keys() file = output_dir / "npm.txt" with file.open("w") as f: for dep in deps: f.write(dep + "\n") def pipx_packages(output_dir): out = cap_run("pipx list --json") json_out = json.loads(out) venvs = json_out["venvs"] packages = [] injections = [] for ind, venv_key in enumerate(venvs.keys()): metadata = venvs[venv_key]["metadata"] packages.append(metadata["main_package"]["package_or_url"]) injections.append(list(metadata["injected_packages"].keys())) file = output_dir / "pipx.json" with file.open("w") as f: dict = {p: i for p, i in zip(packages, injections)} json.dump(dict, f, indent=4) def main(): output_dir = Path(f"{environ['HOME']}/bk/installed_packages_info") output_dir.mkdir(parents=True, exist_ok=True) rpm_ostree_packages(output_dir) run( f"flatpak list --app --columns=name,application,origin > {output_dir}/flatpak.csv" ) pipx_packages(output_dir) run("podman start build") cargo_packages(output_dir) npm_packages(output_dir) run("podman kill build") if __name__ == "__main__": main()