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:
Scott Idem
2026-01-07 13:10:16 -05:00
parent 7fb2f00846
commit 270712f905
2 changed files with 58 additions and 29 deletions

View File

@@ -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',

View File

@@ -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)