""" Utilities for working with the apt package manager """ import os import subprocess from tljh import utils def trust_gpg_key(key): """ Trust given GPG public key. key is a GPG public key (bytes) that can be passed to apt-key add via stdin. """ # If gpg2 doesn't exist, install it. if not os.path.exists("/usr/bin/gpg2"): install_packages(["gnupg2"]) utils.run_subprocess(["apt-key", "add", "-"], input=key) def add_source(name, source_url, section): """ Add a debian package source. distro is determined from /etc/os-release """ # lsb_release is not installed in most docker images by default distro = ( subprocess.check_output( ["/bin/bash", "-c", "source /etc/os-release && echo ${VERSION_CODENAME}"], stderr=subprocess.STDOUT, ) .decode() .strip() ) line = f"deb {source_url} {distro} {section}\n" with open(os.path.join("/etc/apt/sources.list.d/", name + ".list"), "a+") as f: # Write out deb line only if it already doesn't exist f.seek(0) if line not in f.read(): f.write(line) f.truncate() utils.run_subprocess(["apt-get", "update", "--yes"]) def install_packages(packages): """ Install debian packages """ # Check if an apt-get update is required if len(os.listdir("/var/lib/apt/lists")) == 0: utils.run_subprocess(["apt-get", "update", "--yes"]) env = os.environ.copy() # Stop apt from asking questions! env["DEBIAN_FRONTEND"] = "noninteractive" utils.run_subprocess(["apt-get", "install", "--yes"] + packages, env=env)