Skip to content

Commit 549bbdf

Browse files
feat: Add routes for CPU usage, system health, and network stats
1 parent 7ec9634 commit 549bbdf

12 files changed

Lines changed: 266 additions & 151 deletions

app.py

Lines changed: 12 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -1,145 +1,18 @@
1-
from flask import render_template, request, flash
2-
import os
3-
import psutil
4-
import datetime
5-
import subprocess
61
from src.config import app, db
7-
from src.models import SpeedTestResult, DashoardSettings, SystemInfo
8-
from src.utils import (
9-
datetimeformat,
10-
run_speedtest,
11-
get_system_info
12-
)
2+
from src import routes
133

14-
# initialize the database
15-
with app.app_context():
16-
db.create_all()
17-
settings = DashoardSettings.query.first()
18-
if not settings:
19-
db.session.add(DashoardSettings())
20-
db.session.commit()
4+
def register_routes():
5+
app.register_blueprint(routes.homepage_bp)
6+
app.register_blueprint(routes.settings_bp)
7+
app.register_blueprint(routes.system_health_bp)
8+
app.register_blueprint(routes.cpu_usage_bp)
9+
app.register_blueprint(routes.disk_usage_bp)
10+
app.register_blueprint(routes.memory_usage_bp)
11+
app.register_blueprint(routes.network_stats_bp)
12+
app.register_blueprint(routes.speedtest_bp)
2113

22-
@app.route('/')
23-
def dashboard():
24-
settings = DashoardSettings.query.first()
25-
SPEEDTEST_COOLDOWN_IN_HOURS = settings.speedtest_cooldown
26-
system_info = get_system_info(SystemInfo=SystemInfo)
27-
28-
# Fetch the last speedtest result
29-
n_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=SPEEDTEST_COOLDOWN_IN_HOURS)
30-
recent_results = SpeedTestResult.query.filter(SpeedTestResult.timestamp > n_hour_ago).all()
31-
last_timestamp = datetimeformat(recent_results[-1].timestamp) if recent_results else None
3214

33-
if recent_results:
34-
# Display the most recent result from the database
35-
latest_result = recent_results[-1]
36-
speedtest_result = {
37-
'download_speed': latest_result.download_speed,
38-
'upload_speed': latest_result.upload_speed,
39-
'ping': latest_result.ping
40-
}
41-
source = "Database"
42-
next_test_time = latest_result.timestamp + datetime.timedelta(hours=SPEEDTEST_COOLDOWN_IN_HOURS)
43-
show_prompt = False
44-
remaining_time_for_next_test = round((next_test_time - datetime.datetime.now()).total_seconds() / 60)
45-
else:
46-
# No recent results, prompt to perform a test
47-
speedtest_result = None
48-
source = None
49-
show_prompt = True
50-
remaining_time_for_next_test = None
51-
52-
return render_template('dashboard.html', system_info=system_info,
53-
speedtest_result=speedtest_result,
54-
source=source,
55-
last_timestamp=last_timestamp,
56-
next_test_time=remaining_time_for_next_test,
57-
show_prompt=show_prompt)
5815

59-
@app.route('/settings', methods=['GET', 'POST'])
60-
def settings():
61-
# Fetch the settings from the database and update them
62-
settings = DashoardSettings.query.first()
63-
if settings:
64-
if request.method == 'POST':
65-
settings.speedtest_cooldown = int(request.form['speedtest_cooldown'])
66-
settings.number_of_speedtests = int(request.form['number_of_speedtests'])
67-
settings.timezone = request.form['timezone']
68-
db.session.commit()
69-
flash('Settings updated successfully!', 'success')
70-
return render_template('settings.html', settings=settings)
7116

72-
@app.route('/speedtest')
73-
def speedtest():
74-
settings = DashoardSettings.query.first()
75-
SPEEDTEST_COOLDOWN_IN_HOURS = settings.speedtest_cooldown
76-
NUMBER_OF_SPEEDTESTS = settings.number_of_speedtests
77-
n_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=SPEEDTEST_COOLDOWN_IN_HOURS)
78-
recent_results = SpeedTestResult.query.filter(SpeedTestResult.timestamp > n_hour_ago).all()
79-
80-
if len(recent_results) < NUMBER_OF_SPEEDTESTS:
81-
speedtest_result = run_speedtest()
82-
if speedtest_result['status'] == "Error":
83-
return render_template('error/speedtest_error.html', error=speedtest_result['message'])
84-
85-
if speedtest_result:
86-
new_result = SpeedTestResult(
87-
download_speed=speedtest_result['download_speed'],
88-
upload_speed=speedtest_result['upload_speed'],
89-
ping=speedtest_result['ping']
90-
)
91-
db.session.add(new_result)
92-
db.session.commit()
93-
return render_template('speedtest_result.html', speedtest_result=speedtest_result, source="Actual Test")
94-
else:
95-
latest_result = recent_results[-1]
96-
next_test_time = latest_result.timestamp + datetime.timedelta(hours=SPEEDTEST_COOLDOWN_IN_HOURS)
97-
remaining_time_for_next_test = round((next_test_time - datetime.datetime.now()).total_seconds() / 60)
98-
return render_template('speedtest_result.html',
99-
speedtest_result=latest_result,
100-
source="Database",
101-
next_test_time=next_test_time,
102-
remaining_time_for_next_test=remaining_time_for_next_test)
103-
104-
@app.route('/cpu_usage')
105-
def cpu_usage():
106-
cpu_usage = psutil.cpu_percent(interval=1, percpu=True)
107-
return render_template('cpu_usage.html', cpu_usage=cpu_usage)
108-
109-
@app.route('/memory_usage')
110-
def memory_usage():
111-
memory_info = {
112-
'memory_percent': psutil.virtual_memory().percent,
113-
'memory_available': round(psutil.virtual_memory().available / (1024 ** 3), 2), # In GB
114-
'memory_used': round(psutil.virtual_memory().used / (1024 ** 3), 2) # In GB
115-
}
116-
return render_template('memory_usage.html', memory_info=memory_info)
117-
118-
@app.route('/disk_usage')
119-
def disk_usage():
120-
disk_info = {
121-
'disk_usage': psutil.disk_usage('/').percent,
122-
'disk_total': round(psutil.disk_usage('/').total / (1024 ** 3), 2), # In GB
123-
'disk_used': round(psutil.disk_usage('/').used / (1024 ** 3), 2), # In GB
124-
'disk_free': round(psutil.disk_usage('/').free / (1024 ** 3), 2) # In GB
125-
}
126-
return render_template('disk_usage.html', disk_info=disk_info)
127-
128-
@app.route('/network_stats')
129-
def network_stats():
130-
net_io = psutil.net_io_counters()
131-
network_info = {
132-
'network_sent': round(net_io.bytes_sent / (1024 ** 2), 2), # In MB
133-
'network_received': round(net_io.bytes_recv / (1024 ** 2), 2) # In MB
134-
}
135-
return render_template('network_stats.html', network_info=network_info)
136-
137-
@app.route('/system_health')
138-
def system_health():
139-
system_info = get_system_info(SystemInfo=SystemInfo)
140-
return render_template('system_health.html', system_info=system_info)
141-
142-
if __name__ == '__main__':
143-
with app.app_context():
144-
db.create_all()
145-
app.run(host='0.0.0.0', port=5000, debug=True)
17+
if __name__ == "__main__":
18+
app.run(host="0.0.0.0", port=5001, debug=True)

src/models.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
1-
2-
from src.config import db
31
import datetime
42

3+
from src.config import db, app
4+
55

66
class SpeedTestResult(db.Model):
7-
__tablename__ = 'SpeedTestResult'
7+
__tablename__ = "SpeedTestResult"
88
id = db.Column(db.Integer, primary_key=True)
99
download_speed = db.Column(db.String(50))
1010
upload_speed = db.Column(db.String(50))
1111
ping = db.Column(db.String(50))
1212
timestamp = db.Column(db.DateTime, default=datetime.datetime.now())
1313

1414
def __repr__(self):
15-
return f'<SpeedTestResult {self.download_speed}, {self.upload_speed}, {self.ping}>'
15+
return (
16+
f"<SpeedTestResult {self.download_speed}, {self.upload_speed}, {self.ping}>"
17+
)
1618

1719

1820
class DashoardSettings(db.Model):
19-
__tablename__ = 'DashboardSettings'
21+
__tablename__ = "DashboardSettings"
2022
id = db.Column(db.Integer, primary_key=True)
2123
speedtest_cooldown = db.Column(db.Integer, default=1)
2224
number_of_speedtests = db.Column(db.Integer, default=1)
23-
timezone = db.Column(db.String(50), default='Asia/Kolkata')
25+
timezone = db.Column(db.String(50), default="Asia/Kolkata")
2426

2527
def __repr__(self):
26-
return f'<DashboardSettings {self.speedtest_cooldown}, {self.timezone}, {self.number_of_speedtests}>'
28+
return f"<DashboardSettings {self.speedtest_cooldown}, {self.timezone}, {self.number_of_speedtests}>"
2729

2830

2931
class SystemInfo(db.Model):
30-
__tablename__ = 'SystemInfo'
32+
__tablename__ = "SystemInfo"
3133
id = db.Column(db.Integer, primary_key=True)
3234
username = db.Column(db.String(50))
3335
cpu_percent = db.Column(db.Float)
@@ -46,4 +48,14 @@ class SystemInfo(db.Model):
4648
timestamp = db.Column(db.DateTime, default=datetime.datetime.now())
4749

4850
def __repr__(self):
49-
return f'<SystemInfo {self.username}, {self.cpu_percent}, {self.memory_percent}, {self.disk_usage}, {self.battery_percent}, {self.cpu_core}, {self.boot_time}, {self.network_sent}, {self.network_received}, {self.process_count}, {self.swap_memory}, {self.uptime}, {self.ipv4_connections}, {self.ipv6_connections}, {self.dashboard_memory_usage}>'
51+
return f"<SystemInfo {self.username}, {self.cpu_percent}, {self.memory_percent}, {self.disk_usage}, {self.battery_percent}, {self.cpu_core}, {self.boot_time}, {self.network_sent}, {self.network_received}, {self.process_count}, {self.swap_memory}, {self.uptime}, {self.ipv4_connections}, {self.ipv6_connections}, {self.dashboard_memory_usage}>"
52+
53+
54+
# initialize the database
55+
with app.app_context():
56+
print("Creating tables")
57+
db.create_all()
58+
settings = DashoardSettings.query.first()
59+
if not settings:
60+
db.session.add(DashoardSettings())
61+
db.session.commit()

src/routes/__init__.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from src.routes.cpu_usage import cpu_usage_bp
2+
from src.routes.disk_usage import disk_usage_bp
3+
from src.routes.homepage import homepage_bp
4+
from src.routes.memory_usage import memory_usage_bp
5+
from src.routes.network_stats import network_stats_bp
6+
from src.routes.settings import settings_bp
7+
from src.routes.speedtest import speedtest_bp
8+
from src.routes.system_health import system_health_bp
9+
10+
__all__ = [
11+
"cpu_usage_bp",
12+
"disk_usage_bp",
13+
"homepage_bp",
14+
"memory_usage_bp",
15+
"network_stats_bp",
16+
"settings_bp",
17+
"speedtest_bp",
18+
"system_health_bp",
19+
]

src/routes/cpu_usage.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import psutil
2+
from flask import render_template, blueprints
3+
4+
from src.config import app
5+
6+
cpu_usage_bp = blueprints.Blueprint("cpu_usage", __name__)
7+
8+
@app.route("/cpu_usage")
9+
def cpu_usage():
10+
cpu_usage = psutil.cpu_percent(interval=1, percpu=True)
11+
return render_template("cpu_usage.html", cpu_usage=cpu_usage)

src/routes/disk_usage.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import psutil
2+
3+
from flask import render_template, blueprints
4+
5+
from src.config import app
6+
7+
disk_usage_bp = blueprints.Blueprint("disk_usage", __name__)
8+
9+
@app.route("/disk_usage")
10+
def disk_usage():
11+
disk_info = {
12+
"disk_usage": psutil.disk_usage("/").percent,
13+
"disk_total": round(psutil.disk_usage("/").total / (1024**3), 2), # In GB
14+
"disk_used": round(psutil.disk_usage("/").used / (1024**3), 2), # In GB
15+
"disk_free": round(psutil.disk_usage("/").free / (1024**3), 2), # In GB
16+
}
17+
return render_template("disk_usage.html", disk_info=disk_info)
18+

src/routes/homepage.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import datetime
2+
from flask import render_template, blueprints
3+
4+
from src.config import app
5+
from src.models import SpeedTestResult, DashoardSettings
6+
from src.utils import datetimeformat, get_system_info
7+
8+
homepage_bp = blueprints.Blueprint("homepage", __name__)
9+
10+
@app.route("/")
11+
def dashboard():
12+
settings = DashoardSettings.query.first()
13+
SPEEDTEST_COOLDOWN_IN_HOURS = settings.speedtest_cooldown
14+
system_info = get_system_info()
15+
16+
# Fetch the last speedtest result
17+
n_hour_ago = datetime.datetime.now() - datetime.timedelta(
18+
hours=SPEEDTEST_COOLDOWN_IN_HOURS)
19+
recent_results = SpeedTestResult.query.filter(
20+
SpeedTestResult.timestamp > n_hour_ago).all()
21+
last_timestamp = (
22+
datetimeformat(recent_results[-1].timestamp) if recent_results else None
23+
)
24+
25+
if recent_results:
26+
# Display the most recent result from the database
27+
latest_result = recent_results[-1]
28+
speedtest_result = {
29+
"download_speed": latest_result.download_speed,
30+
"upload_speed": latest_result.upload_speed,
31+
"ping": latest_result.ping,
32+
}
33+
source = "Database"
34+
next_test_time = latest_result.timestamp + datetime.timedelta(
35+
hours=SPEEDTEST_COOLDOWN_IN_HOURS
36+
)
37+
show_prompt = False
38+
remaining_time_for_next_test = round(
39+
(next_test_time - datetime.datetime.now()).total_seconds() / 60
40+
)
41+
else:
42+
# No recent results, prompt to perform a test
43+
speedtest_result = None
44+
source = None
45+
show_prompt = True
46+
remaining_time_for_next_test = None
47+
48+
return render_template(
49+
"dashboard.html",
50+
system_info=system_info,
51+
speedtest_result=speedtest_result,
52+
source=source,
53+
last_timestamp=last_timestamp,
54+
next_test_time=remaining_time_for_next_test,
55+
show_prompt=show_prompt,
56+
)

src/routes/memory_usage.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import psutil
2+
from flask import render_template, blueprints
3+
4+
from src.config import app
5+
6+
memory_usage_bp = blueprints.Blueprint("memory_usage", __name__)
7+
8+
@app.route("/memory_usage")
9+
def memory_usage():
10+
memory_info = {
11+
"memory_percent": psutil.virtual_memory().percent,
12+
"memory_available": round(
13+
psutil.virtual_memory().available / (1024**3), 2
14+
), # In GB
15+
"memory_used": round(psutil.virtual_memory().used / (1024**3), 2), # In GB
16+
}
17+
return render_template("memory_usage.html", memory_info=memory_info)

src/routes/network_stats.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import psutil
2+
from flask import render_template, blueprints
3+
4+
from src.config import app
5+
6+
network_stats_bp = blueprints.Blueprint("network_stats", __name__)
7+
8+
@app.route("/network_stats")
9+
def network_stats():
10+
net_io = psutil.net_io_counters()
11+
network_info = {
12+
"network_sent": round(net_io.bytes_sent / (1024**2), 2), # In MB
13+
"network_received": round(net_io.bytes_recv / (1024**2), 2), # In MB
14+
}
15+
return render_template("network_stats.html", network_info=network_info)
16+

src/routes/settings.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from flask import render_template, request, flash, blueprints
2+
3+
from src.config import app, db
4+
from src.models import DashoardSettings
5+
6+
settings_bp = blueprints.Blueprint("settings", __name__)
7+
8+
@app.route("/settings", methods=["GET", "POST"])
9+
def settings():
10+
# Fetch the settings from the database and update them
11+
settings = DashoardSettings.query.first()
12+
if settings:
13+
if request.method == "POST":
14+
settings.speedtest_cooldown = int(request.form["speedtest_cooldown"])
15+
settings.number_of_speedtests = int(request.form["number_of_speedtests"])
16+
settings.timezone = request.form["timezone"]
17+
db.session.commit()
18+
flash("Settings updated successfully!", "success")
19+
return render_template("settings.html", settings=settings)
20+

0 commit comments

Comments
 (0)