Add server status api

This commit is contained in:
Iam54r1n4
2025-01-26 08:21:26 +00:00
parent bcb985c32c
commit 593dccfd2e
4 changed files with 72 additions and 0 deletions

View File

@ -1,6 +1,8 @@
from fastapi import APIRouter
from . import user
from . import server
api_v1_router = APIRouter()
api_v1_router.include_router(user.router, prefix='/users')
api_v1_router.include_router(server.router, prefix='/server')

View File

@ -1 +1,2 @@
from . import user
from . import server

View File

@ -0,0 +1,16 @@
from pydantic import BaseModel
# We can't return bytes because the underlying script is returning human readable values which are hard to parse it
# It's better to chnage the underlying script to return bytes instead of changing it here
# Because of this problem we use str type instead of int as type
class ServerStatusResponse(BaseModel):
# disk_usage: int
cpu_usage: str
total_ram: str
ram_usage: str
online_users: int
uploaded_traffic: str
downloaded_traffic: str
total_traffic: str

View File

@ -0,0 +1,53 @@
from fastapi import APIRouter, HTTPException
import cli_api
from .schema.server import ServerStatusResponse
router = APIRouter()
@router.get('/status', response_model=ServerStatusResponse)
async def server_status():
try:
if res := cli_api.server_info():
return __parse_server_status(res)
raise HTTPException(status_code=404, detail='Server information not available.')
except Exception as e:
raise HTTPException(status_code=400, detail=f'Error: {str(e)}')
def __parse_server_status(server_info: str) -> ServerStatusResponse:
data = {}
for line in server_info.splitlines():
key, _, value = line.partition(":")
key = key.strip().lower()
value = value.strip()
if not key or not value:
continue # Skip empty or malformed lines
try:
if 'cpu usage' in key:
data['cpu_usage'] = value
elif 'total ram' in key:
data['total_ram'] = value
elif 'used ram' in key:
data['ram_usage'] = value
elif 'online users' in key:
data['online_users'] = int(value)
elif 'uploaded traffic' in key:
value = value.replace(' ', '')
data['uploaded_traffic'] = value
elif "downloaded traffic" in key:
value = value.replace(' ', '')
data['downloaded_traffic'] = value
elif 'total traffic' in key:
value = value.replace(' ', '')
data["total_traffic"] = value
except ValueError as e:
raise ValueError(f'Error parsing line \'{line}\': {e}')
# Validate required fields
try:
return ServerStatusResponse(**data)
except Exception as e:
raise ValueError(f'Invalid or incomplete server info: {e}')