Added disk support

This commit is contained in:
bMorgan01 2025-07-04 08:09:44 -06:00
parent e748f29932
commit ac5b4aab6e

54
main.py Normal file → Executable file
View file

@ -1,6 +1,48 @@
#!/usr/bin/python3
import json
from threading import Thread, Lock
from flask import Flask, jsonify
import subprocess
from datetime import datetime
import time
import psutil
class Disk:
def __init__(self, values, updated) -> None:
self.sdiskio = values
self.updated = updated
self.read_rate = 0
self.read_rate = 0
def update(self, values, updated) -> None:
time_diff = updated - self.updated
read_diff = values.read_bytes - self.sdiskio.read_bytes
wrtn_diff = values.write_bytes - self.sdiskio.write_bytes
self.read_rate = read_diff/time_diff.total_seconds()
self.wrtn_rate = wrtn_diff/time_diff.total_seconds()
self.sdiskio = values
self.updated = updated
disk_dict = dict()
mutex = Lock()
def disk_io():
disks = psutil.disk_io_counters(perdisk=True)
updated = datetime.now()
with mutex:
for disk in disks:
if disk not in disk_dict:
disk_dict[disk] = Disk(disks[disk], updated)
else:
disk_dict[disk].update(disks[disk], updated)
def disk_thread_targ():
print("Disk thread started.")
while True:
disk_io()
time.sleep(1)
def remove_empty_lists(item):
if isinstance(item, list):
@ -13,7 +55,10 @@ def remove_empty_lists(item):
else:
return item
print("App started.")
app = Flask(__name__)
t = Thread(target=disk_thread_targ)
t.start()
@app.route("/")
def hello():
@ -61,7 +106,14 @@ def temps():
@app.route("/api/disks")
def disks():
out = '{"disks":[' + subprocess.getoutput("df -P --total -x squashfs | awk \'BEGIN {printf\"{\\\"discarray\\\":[\"}{if($1==\"Filesystem\")next;if(a)printf\",\";printf\"{\\\"mount\\\":\\\"\"$6\"\\\",\\\"size\\\":\\\"\"$2\"\\\",\\\"used\\\":\\\"\"$3\"\\\",\\\"avail\\\":\\\"\"$4\"\\\",\\\"use%\\\":\\\"\"$5\"\\\"}\";a++;}END{print\"]}\";}\'")
out += "," + subprocess.run(["iostat", "-d", "-o", "JSON"], capture_output = True, text = True).stdout + "]}"
dict_dict = dict()
with mutex:
for disk in disk_dict:
dict_dict[disk] = dict(disk_dict[disk].__dict__)
dict_dict[disk].pop('updated')
out += "," + json.dumps(dict_dict) + "]}"
return jsonify(remove_empty_lists(json.loads(out)))
@app.route("/api/memory")