Files
monitoring/packages.py
2026-04-27 11:35:05 +02:00

141 lines
5.0 KiB
Python

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']))