#!/usr/bin/env node /** * 跨平台服务列表工具 * 用法: node scripts/service-list.js [running|stopped] [server] * 示例: * node scripts/service-list.js # 列出所有服务 * node scripts/service-list.js running # 只列出运行中的 * node scripts/service-list.js running docker # 只列出运行中的 docker 服务 */ import { ServiceRouter } from '../dist/services/router.js'; import { ConfigManager } from '../dist/config/manager.js'; async function main() { const statusFilter = process.argv[2]; const serverFilter = process.argv[3]; const configManager = new ConfigManager(); const router = new ServiceRouter(configManager); try { const allServices = await router.list({ status: statusFilter as 'running' | 'stopped' | undefined, server: serverFilter }); console.log('═══════════════════════════════════════════════════════════'); console.log(` 服务列表 (共 ${allServices.length} 个)`); if (statusFilter) console.log(` 状态筛选: ${statusFilter}`); if (serverFilter) console.log(` 服务器筛选: ${serverFilter}`); console.log('═══════════════════════════════════════════════════════════\n'); // 按类型分组 const byType: Record = { docker: [], k3s: [], systemd: [] }; for (const svc of allServices) { byType[svc.type]?.push(svc); } // Docker 容器 if (byType.docker.length > 0) { const running = byType.docker.filter(s => s.status === 'running').length; console.log(`\n🐳 Docker 容器 (${byType.docker.length} 个, ${running} 运行中)`); const byServer: Record = {}; for (const svc of byType.docker) { if (!byServer[svc.server]) byServer[svc.server] = []; byServer[svc.server].push(svc); } for (const [server, services] of Object.entries(byServer)) { console.log(`\n 📦 ${server}:`); for (const svc of services) { const status = svc.status === 'running' ? '✅' : '⏸️ '; console.log(` ${status} ${svc.name}`); } } } // K3s Pods if (byType.k3s.length > 0) { const running = byType.k3s.filter(s => s.status === 'running').length; console.log(`\n☸️ K3s Pods (${byType.k3s.length} 个, ${running} 运行中)`); const byCluster: Record = {}; for (const svc of byType.k3s) { if (!byCluster[svc.server]) byCluster[svc.server] = []; byCluster[svc.server].push(svc); } for (const [cluster, services] of Object.entries(byCluster)) { console.log(`\n 🏗️ ${cluster}:`); for (const svc of services.slice(0, 10)) { // 限制显示数量 const status = svc.status === 'running' ? '✅' : '⏸️ '; const ns = svc.metadata?.namespace || ''; const ready = svc.metadata?.ready ? ` (${svc.metadata.ready})` : ''; console.log(` ${status} ${ns}/${svc.name}${ready}`); } if (services.length > 10) { console.log(` ... 还有 ${services.length - 10} 个`); } } } // Systemd 服务 if (byType.systemd.length > 0) { const running = byType.systemd.filter(s => s.status === 'running').length; console.log(`\n⚙️ Systemd 服务 (${byType.systemd.length} 个, ${running} 运行中)`); const byServer: Record = {}; for (const svc of byType.systemd) { if (!byServer[svc.server]) byServer[svc.server] = []; byServer[svc.server].push(svc); } for (const [server, services] of Object.entries(byServer)) { console.log(`\n 🖥️ ${server}:`); for (const svc of services) { const status = svc.status === 'running' ? '✅' : '⏸️ '; console.log(` ${status} ${svc.name}`); } } } console.log('\n═══════════════════════════════════════════════════════════'); } finally { await router.closeAll(); } } main().catch(console.error);