Another quick snapshot in case something breaks again. There are issues with this new agent bridge and the psutil and Gemini CLI. Not sure, but it causes problems.
This commit is contained in:
14
app/main.py
14
app/main.py
@@ -121,11 +121,15 @@ app.include_router(
|
|||||||
prefix='/v3/crud',
|
prefix='/v3/crud',
|
||||||
tags=['CRUD v3'],
|
tags=['CRUD v3'],
|
||||||
)
|
)
|
||||||
# app.include_router(
|
|
||||||
# agent_bridge.router,
|
# Deferred import to avoid circular dependencies and ensure environment is ready
|
||||||
# prefix='/agent',
|
from app.routers import agent_bridge
|
||||||
# tags=['Agent Bridge'],
|
app.include_router(
|
||||||
# )
|
agent_bridge.router,
|
||||||
|
prefix='/agent',
|
||||||
|
tags=['Agent Bridge'],
|
||||||
|
)
|
||||||
|
|
||||||
app.include_router(
|
app.include_router(
|
||||||
api.router,
|
api.router,
|
||||||
prefix='/api',
|
prefix='/api',
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ from fastapi import APIRouter, Depends, HTTPException, Query
|
|||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
import json
|
import json
|
||||||
import psutil
|
|
||||||
import shutil
|
import shutil
|
||||||
from typing import Dict, Any, List, Optional
|
from typing import Dict, Any, List, Optional
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -31,6 +30,13 @@ async def get_container_status(
|
|||||||
if not is_admin(account):
|
if not is_admin(account):
|
||||||
raise HTTPException(status_code=403, detail="Administrative access required.")
|
raise HTTPException(status_code=403, detail="Administrative access required.")
|
||||||
|
|
||||||
|
boot_time = None
|
||||||
|
try:
|
||||||
|
import psutil
|
||||||
|
boot_time = datetime.fromtimestamp(psutil.boot_time()).isoformat()
|
||||||
|
except Exception as e:
|
||||||
|
boot_time = f"Error: {str(e)}"
|
||||||
|
|
||||||
status_data = {
|
status_data = {
|
||||||
"os": platform.system(),
|
"os": platform.system(),
|
||||||
"release": platform.release(),
|
"release": platform.release(),
|
||||||
@@ -40,7 +46,7 @@ async def get_container_status(
|
|||||||
"environment_vars": {k: v for k, v in os.environ.items() if not any(s in k.upper() for s in ["PASSWORD", "KEY", "SECRET", "AUTH", "TOKEN"])},
|
"environment_vars": {k: v for k, v in os.environ.items() if not any(s in k.upper() for s in ["PASSWORD", "KEY", "SECRET", "AUTH", "TOKEN"])},
|
||||||
"cwd": os.getcwd(),
|
"cwd": os.getcwd(),
|
||||||
"container": os.path.exists('/.dockerenv'),
|
"container": os.path.exists('/.dockerenv'),
|
||||||
"boot_time": datetime.fromtimestamp(psutil.boot_time()).isoformat()
|
"boot_time": boot_time
|
||||||
}
|
}
|
||||||
|
|
||||||
return mk_resp(data=status_data)
|
return mk_resp(data=status_data)
|
||||||
@@ -56,34 +62,49 @@ async def get_system_usage(
|
|||||||
if not is_admin(account):
|
if not is_admin(account):
|
||||||
raise HTTPException(status_code=403, detail="Administrative access required.")
|
raise HTTPException(status_code=403, detail="Administrative access required.")
|
||||||
|
|
||||||
# CPU usage per core
|
cpu_data = {"error": "psutil not available"}
|
||||||
cpu_percent = psutil.cpu_percent(interval=0.1, percpu=True)
|
mem_data = {"error": "psutil not available"}
|
||||||
|
|
||||||
# Memory usage
|
try:
|
||||||
mem = psutil.virtual_memory()
|
import psutil
|
||||||
|
# CPU usage per core
|
||||||
# Disk usage (root)
|
cpu_percent = psutil.cpu_percent(interval=0.1, percpu=True)
|
||||||
disk = shutil.disk_usage("/")
|
cpu_data = {
|
||||||
|
|
||||||
usage_data = {
|
|
||||||
"cpu": {
|
|
||||||
"percent_avg": sum(cpu_percent) / len(cpu_percent) if cpu_percent else 0,
|
"percent_avg": sum(cpu_percent) / len(cpu_percent) if cpu_percent else 0,
|
||||||
"percent_per_core": cpu_percent,
|
"percent_per_core": cpu_percent,
|
||||||
"count": psutil.cpu_count(),
|
"count": psutil.cpu_count(),
|
||||||
"load_avg": os.getloadavg() if hasattr(os, 'getloadavg') else None
|
"load_avg": os.getloadavg() if hasattr(os, 'getloadavg') else None
|
||||||
},
|
}
|
||||||
"memory": {
|
|
||||||
|
# Memory usage
|
||||||
|
mem = psutil.virtual_memory()
|
||||||
|
mem_data = {
|
||||||
"total": mem.total,
|
"total": mem.total,
|
||||||
"available": mem.available,
|
"available": mem.available,
|
||||||
"percent": mem.percent,
|
"percent": mem.percent,
|
||||||
"used": mem.used
|
"used": mem.used
|
||||||
},
|
}
|
||||||
"disk": {
|
except Exception as e:
|
||||||
|
cpu_data = {"error": str(e)}
|
||||||
|
mem_data = {"error": str(e)}
|
||||||
|
|
||||||
|
# Disk usage (root) - uses shutil which is standard lib
|
||||||
|
disk_data = {}
|
||||||
|
try:
|
||||||
|
disk = shutil.disk_usage("/")
|
||||||
|
disk_data = {
|
||||||
"total": disk.total,
|
"total": disk.total,
|
||||||
"used": disk.used,
|
"used": disk.used,
|
||||||
"free": disk.free,
|
"free": disk.free,
|
||||||
"percent": (disk.used / disk.total) * 100 if disk.total else 0
|
"percent": (disk.used / disk.total) * 100 if disk.total else 0
|
||||||
}
|
}
|
||||||
|
except Exception as e:
|
||||||
|
disk_data = {"error": str(e)}
|
||||||
|
|
||||||
|
usage_data = {
|
||||||
|
"cpu": cpu_data,
|
||||||
|
"memory": mem_data,
|
||||||
|
"disk": disk_data
|
||||||
}
|
}
|
||||||
|
|
||||||
return mk_resp(data=usage_data)
|
return mk_resp(data=usage_data)
|
||||||
@@ -172,13 +193,17 @@ async def list_processes(
|
|||||||
raise HTTPException(status_code=403, detail="Administrative access required.")
|
raise HTTPException(status_code=403, detail="Administrative access required.")
|
||||||
|
|
||||||
procs = []
|
procs = []
|
||||||
for proc in psutil.process_iter(['pid', 'name', 'username', 'cpu_percent', 'memory_info']):
|
try:
|
||||||
try:
|
import psutil
|
||||||
pinfo = proc.info
|
for proc in psutil.process_iter(['pid', 'name', 'username', 'cpu_percent', 'memory_info']):
|
||||||
pinfo['memory_rss'] = pinfo['memory_info'].rss if pinfo.get('memory_info') else 0
|
try:
|
||||||
procs.append(pinfo)
|
pinfo = proc.info
|
||||||
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
pinfo['memory_rss'] = pinfo['memory_info'].rss if pinfo.get('memory_info') else 0
|
||||||
pass
|
procs.append(pinfo)
|
||||||
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||||
|
pass
|
||||||
|
except Exception as e:
|
||||||
|
return mk_resp(data=[], status_message=f"Error listing processes: {str(e)}", status_code=500)
|
||||||
|
|
||||||
if sort_by == "cpu":
|
if sort_by == "cpu":
|
||||||
procs.sort(key=lambda x: x['cpu_percent'], reverse=True)
|
procs.sort(key=lambda x: x['cpu_percent'], reverse=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user