1from typing import Union
2
3from fastapi import APIRouter
4
5from app import __version__
6from app.db import crud
7from app.dependencies import DBDep, AdminDep
8from app.models.admin import Admin
9from app.models.system import SystemStats
10from app.models.user import UserStatus
11from app.utils.system import memory_usage, cpu_usage, realtime_bandwidth
12
13router = APIRouter(tags=["System"])
14
15
16@router.get("/system", response_model=SystemStats)
17def get_system_stats(db: DBDep, admin: AdminDep):
18 mem = memory_usage()
19 cpu = cpu_usage()
20 system = crud.get_system_usage(db)
21 dbadmin: Union[Admin, None] = crud.get_admin(db, admin.username)
22
23 total_user = crud.get_users_count(db, admin=dbadmin if not admin.is_sudo else None)
24 users_active = crud.get_users_count(
25 db, status=UserStatus.active, admin=dbadmin if not admin.is_sudo else None
26 )
27 realtime_bandwidth_stats = realtime_bandwidth()
28
29 return SystemStats(
30 version=__version__,
31 mem_total=mem.total,
32 mem_used=mem.used,
33 cpu_cores=cpu.cores,
34 cpu_usage=cpu.percent,
35 total_user=total_user,
36 users_active=users_active,
37 incoming_bandwidth=system.uplink,
38 outgoing_bandwidth=system.downlink,
39 incoming_bandwidth_speed=realtime_bandwidth_stats.incoming_bytes,
40 outgoing_bandwidth_speed=realtime_bandwidth_stats.outgoing_bytes,
41 )