import re import subprocess from time import sleep def _getDist(): with open("/etc/os-release", "r") as f: release = f.read().split('\n') for line in release: try: s = line.split("=") if s[0] == "ID": os_id = s[1] break except: pass return os_id def _isProxmox(): ispve = {} ispve["ispve"] = False try: result = subprocess.run(['pveversion'], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8') ispve["ispve"] = True ispve["string"] = result except FileNotFoundError: pass return ispve def _sizeMultiplier(unit): if unit == "KiB": return 1 elif unit == "MiB": return 1024 elif unit == "GiB": return 1024**2 elif unit == "TiB": return 1024**3 else: return 0 def getPackages(): dist = _getDist() ispve = _isProxmox() update_cmd = "apt update" pkgs = {} pkgs["updatable"] = {} pkgs["installed"] = {} if dist != "debian": if dist == "arch": update_cmd = "pacman -Sup --print-format %r,%n,%v" if "apt" in update_cmd: pkgs["package_mgr"] = "apt" result = subprocess.run(update_cmd.split(" "), stdout=subprocess.PIPE) update_cmd = "apt list --upgradable" result = subprocess.run(update_cmd.split(" "), stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[11:-1].split("\n") if result[0] == '': result = [] for pkg in result: try: pkgs["updatable"][pkg.split(" ")[0].split("/")[0]] = {} pkgs["updatable"][pkg.split(" ")[0].split("/")[0]]["version"] = pkg.split(" ")[1] pkgs["updatable"][pkg.split(" ")[0].split("/")[0]]["repository"] = pkg.split(" ")[0].split("/")[1] except: pass result = subprocess.run(["apt", "list"], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[11:-1].split("\n") for pkg in result: pkgs["installed"][pkg.split(" ")[0].split("/")[0]] = {} pkgs["installed"][pkg.split(" ")[0].split("/")[0]]["version"] = pkg.split(" ")[1] pkgs["installed"][pkg.split(" ")[0].split("/")[0]]["repository"] = pkg.split(" ")[0].split("/")[1] result = subprocess.run(["dpkg-query","-W","--showformat='${Package} ${Installed-Size}\n'"], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[:-2].replace("'", "").split("\n") for pkg in result: try: size = float(pkg.split(" ")[1]) except: size = 0.0 pkgs["installed"][pkg.split(" ")[0]]["size"] = size insld = {} for pkg in pkgs["installed"]: if "size" in pkgs["installed"][pkg]: insld[pkg] = pkgs["installed"][pkg] pkgs["installed"] = insld if "pacman" in update_cmd: pkgs["package_mgr"] = "pacman" result = subprocess.run(update_cmd.split(" "), stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[:-1].split("\n") for pkg in result: pkgs["updatable"][pkg.split(",")[1]] = {} pkgs["updatable"][pkg.split(",")[1]]["version"] = pkg.split(",")[2] pkgs["updatable"][pkg.split(",")[1]]["repository"] = pkg.split(",")[0] result = subprocess.run(["pacman", "-Qn"], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[:-1].split("\n") for pkg in result: pkgs["installed"][pkg.split(" ")[0]] = {} pkgs["installed"][pkg.split(" ")[0]]["version"] = pkg.split(" ")[1] pkgs["installed"][pkg.split(" ")[0]]["repository"] = "pacman.conf" result = subprocess.run(["pacman", "-Qm"], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[:-1].split("\n") for pkg in result: pkgs["installed"][pkg.split(" ")[0]] = {} pkgs["installed"][pkg.split(" ")[0]]["version"] = pkg.split(" ")[1] pkgs["installed"][pkg.split(" ")[0]]["repository"] = "user/AUR" result = subprocess.run(["pacman", "-Qi"], stdout=subprocess.PIPE) result = result.stdout.decode('utf-8')[:-1].split("\n\n") for pkg in result: p = pkg.split("\n") for i in p: if "Name" in i: package = i.split(": ")[1] if "Installed Size" in i: size = i.split(": ")[1] try: pkgs["installed"][package]["size"] = float(size.split(" ")[0]) * _sizeMultiplier(size.split(" ")[1]) except: pass total_size = 0 for pkg in pkgs["installed"]: try: total_size += pkgs["installed"][pkg]["size"] except: pass pkgs["total_size"] = total_size return pkgs if __name__ == "__main__": #print(_getDist()) #print(_isProxmox()) print(getPackages()) print(len(getPackages()['installed']))