Last active 10 months ago

這段程式碼建立了一個簡單的 HTTP 伺服器,透過 /disk-usage API 端點提供磁碟空間使用狀況的查詢功能。使用者可以透過 GET 請求並指定 path 參數來獲取該目錄的總空間、已使用空間、可用空間及使用率,適用於系統監控或遠端管理工具。

disk_usage_http_server.py Raw
1import json
2from http.server import BaseHTTPRequestHandler, HTTPServer
3from urllib.parse import urlparse, parse_qs
4import shutil
5
6
7class 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
34class 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
58def 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
65if __name__ == "__main__":
66 run()
67