Skip to content

Commit b4704f9

Browse files
Merge pull request #2 from SystemGuard-official/features/caching
Features/caching
2 parents 8c23234 + 1b12587 commit b4704f9

30 files changed

+688
-145
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ It will install the SystemGuard app and its dependencies in the crontab and it w
4343
```bash
4444
# install miniconda3 if not installed already
4545
wget https://raw.githubusercontent.com/codeperfectplus/HackScripts/main/setup/install_miniconda.sh
46-
chmod +x install_miniconda.sh && ./install_miniconda.sh
46+
chmod +x install_miniconda.sh && sudo ./install_miniconda.sh
4747
```
4848

4949
## Features 🚀
@@ -84,6 +84,12 @@ chmod +x install_miniconda.sh && ./install_miniconda.sh
8484

8585
A Docker image has not been created for this project because it requires access to the host machine in order to retrieve server stats. Therefore, it is not possible to obtain server stats from within a Docker container.
8686

87+
## Upcoming Features 📅
88+
89+
- Threshold notifications
90+
- Customizable dashboards
91+
- Plugin support to make SystemGuard even more powerful.
92+
8793
## Acknowledgments
8894

8995
| Project | License | Repository |

src/models.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,36 @@ def __repr__(self):
2222
class DashboardSettings(db.Model):
2323
__tablename__ = "DashboardSettings"
2424
id = db.Column(db.Integer, primary_key=True)
25+
26+
# speedtest setting
2527
speedtest_cooldown = db.Column(db.Integer, default=1)
2628
number_of_speedtests = db.Column(db.Integer, default=1)
29+
30+
# general settings
2731
timezone = db.Column(db.String(50), default="Asia/Kolkata")
32+
enable_cache = db.Column(db.Boolean, default=True)
33+
34+
# page enable/disable
35+
is_cpu_info_enabled = db.Column(db.Boolean, default=True)
36+
is_memory_info_enabled = db.Column(db.Boolean, default=True)
37+
is_disk_info_enabled = db.Column(db.Boolean, default=True)
38+
is_network_info_enabled = db.Column(db.Boolean, default=True)
39+
is_process_info_enabled = db.Column(db.Boolean, default=False)
40+
41+
42+
# card enable/disable
43+
is_user_card_enabled = db.Column(db.Boolean, default=True)
44+
is_server_card_enabled = db.Column(db.Boolean, default=True)
45+
is_battery_card_enabled = db.Column(db.Boolean, default=True)
46+
is_cpu_core_card_enabled = db.Column(db.Boolean, default=True)
47+
is_cpu_usage_card_enabled = db.Column(db.Boolean, default=True)
48+
is_cpu_temp_card_enabled = db.Column(db.Boolean, default=True)
49+
is_dashboard_memory_card_enabled = db.Column(db.Boolean, default=True)
50+
is_memory_usage_card_enabled = db.Column(db.Boolean, default=True)
51+
is_disk_usage_card_enabled = db.Column(db.Boolean, default=True)
52+
is_system_uptime_card_enabled = db.Column(db.Boolean, default=True)
53+
is_network_statistic_card_enabled = db.Column(db.Boolean, default=True)
54+
is_speedtest_enabled = db.Column(db.Boolean, default=False)
2855

2956
def __repr__(self):
3057
return f"<DashboardSettings {self.speedtest_cooldown}, {self.timezone}, {self.number_of_speedtests}>"
@@ -76,4 +103,10 @@ class User(db.Model, UserMixin):
76103
hashed_password = generate_password_hash('adminpassword')
77104
admin_user = User(username='admin', password=hashed_password, user_level='admin')
78105
db.session.add(admin_user)
79-
db.session.commit()
106+
db.session.commit()
107+
108+
# ibject for all templates
109+
@app.context_processor
110+
def inject_settings():
111+
settings = DashboardSettings.query.first()
112+
return dict(settings=settings)

src/routes/cpu_info.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@
22
from flask import render_template, blueprints
33

44
from src.config import app
5-
from src.utils import get_cpu_core_count, get_cpu_frequency, cpu_usage_percent, get_cpu_temp
5+
from src.utils import get_cpu_core_count, get_cpu_frequency, cpu_usage_percent, get_cpu_temp, get_cached_value
6+
from src.models import DashboardSettings
67

78
cpu_info_bp = blueprints.Blueprint("cpu_usage", __name__)
89

910
@app.route("/cpu_usage")
1011
def cpu_usage():
12+
settings = DashboardSettings.query.first()
13+
if not settings.is_cpu_info_enabled:
14+
return render_template("error/404.html")
15+
1116
current_temp, high_temp, critical_temp = get_cpu_temp()
17+
cpu_core = get_cached_value("cpu_core", get_cpu_core_count)
1218
system_info = {
13-
"cpu_core": get_cpu_core_count(),
19+
"cpu_core": cpu_core,
1420
"cpu_frequency": get_cpu_frequency(),
1521
"cpu_percent": cpu_usage_percent(),
1622
"current_temp": current_temp,

src/routes/disk_info.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@
33
from flask import render_template, blueprints
44

55
from src.config import app
6+
from src.utils import get_cached_value, get_disk_free, get_disk_total, get_disk_used, get_disk_usage_percent
7+
from src.models import DashboardSettings
68

79
disk_info_bp = blueprints.Blueprint("disk_usage", __name__)
810

911
@app.route("/disk_usage")
1012
def disk_usage():
13+
settings = DashboardSettings.query.first()
14+
if not settings.is_disk_info_enabled:
15+
return render_template("error/404.html")
16+
disk_total = get_cached_value("disk_total", get_disk_total)
1117
system_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
18+
"disk_usage": get_disk_usage_percent(),
19+
"disk_total": disk_total,
20+
"disk_used": get_disk_used(),
21+
"disk_free": get_disk_free(),
1622
}
1723
return render_template("disk_info.html", system_info=system_info)
1824

src/routes/homepage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import datetime
2-
from flask import render_template, blueprints
2+
from flask import render_template, blueprints, session
33

44
from src.config import app
55
from src.models import SpeedTestResult, DashboardSettings, SystemInfo

src/routes/memory_info.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
import psutil
22
from flask import render_template, blueprints
33

4-
from src.utils import swap_memory_info
5-
64
from src.config import app
5+
from src.utils import get_cached_value, get_memory_percent, get_memory_available, get_memory_used, get_swap_memory_info
6+
from src.models import DashboardSettings
77

88
memory_info_bp = blueprints.Blueprint("memory_usage", __name__)
99

10+
1011
@app.route("/memory_usage")
1112
def memory_usage():
12-
total_swap, used_swap, free_swap = swap_memory_info()
13+
settings = DashboardSettings.query.first()
14+
if not settings.is_memory_info_enabled:
15+
return render_template("error/404.html")
16+
memory_available = get_cached_value("memory_available", get_memory_available)
1317
system_info = {
14-
"memory_percent": psutil.virtual_memory().percent,
15-
"memory_available": round(
16-
psutil.virtual_memory().available / (1024**3), 2
17-
), # In GB
18-
"memory_used": round(psutil.virtual_memory().used / (1024**3), 2), # In GB,
19-
"total_swap": round(total_swap / (1024**3), 2), # In GB
20-
"used_swap": round(used_swap / (1024**3), 2), # In GB
21-
"free_swap": round(free_swap / (1024**3), 2), # In GB
18+
"memory_percent": get_memory_percent(),
19+
"memory_available": memory_available,
20+
"memory_used": get_memory_used(),
2221
}
22+
23+
swap_info = get_swap_memory_info()
24+
system_info.update(swap_info)
25+
2326
return render_template("memory_info.html", system_info=system_info)

src/routes/network_info.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33

44
from src.config import app
55
from src.utils import get_established_connections
6+
from src.models import DashboardSettings
7+
68
network_info_bp = blueprints.Blueprint("network_stats", __name__)
79

810
@app.route("/network_stats")
911
def network_stats():
12+
settings = DashboardSettings.query.first()
13+
if not settings.is_network_info_enabled:
14+
return render_template("error/404.html")
1015
net_io = psutil.net_io_counters()
1116
ipv4_ip, ipv6_ip = get_established_connections()
1217
system_info = {

src/routes/process.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
from flask_login import login_required, current_user
44
from src.config import app
55
from src.utils import get_top_processes
6+
from src.models import DashboardSettings
67

78
process_bp = blueprints.Blueprint("process", __name__)
89

910
@app.route("/process", methods=["GET", "POST"])
1011
@login_required
1112
def process():
13+
settings = DashboardSettings.query.first()
14+
if not settings.is_process_info_enabled:
15+
return render_template("error/404.html")
1216
if current_user.user_level != "admin":
1317
flash("You do not have permission to view this page.", "danger")
1418
return redirect(url_for("dashboard"))

src/routes/settings.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,42 @@
11
from flask import render_template, request, flash, blueprints
2-
32
from src.config import app, db
43
from src.models import DashboardSettings
54

65
settings_bp = blueprints.Blueprint("settings", __name__)
76

87
@app.route("/settings", methods=["GET", "POST"])
98
def settings():
10-
# Fetch the settings from the database and update them
9+
# Fetch the settings from the database
1110
settings = DashboardSettings.query.first()
1211
if settings:
1312
if request.method == "POST":
13+
# Update settings from the form inputs
1414
settings.speedtest_cooldown = int(request.form["speedtest_cooldown"])
1515
settings.number_of_speedtests = int(request.form["number_of_speedtests"])
1616
settings.timezone = request.form["timezone"]
17+
settings.is_cpu_info_enabled = "is_cpu_info_enabled" in request.form
18+
settings.is_memory_info_enabled = "is_memory_info_enabled" in request.form
19+
settings.is_disk_info_enabled = "is_disk_info_enabled" in request.form
20+
settings.is_network_info_enabled = "is_network_info_enabled" in request.form
21+
settings.is_process_info_enabled = "is_process_info_enabled" in request.form
22+
settings.enable_cache = "enable_cache" in request.form
23+
24+
# <!-- is_user_card_enabled -->
25+
settings.is_user_card_enabled = "is_user_card_enabled" in request.form
26+
settings.is_server_card_enabled = "is_server_card_enabled" in request.form
27+
settings.is_battery_card_enabled = "is_battery_card_enabled" in request.form
28+
settings.is_cpu_core_card_enabled = "is_cpu_core_card_enabled" in request.form
29+
settings.is_cpu_usage_card_enabled = "is_cpu_usage_card_enabled" in request.form
30+
settings.is_cpu_temp_card_enabled = "is_cpu_temp_card_enabled" in request.form
31+
settings.is_dashboard_memory_card_enabled = "is_dashboard_memory_card_enabled" in request.form
32+
settings.is_memory_usage_card_enabled = "is_memory_usage_card_enabled" in request.form
33+
settings.is_disk_usage_card_enabled = "is_disk_usage_card_enabled" in request.form
34+
settings.is_system_uptime_card_enabled = "is_system_uptime_card_enabled" in request.form
35+
settings.is_network_statistic_card_enabled = "is_network_statistic_card_enabled" in request.form
36+
settings.is_speedtest_enabled = "is_speedtest_enabled" in request.form
37+
38+
# Commit the changes to the database
1739
db.session.commit()
1840
flash("Settings updated successfully!", "success")
41+
1942
return render_template("settings.html", settings=settings)
20-

src/scripts/locustfile.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import os
2+
13
from locust import HttpUser, TaskSet, task, between
24
from locust.exception import StopUser
35

@@ -44,5 +46,4 @@ class WebsiteUser(HttpUser):
4446
wait_time = between(1, 5) # Time to wait between tasks
4547

4648
if __name__ == "__main__":
47-
import os
48-
# os.system("locust -f locustfile.py --host=http://localhost:5000")
49+
os.system("locust -f locustfile.py --host=http://localhost:5000")

0 commit comments

Comments
 (0)