v0.4+v0.5: TUI dashboard, tab completion, systemd, Docker, process isolation

- New: services/sysmon_widget.py (CPU/MEM/DISK/NET real-time)
- Enhanced: tui_service.py (4-section layout, plugin status panel)
- Enhanced: command_service.py + tui (Tab completion)
- New: deploy/sensu.service (systemd)
- New: deploy/Dockerfile (Alpine, 4200+4240)
- New: services/process_isolated.py (multiprocess plugin isolation)
- Tests: 23/23 passing
This commit is contained in:
2026-06-10 19:08:16 +08:00
parent d48ef65b35
commit 4b26b6f086
5 changed files with 219 additions and 0 deletions
+37
View File
@@ -9,6 +9,7 @@ from textual.app import App
from textual.containers import Container, ScrollableContainer
from textual.widgets import Static, Input, Header, Footer
from textual.reactive import reactive
from services.sysmon_widget import SysMonWidget
from typing import List, Dict
import asyncio
from datetime import datetime
@@ -658,6 +659,42 @@ class TUIFramework(App):
except Exception as e:
print(f"❌ 关闭TUI时出错: {str(e)}")
def _start_plugin_status_refresh(self):
async def refresh():
while True:
try:
ps = self.service_manager.get_service("plugin")
if ps and hasattr(ps, "plugin_status"):
lines = []
for name, status in ps.plugin_status.items():
icon = {"running":"🟢","error":"🔴","loading":"🟡","unloaded":""}.get(str(status),"")
lines.append(f"{icon} {name}: {status}")
widget = self.tui_app.query_one(SysMonWidget)
widget.update_plugins("\n".join(lines) if lines else "无已加载插件")
except: pass
await asyncio.sleep(3)
import asyncio
asyncio.create_task(refresh())
def _get_suggester(self):
from textual.suggester import Suggester
class CmdSuggester(Suggester):
async def get_suggestion(self, value):
try:
cs = self.app.query_one("#input-area").app
names = ["help","status","history","testlog","netdiag",
"permissions","pmpending","pmhelp","echo","plugin_status",
"scroll","autoscroll","create-plugin","exit","quit"]
if not value: return None
for n in names:
if n.startswith(value) and n != value:
return n
except: pass
return None
return CmdSuggester()
class TuiService:
"""TUI服务"""