timmy ревизій цього gist 10 months ago. До ревизії
Без змін
timmy ревизій цього gist 10 months ago. До ревизії
Без змін
timmy ревизій цього gist 10 months ago. До ревизії
Без змін
timmy ревизій цього gist 10 months ago. До ревизії
1 file changed, 66 insertions
disk_usage_http_server.py(файл створено)
| @@ -0,0 +1,66 @@ | |||
| 1 | + | import json | |
| 2 | + | from http.server import BaseHTTPRequestHandler, HTTPServer | |
| 3 | + | from urllib.parse import urlparse, parse_qs | |
| 4 | + | import shutil | |
| 5 | + | ||
| 6 | + | ||
| 7 | + | class DiskUsage: | |
| 8 | + | def __init__(self, path="/"): | |
| 9 | + | self.path = path | |
| 10 | + | ||
| 11 | + | def get_usage(self): | |
| 12 | + | try: | |
| 13 | + | total, used, free = shutil.disk_usage(self.path) | |
| 14 | + | usage_percent = (used / total) * 100 if total > 0 else 0 | |
| 15 | + | return { | |
| 16 | + | "path": self.path, | |
| 17 | + | "total_space": total, | |
| 18 | + | "used_space": used, | |
| 19 | + | "free_space": free, | |
| 20 | + | "usage_percent": usage_percent, | |
| 21 | + | } | |
| 22 | + | except Exception as e: | |
| 23 | + | return {"error": str(e)} | |
| 24 | + | ||
| 25 | + | @staticmethod | |
| 26 | + | def format_size(size_in_bytes): | |
| 27 | + | for unit in ["B", "KB", "MB", "GB", "TB"]: | |
| 28 | + | if size_in_bytes < 1024: | |
| 29 | + | return f"{size_in_bytes:.2f} {unit}" | |
| 30 | + | size_in_bytes /= 1024 | |
| 31 | + | return f"{size_in_bytes:.2f} PB" | |
| 32 | + | ||
| 33 | + | ||
| 34 | + | class DiskUsageHandler(BaseHTTPRequestHandler): | |
| 35 | + | def do_GET(self): | |
| 36 | + | parsed_path = urlparse(self.path) | |
| 37 | + | if parsed_path.path == "/disk-usage": | |
| 38 | + | # 取得 query string 中的 path 參數 | |
| 39 | + | query = parse_qs(parsed_path.query) | |
| 40 | + | path = query.get("path", ["/"])[0] | |
| 41 | + | ||
| 42 | + | # 執行 DiskUsage 並取得結果 | |
| 43 | + | disk_usage = DiskUsage(path) | |
| 44 | + | usage = disk_usage.get_usage() | |
| 45 | + | ||
| 46 | + | # 回傳 JSON 結果 | |
| 47 | + | self.send_response(200) | |
| 48 | + | self.send_header("Content-Type", "application/json") | |
| 49 | + | self.end_headers() | |
| 50 | + | self.wfile.write(json.dumps(usage).encode("utf-8")) | |
| 51 | + | else: | |
| 52 | + | self.send_response(404) | |
| 53 | + | self.send_header("Content-Type", "application/json") | |
| 54 | + | self.end_headers() | |
| 55 | + | self.wfile.write(json.dumps({"error": "Not Found"}).encode("utf-8")) | |
| 56 | + | ||
| 57 | + | ||
| 58 | + | def run(server_class=HTTPServer, handler_class=DiskUsageHandler, port=8000): | |
| 59 | + | server_address = ("", port) | |
| 60 | + | httpd = server_class(server_address, handler_class) | |
| 61 | + | print(f"Starting server on port {port}...") | |
| 62 | + | httpd.serve_forever() | |
| 63 | + | ||
| 64 | + | ||
| 65 | + | if __name__ == "__main__": | |
| 66 | + | run() | |
Новіше
Пізніше