Skip to content

Commit e742c57

Browse files
chore: process page improved and load testing scritp added
1 parent eb693e6 commit e742c57

File tree

11 files changed

+162
-75
lines changed

11 files changed

+162
-75
lines changed

app.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,20 @@ def register_routes():
55
app.register_blueprint(routes.homepage_bp)
66
app.register_blueprint(routes.settings_bp)
77
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)
8+
app.register_blueprint(routes.cpu_info_bp)
9+
app.register_blueprint(routes.disk_info_bp)
10+
app.register_blueprint(routes.memory_info_bp)
11+
app.register_blueprint(routes.network_info_bp)
1212
app.register_blueprint(routes.speedtest_bp)
1313
app.register_blueprint(routes.process_bp)
1414

1515

16-
17-
1816
if __name__ == "__main__":
17+
register_routes()
18+
19+
# # Start the memory-consuming program in a separate thread
20+
# memory_thread = threading.Thread(target=memory_consuming_program, daemon=True)
21+
# memory_thread.start()
22+
23+
# Run the Flask application
1924
app.run(host="0.0.0.0", port=5000, debug=True)

locustfile.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from locust import HttpUser, TaskSet, task, between
2+
from locust.exception import StopUser
3+
4+
class UserBehavior(TaskSet):
5+
6+
def on_start(self):
7+
""" Called when a Locust user starts running """
8+
self.login()
9+
10+
def login(self):
11+
""" Simulate a user logging in """
12+
response = self.client.post("/login", {
13+
"username": "admin",
14+
"password": "adminpassword"
15+
})
16+
if response.status_code == 200 and "Invalid username or password" not in response.text:
17+
print("Login successful")
18+
else:
19+
print("Login failed")
20+
raise StopUser("Login failed")
21+
22+
@task(1)
23+
def view_dashboard(self):
24+
""" Simulate viewing the dashboard """
25+
self.client.get("/")
26+
27+
@task(2)
28+
def view_cpu_usage(self):
29+
""" Simulate viewing CPU usage """
30+
self.client.get("/cpu_usage")
31+
32+
@task(1)
33+
def view_disk_usage(self):
34+
""" Simulate viewing disk usage """
35+
self.client.get("/disk_usage")
36+
37+
@task(1)
38+
def view_memory_usage(self):
39+
""" Simulate viewing memory usage """
40+
self.client.get("/memory_usage")
41+
42+
class WebsiteUser(HttpUser):
43+
tasks = [UserBehavior]
44+
wait_time = between(1, 5) # Time to wait between tasks
45+
46+
if __name__ == "__main__":
47+
import os
48+
os.system("locust -f locustfile.py --host=http://localhost:5000")

src/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class SystemInfo(db.Model):
4848
ipv4_connections = db.Column(db.String(50))
4949
dashboard_memory_usage = db.Column(db.String(50))
5050
timestamp = db.Column(db.DateTime, default=datetime.datetime.now())
51+
cpu_frequency = db.Column(db.String(50))
52+
current_temp = db.Column(db.String(50))
5153

5254
def __repr__(self):
5355
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}>"

src/routes/homepage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from flask import render_template, blueprints
33

44
from src.config import app
5-
from src.models import SpeedTestResult, DashboardSettings
5+
from src.models import SpeedTestResult, DashboardSettings, SystemInfo
66
from src.utils import datetimeformat, get_system_info
77

88
homepage_bp = blueprints.Blueprint("homepage", __name__)

src/routes/process.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import os
2-
from flask import request, render_template, blueprints, redirect, url_for, flash
2+
from flask import request, render_template, redirect, url_for, flash, session, blueprints
33
from flask_login import login_required, current_user
4-
54
from src.config import app
65
from src.utils import get_top_processes
76

@@ -14,11 +13,14 @@ def process():
1413
flash("You do not have permission to view this page.", "danger")
1514
return redirect(url_for("dashboard"))
1615

17-
number_of_processes = 5 # Default number
16+
# Retrieve number of processes from session or set default
17+
number_of_processes = session.get('number_of_processes', 50)
18+
sort_by = request.args.get('sort', 'cpu') # Default to sort by CPU usage
19+
order = request.args.get('order', 'asc') # Default to ascending order
20+
toggle_order = 'desc' if order == 'asc' else 'asc' # Toggle order for next click
1821

1922
if request.method == "POST":
2023
if "kill_pid" in request.form:
21-
# Handle killing the process
2224
pid_to_kill = request.form.get("kill_pid")
2325
process_name = request.form.get("process_name")
2426
try:
@@ -29,7 +31,18 @@ def process():
2931
return redirect(url_for("process")) # Refresh the page after killing process
3032

3133
# Handle the number of processes to display
32-
number_of_processes = int(request.form.get("number", 5))
34+
number_of_processes = int(request.form.get("number", 50))
35+
session['number_of_processes'] = number_of_processes # Store the number in session
3336

37+
# Retrieve processes
3438
top_processes = get_top_processes(number_of_processes)
35-
return render_template("process.html", processes=top_processes, number=number_of_processes)
39+
40+
# Sorting logic based on selected criteria
41+
if sort_by == 'cpu':
42+
top_processes.sort(key=lambda x: x[1], reverse=(order == 'desc'))
43+
elif sort_by == 'memory':
44+
top_processes.sort(key=lambda x: x[2], reverse=(order == 'desc'))
45+
elif sort_by == 'name':
46+
top_processes.sort(key=lambda x: x[0], reverse=(order == 'desc'))
47+
48+
return render_template("process.html", processes=top_processes, number=number_of_processes, toggle_order=toggle_order)

src/static/css/process.css

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,105 @@
11
body {
2-
font-family: Arial, sans-serif;
3-
background-color: #f4f4f4;
2+
font-family: 'Roboto', sans-serif; /* Use a modern font */
3+
background-color: #f8f9fa; /* Light gray background for contrast */
44
margin: 0;
55
padding: 0;
6+
color: #212529; /* Dark gray text for readability */
67
}
78

89
.container {
9-
width: 80%;
10-
margin: 20px auto;
11-
padding: 20px;
12-
background-color: white;
13-
border-radius: 8px;
14-
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
10+
max-width: 1200px; /* Limit the maximum width */
11+
margin: 40px auto; /* Increased margin for spacing */
12+
padding: 30px; /* More padding for content */
13+
background-color: #ffffff; /* White background for content */
14+
border-radius: 10px; /* Slightly rounded corners */
15+
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); /* Subtle shadow for depth */
1516
}
1617

1718
h1 {
18-
color: #333;
19+
color: #343a40; /* Darker shade for the heading */
1920
text-align: center;
21+
margin-bottom: 20px;
22+
font-weight: 700; /* Bolder font */
2023
}
2124

2225
.form-control {
23-
margin-bottom: 20px;
26+
margin-bottom: 25px; /* Consistent spacing */
2427
display: flex;
2528
justify-content: center;
2629
align-items: center;
30+
gap: 10px; /* Modern spacing with gap */
2731
}
2832

2933
label {
30-
margin-right: 10px;
34+
font-weight: 500; /* Medium font weight for labels */
3135
}
3236

3337
input[type="number"] {
34-
width: 60px;
35-
padding: 5px;
36-
margin-right: 10px;
38+
width: 80px; /* Slightly wider input */
39+
padding: 8px;
40+
border: 1px solid #ced4da; /* Light border */
41+
border-radius: 5px;
42+
transition: border-color 0.3s; /* Smooth transition on focus */
43+
}
44+
45+
input[type="number"]:focus {
46+
border-color: #007bff; /* Blue border on focus */
47+
outline: none;
3748
}
3849

3950
button {
40-
padding: 5px 15px;
41-
background-color: #007bff;
42-
color: white;
51+
padding: 8px 20px;
52+
background-color: #007bff; /* Primary color */
53+
color: #ffffff; /* White text */
4354
border: none;
44-
border-radius: 4px;
55+
border-radius: 5px;
4556
cursor: pointer;
57+
transition: background-color 0.3s, transform 0.2s; /* Smooth transitions */
4658
}
4759

4860
button:hover {
49-
background-color: #0056b3;
61+
background-color: #0056b3; /* Darker blue on hover */
62+
transform: translateY(-2px); /* Lift effect */
5063
}
51-
5264
table {
5365
width: 100%;
5466
border-collapse: collapse;
5567
margin-top: 20px;
68+
font-size: 0.9rem;
5669
}
5770

5871
th, td {
59-
padding: 10px;
60-
border-bottom: 1px solid #ddd;
72+
padding: 12px 15px;
73+
border-bottom: 1px solid #dee2e6;
6174
text-align: left;
6275
}
6376

6477
th {
65-
background-color: #007bff;
66-
color: white;
78+
background-color: #0056b3; /* Darker blue for better contrast */
79+
color: #ffffff; /* White text for visibility */
80+
font-weight: 600; /* Slightly bolder text */
81+
text-transform: uppercase; /* Uppercase for a modern touch */
82+
position: sticky; /* Sticky header for better navigation */
83+
top: 0;
84+
padding: 15px 10px; /* More padding for a balanced look */
85+
letter-spacing: 0.5px; /* Slight letter spacing for readability */
6786
}
6887

6988
tr:hover {
70-
background-color: #f1f1f1;
89+
background-color: #f1f3f5; /* Light gray on row hover */
7190
}
91+
92+
td button {
93+
background-color: #dc3545;
94+
border-radius: 5px;
95+
transition: background-color 0.3s, transform 0.2s;
96+
}
97+
98+
td button:hover {
99+
background-color: #c82333;
100+
transform: translateY(-2px);
101+
}
102+
103+
.name {
104+
color: #ffffff; /* White text for visibility */
105+
}

src/templates/cpu_info.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
{% extends 'base.html' %}{% block title %}CPU Usage Details{% endblock %}{% block content %}<h2 class="my-4">CPU Details</h2><div class="container mt-4"><div class="row">{% include 'dasbhboard_comp/cpu/core.html' %} {% include 'dasbhboard_comp/cpu/frequency.html' %} {% include 'dasbhboard_comp/cpu/usages.html' %} {% include 'dasbhboard_comp/cpu/current_temp.html' %} {% include 'dasbhboard_comp/cpu/highest_temp.html' %} {% include 'dasbhboard_comp/cpu/critical_temp.html' %} </div></div>{% endblock %}
1+
{% extends 'base.html' %}{% block title %}CPU Usage Details{% endblock %}{% block content %}<h2 class="my-4">CPU Details
2+
</h2>
3+
<div class="container mt-4">
4+
<div class="row">{% include 'dasbhboard_comp/cpu/core.html' %} {% include 'dasbhboard_comp/cpu/frequency.html' %} {%
5+
include 'dasbhboard_comp/cpu/usages.html' %} {% include 'dasbhboard_comp/cpu/current_temp.html' %} {% include
6+
'dasbhboard_comp/cpu/highest_temp.html' %} {% include 'dasbhboard_comp/cpu/critical_temp.html' %} </div>
7+
</div>{% endblock %}

src/templates/ext/navbar.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@
5454
<i class="fas fa-sign-out-alt mr-1"></i>Logout
5555
</a>
5656
</li>
57+
<li class="nav-item">
58+
<a class="nav-link" href="{{ url_for('dashboard') }}">
59+
<i class="fas fa-user-alt mr-1"></i>{{current_user.username}}
60+
</a>
61+
</li>
5762
{% else %}
5863
<li class="nav-item">
5964
<a class="nav-link {% if request.endpoint == 'login' %}active{% endif %}"

src/templates/process.html

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,23 @@
66
{% block content %}
77
<div class="container">
88
<h1>Top Processes by Memory Usage</h1>
9-
9+
1010
<!-- Display flash messages -->
1111
{% include 'ext/message.html' %}
12-
12+
1313
<form method="post" class="form-control">
1414
<label for="number">Number of Processes:</label>
1515
<input type="number" id="number" name="number" min="1" value="{{ number }}">
1616
<button type="submit">Show</button>
1717
</form>
18-
19-
<table>
18+
19+
<table class="table">
2020
<thead>
2121
<tr>
22-
<th>Process Name</th>
23-
<th>CPU Usage (%)</th>
24-
<th>Memory Usage (%)</th>
22+
<th><a href="{{ url_for('process', sort='name', order=toggle_order) }}">Process Name</a></th>
23+
<th><a href="{{ url_for('process', sort='cpu', order=toggle_order) }}">CPU Usage (%)</a></th>
24+
<th><a href="{{ url_for('process', sort='memory', order=toggle_order) }}">Memory Usage (%)</a></th>
25+
<th>Process ID</th>
2526
<th>Action</th>
2627
</tr>
2728
</thead>
@@ -31,6 +32,7 @@ <h1>Top Processes by Memory Usage</h1>
3132
<td>{{ process[0] }}</td>
3233
<td>{{ process[1] }}</td>
3334
<td>{{ process[2] }}</td>
35+
<td>{{ process[3] }}</td>
3436
<td>
3537
<form method="post">
3638
<input type="hidden" name="kill_pid" value="{{ process[3] }}">

src/utils.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def get_cpu_core_count():
9090
return psutil.cpu_count(logical=True)
9191

9292
def cpu_usage_percent():
93-
return round(psutil.cpu_percent(interval=1), 2)
93+
return psutil.cpu_percent(interval=1)
9494

9595
def get_cpu_temp():
9696
temp = psutil.sensors_temperatures().get('coretemp', [{'current': 'N/A'}])[0]
@@ -99,7 +99,6 @@ def get_cpu_temp():
9999
critical_temp = temp.critical
100100
return current_temp, high_temp, critical_temp
101101

102-
import psutil
103102

104103
def get_top_processes(number=5):
105104
"""Get the top processes by memory usage."""

tmp.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)