diff --git a/data/hooks/diagnosis/50-diskusage.py b/data/hooks/diagnosis/50-diskusage.py new file mode 100644 index 000000000..84ce3845c --- /dev/null +++ b/data/hooks/diagnosis/50-diskusage.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +import os +import psutil + +from yunohost.diagnosis import Diagnoser + +class DiskUsageDiagnoser(Diagnoser): + + id_ = os.path.splitext(os.path.basename(__file__))[0].split("-")[1] + cache_duration = 3600 * 24 + + def validate_args(self, args): + # TODO / FIXME Ugh do we really need this arg system + return {} + + def run(self): + + disk_partitions = psutil.disk_partitions() + + for disk_partition in disk_partitions: + device = disk_partition.device + mountpoint = disk_partition.mountpoint + + usage = psutil.disk_usage(mountpoint) + free_Go = usage.free / (1024 ** 3) + free_percent = 100 - usage.percent + + item = dict(meta={"mountpoint": mountpoint, "device": device}) + if free_Go < 1 or free_percent < 5: + item["status"] = "ERROR" + item["summary"] = ("diagnosis_diskusage_verylow", {"mountpoint": mountpoint, "device": device, "free_percent": free_percent}) + elif free_Go < 2 or free_percent < 10: + item["status"] = "WARNING" + item["summary"] = ("diagnosis_diskusage_low", {"mountpoint": mountpoint, "device": device, "free_percent": free_percent}) + else: + item["status"] = "SUCCESS" + item["summary"] = ("diagnosis_diskusage_ok", {"mountpoint": mountpoint, "device": device, "free_percent": free_percent}) + + yield item + +def main(args, env, loggers): + return DiskUsageDiagnoser(args, env, loggers).diagnose() diff --git a/locales/en.json b/locales/en.json index 8fcb0e773..2e93e367f 100644 --- a/locales/en.json +++ b/locales/en.json @@ -168,9 +168,13 @@ "diagnosis_dns_discrepancy": "According to the recommended DNS configuration, the value for the DNS record with type {0} and name {1} should be {2}, not {3}.", "diagnosis_services_good_status": "Service {service} is {status} as expected!", "diagnosis_services_bad_status": "Service {service} is {status} :/", + "diagnosis_diskusage_verylow": "Storage {mountpoint} (on device {device}) has only {free_percent}% space remaining. You should really consider cleaning up some space.", + "diagnosis_diskusage_low": "Storage {mountpoint} (on device {device}) has only {free_percent}% space remaining. Be careful", + "diagnosis_diskusage_ok": "Storage {mountpoint} (on device {device}) still has {free_percent}% space left!", "diagnosis_description_ip": "Internet connectivity", "diagnosis_description_dnsrecords": "DNS records", "diagnosis_description_services": "Services status check", + "diagnosis_description_diskusage": "Disk usage", "domain_cannot_remove_main": "Cannot remove main domain. Set a new main domain first", "domain_cert_gen_failed": "Could not generate certificate", "domain_created": "Domain created",