feat: 实现 OpenClaw Mission Control 仪表盘框架
- 创建 API Blueprint 模块结构 - 实现系统状态 API (CPU/内存/磁盘/进程) - 实现服务状态 API - 创建仪表盘页面模板 - 添加仪表盘 CSS 样式 - 添加仪表盘 JavaScript 交互 - 登录后自动跳转到仪表盘
This commit is contained in:
104
api/status.py
Normal file
104
api/status.py
Normal file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
系统状态 API
|
||||
作者:小白 🐶
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import psutil
|
||||
from flask import jsonify
|
||||
from . import api
|
||||
|
||||
@api.route('/status')
|
||||
def get_status():
|
||||
"""获取系统状态"""
|
||||
try:
|
||||
# CPU 使用率
|
||||
cpu_percent = psutil.cpu_percent(interval=1)
|
||||
|
||||
# 内存使用
|
||||
memory = psutil.virtual_memory()
|
||||
memory_percent = memory.percent
|
||||
memory_used = round(memory.used / (1024**3), 2)
|
||||
memory_total = round(memory.total / (1024**3), 2)
|
||||
|
||||
# 磁盘使用
|
||||
disk = psutil.disk_usage('/')
|
||||
disk_percent = disk.percent
|
||||
disk_used = round(disk.used / (1024**3), 2)
|
||||
disk_total = round(disk.total / (1024**3), 2)
|
||||
|
||||
# 系统运行时间
|
||||
uptime_seconds = psutil.boot_time()
|
||||
|
||||
# 进程数
|
||||
process_count = len(psutil.pids())
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': {
|
||||
'cpu': {
|
||||
'percent': cpu_percent
|
||||
},
|
||||
'memory': {
|
||||
'percent': memory_percent,
|
||||
'used': memory_used,
|
||||
'total': memory_total,
|
||||
'unit': 'GB'
|
||||
},
|
||||
'disk': {
|
||||
'percent': disk_percent,
|
||||
'used': disk_used,
|
||||
'total': disk_total,
|
||||
'unit': 'GB'
|
||||
},
|
||||
'process_count': process_count,
|
||||
'uptime': uptime_seconds
|
||||
}
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': str(e)
|
||||
})
|
||||
|
||||
@api.route('/status/services')
|
||||
def get_services():
|
||||
"""获取服务状态"""
|
||||
services = []
|
||||
|
||||
# 检查各服务状态
|
||||
service_list = [
|
||||
('Flask', 5000),
|
||||
('思源笔记', 6806),
|
||||
('Gitea', 3000),
|
||||
('NocoDB', 8080),
|
||||
('Memory Viewer', 18798)
|
||||
]
|
||||
|
||||
for name, port in service_list:
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['ss', '-tln'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=5
|
||||
)
|
||||
is_running = f':{port}' in result.stdout
|
||||
services.append({
|
||||
'name': name,
|
||||
'port': port,
|
||||
'status': 'running' if is_running else 'stopped'
|
||||
})
|
||||
except:
|
||||
services.append({
|
||||
'name': name,
|
||||
'port': port,
|
||||
'status': 'unknown'
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': services
|
||||
})
|
||||
Reference in New Issue
Block a user