Skip to content

Commit e176978

Browse files
authored
Merge pull request #6 from QinCai-rui/Testing-for-many-new-endpoints
A lot of new endpoints
2 parents 7da4af4 + 4a21762 commit e176978

File tree

3 files changed

+177
-14
lines changed

3 files changed

+177
-14
lines changed

Server/rpi_metrics_server.py

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,43 @@ def get_memory_stats():
8787

8888
return total_ram, used_ram, total_swap, used_swap
8989

90+
def get_disk_info():
91+
"""Function to get disk usage statistics"""
92+
result = subprocess.run(["df", "-h", "/"], stdout=subprocess.PIPE, text=True)
93+
lines = result.stdout.strip().split('\n')
94+
parts = lines[1].split()
95+
96+
return {
97+
"Total Space": parts[1],
98+
"Used Space": parts[2],
99+
"Available Space": parts[3],
100+
"Usage Percentage": parts[4]
101+
}
102+
103+
def get_system_info():
104+
"""Function to get system information"""
105+
model_result = subprocess.run(["cat", "/proc/device-tree/model"], stdout=subprocess.PIPE, text=True)
106+
kernel_result = subprocess.run(["uname", "-r"], stdout=subprocess.PIPE, text=True)
107+
os_result = subprocess.run(["cat", "/etc/os-release"], stdout=subprocess.PIPE, text=True)
108+
109+
# Parse OS release info
110+
os_info = {}
111+
for line in os_result.stdout.strip().split('\n'):
112+
if '=' in line:
113+
key, value = line.split('=', 1)
114+
os_info[key] = value.strip('"')
115+
116+
return {
117+
"Model": model_result.stdout.strip().replace('\x00', ''),
118+
"Kernel Version": kernel_result.stdout.strip(),
119+
"OS": os_info.get('PRETTY_NAME', 'Unknown')
120+
}
121+
122+
def get_uptime_info():
123+
"""Function to get system uptime"""
124+
result = subprocess.run(["uptime", "-p"], stdout=subprocess.PIPE, text=True)
125+
return result.stdout.strip()
126+
90127
@app.route("/")
91128
@limiter.limit("2 per 3 seconds")
92129
def index():
@@ -103,7 +140,11 @@ def api():
103140
"/api/time": "Get current server time",
104141
"/api/mem": "Get memory statistics",
105142
"/api/cpu": "Get CPU usage",
143+
"/api/disk": "Get disk usage statistics",
144+
"/api/uptime": "Get system uptime",
145+
"/api/system": "Get system information",
106146
"/api/shutdown": "Authorize shutdown",
147+
"/api/reboot": "Authorize system reboot",
107148
"/api/update": "Authorize system update",
108149
"/api/all": "Get all system statistics"
109150
},
@@ -138,6 +179,25 @@ def api_cpu():
138179
"SoC Temperature": temp
139180
})
140181

182+
@app.route("/api/disk", methods=['GET'])
183+
@limiter.limit("5 per minute")
184+
def api_disk():
185+
"""Return disk usage statistics as JSON"""
186+
return jsonify(get_disk_info())
187+
188+
@app.route("/api/uptime", methods=['GET'])
189+
@limiter.limit("5 per minute")
190+
def api_uptime():
191+
"""Return system uptime as JSON"""
192+
uptime = get_uptime_info()
193+
return jsonify({"System Uptime": uptime})
194+
195+
@app.route("/api/system", methods=['GET'])
196+
@limiter.limit("2 per minute")
197+
def api_system():
198+
"""Return system information as JSON"""
199+
return jsonify(get_system_info())
200+
141201
@app.route("/api/shutdown", methods=['POST'])
142202
@limiter.limit("5 per hour")
143203
def api_shutdown():
@@ -150,6 +210,16 @@ def api_shutdown():
150210
return jsonify({"message": "System shutting down in 1 minute"}), 200
151211
return jsonify({"error": "Unauthorized"}), 401
152212

213+
@app.route("/api/reboot", methods=['POST'])
214+
@limiter.limit("5 per hour")
215+
def api_reboot():
216+
"""Authenticate using API key and reboot the system"""
217+
api_key = request.headers.get('x-api-key')
218+
if api_key == API_KEY:
219+
r = subprocess.run(["reboot"], stdout=subprocess.PIPE, text=True)
220+
return jsonify({"message": "System rebooting now"}), 200
221+
return jsonify({"error": "Unauthorized"}), 401
222+
153223
@app.route("/api/update", methods=['POST'])
154224
@limiter.limit("3 per hour")
155225
def api_update():
@@ -168,11 +238,15 @@ def api_update():
168238
@limiter.limit("1 per second")
169239
def api_plain():
170240
"""Collect system statistics and return as JSON (original endpoint /api)"""
241+
# Use existing functions for all metrics (just to DRY)
171242
time = get_current_time()
172243
ipv4 = get_ipv4_addr()
173244
cpu = get_cpu_usage()
174245
temp = get_soc_temp()
175246
total_ram, used_ram, total_swap, used_swap = get_memory_stats()
247+
disk_info = get_disk_info()
248+
uptime = get_uptime_info()
249+
system_info = get_system_info()
176250

177251
data = {
178252
"Current Time": time,
@@ -182,7 +256,15 @@ def api_plain():
182256
"Total RAM": f"{total_ram:.0f}MiB",
183257
"Used RAM": f"{used_ram:.0f}",
184258
"Total Swap": f"{total_swap:.0f}MiB",
185-
"Used Swap": f"{used_swap:.0f}"
259+
"Used Swap": f"{used_swap:.0f}",
260+
"System Uptime": uptime,
261+
"Disk Total": disk_info["Total Space"],
262+
"Disk Used": disk_info["Used Space"],
263+
"Disk Available": disk_info["Available Space"],
264+
"Disk Usage": disk_info["Usage Percentage"],
265+
"System Model": system_info["Model"],
266+
"Kernel Version": system_info["Kernel Version"],
267+
"OS": system_info["OS"]
186268
}
187269

188270
return jsonify(data)

Server/static/js/script.js

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,41 @@ window.onload = function() {
1010
return response.json();
1111
};
1212

13-
fetch('/api/all')
14-
.then(handleResponse)
15-
.then(data => {
16-
document.getElementById('current-time').textContent = data['Current Time'];
17-
document.getElementById('ip-address').textContent = data['IP Address'].replaceAll(" ", "\n");
18-
document.getElementById('cpu-usage').textContent = data['CPU Usage'];
19-
document.getElementById('soc-temp').textContent = data['SoC Temperature'].replace("C", "°C");
20-
document.getElementById('total-ram').textContent = data['Total RAM'];
21-
document.getElementById('used-ram').textContent = data['Used RAM'].concat("MiB");
22-
document.getElementById('total-swap').textContent = data['Total Swap'];
23-
document.getElementById('used-swap').textContent = data['Used Swap'].concat("MiB");
24-
})
25-
.catch(error => console.error('Error fetching API data:', error));
13+
// Function to fetch and update data
14+
const updateData = () => {
15+
fetch('/api/all')
16+
.then(handleResponse)
17+
.then(data => {
18+
// Original metrics
19+
document.getElementById('current-time').textContent = data['Current Time'];
20+
document.getElementById('ip-address').textContent = data['IP Address'].replaceAll(" ", "\n");
21+
document.getElementById('cpu-usage').textContent = data['CPU Usage'];
22+
document.getElementById('soc-temp').textContent = data['SoC Temperature'].replace("C", "°C");
23+
document.getElementById('total-ram').textContent = data['Total RAM'];
24+
document.getElementById('used-ram').textContent = data['Used RAM'].concat("MiB");
25+
document.getElementById('total-swap').textContent = data['Total Swap'];
26+
document.getElementById('used-swap').textContent = data['Used Swap'].concat("MiB");
27+
28+
// New metrics
29+
document.getElementById('system-uptime').textContent = data['System Uptime'];
30+
document.getElementById('disk-usage').textContent = data['Disk Usage'];
31+
document.getElementById('disk-total').textContent = data['Disk Total'];
32+
document.getElementById('disk-used').textContent = data['Disk Used'];
33+
document.getElementById('disk-available').textContent = data['Disk Available'];
34+
document.getElementById('system-model').textContent = data['System Model'];
35+
document.getElementById('kernel-version').textContent = data['Kernel Version'];
36+
document.getElementById('os-version').textContent = data['OS'];
37+
})
38+
.catch(error => console.error('Error fetching API data:', error));
39+
};
40+
41+
// Initial data load
42+
updateData();
2643

44+
// Update data every 5 seconds
45+
setInterval(updateData, 5000);
46+
47+
// Shutdown button handler
2748
document.getElementById('shutdown-btn').addEventListener('click', function() {
2849
const apiKey = prompt('Please enter your API key:');
2950
if (apiKey && confirm('Are you sure you want to shut down the system?')) {
@@ -39,6 +60,23 @@ window.onload = function() {
3960
}
4061
});
4162

63+
// Reboot button handler
64+
document.getElementById('reboot-btn').addEventListener('click', function() {
65+
const apiKey = prompt('Please enter your API key:');
66+
if (apiKey && confirm('Are you sure you want to reboot the system?')) {
67+
fetch('/api/reboot', {
68+
method: 'POST',
69+
headers: {
70+
'x-api-key': apiKey
71+
}
72+
})
73+
.then(handleResponse)
74+
.then(data => alert(data.message))
75+
.catch(error => console.error('Error during reboot:', error));
76+
}
77+
});
78+
79+
// Update button handler
4280
document.getElementById('update-btn').addEventListener('click', function() {
4381
const apiKey = prompt('Please enter your API key:');
4482
if (apiKey && confirm('Are you sure you want to update the system?')) {

Server/templates/index.html

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ <h1>System Statistics Data</h1>
1717
</div>
1818
<span id="current-time"></span>
1919
</div>
20+
<div style="display:flex;align-items:center;justify-content:space-between">
21+
<div>
22+
<i class="bi bi-hourglass-split"></i>
23+
<span style="margin-left:10px;color:black;font-weight:normal">System Uptime:</span>
24+
</div>
25+
<span id="system-uptime"></span>
26+
</div>
2027
<div style="display:flex;align-items:center;justify-content:space-between">
2128
<div>
2229
<i class="bi bi-pci-card-network"></i>
@@ -52,8 +59,44 @@ <h1>System Statistics Data</h1>
5259
</div>
5360
<span><span id="used-swap"></span>/<span id="total-swap"></span></span>
5461
</div>
62+
<div style="display:flex;align-items:center;justify-content:space-between">
63+
<div>
64+
<i class="bi bi-hdd"></i>
65+
<span style="margin-left:10px;color:black;font-weight:normal">Disk Usage:</span>
66+
</div>
67+
<span id="disk-usage"></span>
68+
</div>
69+
<div style="display:flex;align-items:center;justify-content:space-between">
70+
<div>
71+
<i class="bi bi-device-hdd"></i>
72+
<span style="margin-left:10px;color:black;font-weight:normal">Disk Space:</span>
73+
</div>
74+
<span><span id="disk-used"></span>/<span id="disk-total"></span> (<span id="disk-available"></span> free)</span>
75+
</div>
76+
<div style="display:flex;align-items:center;justify-content:space-between">
77+
<div>
78+
<i class="bi bi-motherboard"></i>
79+
<span style="margin-left:10px;color:black;font-weight:normal">System Model:</span>
80+
</div>
81+
<span id="system-model"></span>
82+
</div>
83+
<div style="display:flex;align-items:center;justify-content:space-between">
84+
<div>
85+
<i class="bi bi-gear"></i>
86+
<span style="margin-left:10px;color:black;font-weight:normal">Kernel:</span>
87+
</div>
88+
<span id="kernel-version"></span>
89+
</div>
90+
<div style="display:flex;align-items:center;justify-content:space-between">
91+
<div>
92+
<i class="bi bi-ubuntu"></i>
93+
<span style="margin-left:10px;color:black;font-weight:normal">Operating System:</span>
94+
</div>
95+
<span id="os-version"></span>
96+
</div>
5597
</div>
5698
<button id="shutdown-btn">Shutdown System</button>
99+
<button id="reboot-btn">Reboot System</button>
57100
<button id="update-btn">Update System</button>
58101
<script src="{{ url_for('static', filename='js/script.js') }}"></script>
59102
<hr>

0 commit comments

Comments
 (0)