139 lines
5.2 KiB
Python
139 lines
5.2 KiB
Python
import subprocess
|
|
import json
|
|
|
|
def health():
|
|
result = subprocess.run(['docker', 'ps', '-a', '--format', 'json', '--no-trunc'], stdout=subprocess.PIPE)
|
|
result = str(result.stdout)[:-1].replace("b'", "").replace('\\"', '').replace('\\', '').replace("u003e", ">").split('{"Command"')
|
|
|
|
ret_dict = {}
|
|
|
|
for container in result:
|
|
if container != "":
|
|
j = '{"Command"'+container[:-1]
|
|
data = json.loads(j)
|
|
ret_dict[data["Names"]] = {}
|
|
if data["State"] == "running":
|
|
ret_dict[data["Names"]]["status"] = 1
|
|
else:
|
|
ret_dict[data["Names"]]["status"] = 0
|
|
if "unhealthy" in data["Status"]:
|
|
ret_dict[data["Names"]]["health"] = 3
|
|
elif "Restarting" in data["Status"]:
|
|
ret_dict[data["Names"]]["health"] = 2
|
|
elif "healthy" in data["Status"]:
|
|
ret_dict[data["Names"]]["health"] = 0
|
|
elif "starting" in data["Status"]:
|
|
ret_dict[data["Names"]]["health"] = 1
|
|
else:
|
|
ret_dict[data["Names"]]["health"] = -1
|
|
|
|
|
|
return ret_dict
|
|
|
|
def _sizeConv(value):
|
|
number = ""
|
|
for d in value:
|
|
if d.isdigit():
|
|
number += d
|
|
elif d == '.':
|
|
number += d
|
|
else:
|
|
continue
|
|
number = float(number)
|
|
if "TB" in value:
|
|
return number * 10**12
|
|
elif "GB" in value:
|
|
return number * 10**9
|
|
elif "MB" in value:
|
|
return number * 10**6
|
|
elif "KB" in value:
|
|
return number * 10**3
|
|
else:
|
|
return number
|
|
|
|
def getSize():
|
|
result = subprocess.run(['docker', 'system', 'df', '--format', 'json'], stdout=subprocess.PIPE)
|
|
result = result.stdout.decode('utf-8')[:-1].split('\n')
|
|
|
|
size = {}
|
|
|
|
for line in result:
|
|
a = json.loads(line)
|
|
size[a["Type"]] = {}
|
|
size[a["Type"]]["used"] = _sizeConv(a["Size"])
|
|
size[a["Type"]]["reclaimable"] = _sizeConv(a["Reclaimable"].split(" ")[0])
|
|
size[a["Type"]]["count_total"] = a["TotalCount"]
|
|
size[a["Type"]]["count_active"] = a["Active"]
|
|
|
|
return size
|
|
|
|
def getInfo():
|
|
docker = {}
|
|
|
|
result = subprocess.run(['docker', 'system', 'info', '--format', 'json'], stdout=subprocess.PIPE)
|
|
result = result.stdout.decode('utf-8')[:-1]
|
|
info = json.loads(result)
|
|
|
|
docker["version"] = info["ServerVersion"]
|
|
|
|
result = subprocess.run(['docker', 'system', 'df', '-v', '--format', 'json'], stdout=subprocess.PIPE)
|
|
result = result.stdout.decode('utf-8')
|
|
info = json.loads(result)
|
|
|
|
docker["images"] = {}
|
|
docker["containers"] = {}
|
|
docker["volumes"] = {}
|
|
docker["buildcache"] = {}
|
|
|
|
for image in info["Images"]:
|
|
docker["images"][image["ID"]] = {}
|
|
docker["images"][image["ID"]]["containers"] = image["Containers"]
|
|
docker["images"][image["ID"]]["created"] = image["CreatedSince"]
|
|
docker["images"][image["ID"]]["repository"] = image["Repository"]
|
|
docker["images"][image["ID"]]["size"] = _sizeConv(image["Size"])
|
|
docker["images"][image["ID"]]["unique_size"] = image["UniqueSize"]
|
|
|
|
for container in info["Containers"]:
|
|
docker["containers"][container["ID"]] = {}
|
|
docker["containers"][container["ID"]]["created"] = container["CreatedAt"]
|
|
docker["containers"][container["ID"]]["image"] = container["Image"]
|
|
docker["containers"][container["ID"]]["volumes"] = container["LocalVolumes"]
|
|
docker["containers"][container["ID"]]["mounts"] = container["Mounts"]
|
|
try:
|
|
docker["containers"][container["ID"]]["name"] = container["Names"]
|
|
except:
|
|
docker["containers"][container["ID"]]["name"] = ""
|
|
try:
|
|
docker["containers"][container["ID"]]["networks"] = container["Networks"]
|
|
except:
|
|
docker["containers"][container["ID"]]["networks"] = ""
|
|
docker["containers"][container["ID"]]["runtime"] = container["RunningFor"]
|
|
docker["containers"][container["ID"]]["state"] = container["State"]
|
|
docker["containers"][container["ID"]]["size"] = _sizeConv(container["Size"])
|
|
docker["containers"][container["ID"]]["status"] = container["Status"]
|
|
|
|
for volume in info["Volumes"]:
|
|
docker["volumes"][volume["Name"]] = {}
|
|
docker["volumes"][volume["Name"]]["driver"] = volume["Driver"]
|
|
docker["volumes"][volume["Name"]]["links"] = volume["Links"]
|
|
docker["volumes"][volume["Name"]]["mountpoint"] = volume["Mountpoint"]
|
|
docker["volumes"][volume["Name"]]["size"] = _sizeConv(volume["Size"])
|
|
|
|
for build in info["BuildCache"]:
|
|
docker["buildcache"][build["ID"]] = {}
|
|
docker["buildcache"][build["ID"]]["type"] = build["CacheType"]
|
|
docker["buildcache"][build["ID"]]["created"] = build["CreatedSince"]
|
|
docker["buildcache"][build["ID"]]["in_use"] = build["InUse"]
|
|
docker["buildcache"][build["ID"]]["last_use"] = build["LastUsedSince"]
|
|
docker["buildcache"][build["ID"]]["shared"] = build["Shared"]
|
|
docker["buildcache"][build["ID"]]["size"] = _sizeConv(build["Size"])
|
|
docker["buildcache"][build["ID"]]["use_count"] = build["UsageCount"]
|
|
|
|
return docker
|
|
|
|
if __name__ == "__main__":
|
|
print(json.dumps(getSize()))
|
|
print(json.dumps(getInfo()))
|
|
|
|
#print(health())
|