141 lines
5.0 KiB
Python
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']))
|