Files
NetMesh/domain/systemManager/systemTarget.ts
zhaolei c64e00d835 feat: 新增设备巡检模块实现完整的巡检告警功能
新增设备巡检模块核心功能,包括:
- 巡检数据存储与调度系统
- 华为/H3C交换机及Linux服务器采集器
- 设备扩展配置与告警规则管理
- 主机详情页巡检配置入口
- 产品名称自定义设置功能
- 网络设备SSH exec通道兼容处理
2026-10-09 10:37:48 +08:00

122 lines
4.6 KiB
TypeScript

import { classifyDistroId, resolveHostOs } from '../host';
import type { Host } from '../models/connection';
import type { TerminalSession } from '../../types';
import type { SessionCapabilities, SystemManagerSubTab } from './types';
export function isNetworkDeviceTarget(host: Host | null | undefined): boolean {
if (host?.deviceType === 'network') return true;
return classifyDistroId(host?.distro) === 'network-device';
}
export function isDefiniteLinuxTarget(
host: Host | null | undefined,
capabilities: SessionCapabilities | undefined,
_session: TerminalSession | null | undefined,
): boolean {
if (capabilities?.targetOs && capabilities.targetOs !== 'unknown') return capabilities.targetOs === 'linux';
if (isNetworkDeviceTarget(host)) return false;
if (resolveHostOs(host) === 'linux') return true;
return false;
}
export function shouldShowProcessesTab(
host: Host | null | undefined,
capabilities: SessionCapabilities | undefined,
): boolean {
// Network appliances often lack a usable process table; only show after OS probe confirms.
if (isNetworkDeviceTarget(host)) {
const os = capabilities?.targetOs;
return os === 'linux' || os === 'darwin' || os === 'win32';
}
return true;
}
export function shouldShowTmuxTab(
host: Host | null | undefined,
capabilities: SessionCapabilities | undefined,
session: TerminalSession | null | undefined,
): boolean {
// Network appliances: detect-first only — do not guess from a Linux-like probe.
if (isNetworkDeviceTarget(host)) return capabilities?.hasTmux === true;
if (isDefiniteLinuxTarget(host, capabilities, session)) return true;
if (capabilities?.targetOs === 'darwin') return true;
if (resolveHostOs(host) === 'macos') return true;
return false;
}
export function shouldShowDockerTab(
host: Host | null | undefined,
capabilities: SessionCapabilities | undefined,
session: TerminalSession | null | undefined,
): boolean {
if (capabilities?.hasDocker === true) return true;
// Network appliances: never show Docker from an OS guess alone.
if (isNetworkDeviceTarget(host)) return false;
return isDefiniteLinuxTarget(host, capabilities, session);
}
/** GPU tab only appears after nvidia-smi / npu-smi is actually detected. */
export function shouldShowGpuTab(
capabilities: SessionCapabilities | undefined,
): boolean {
return capabilities?.hasNvidiaSmi === true || capabilities?.hasNpuSmi === true;
}
/** Ports tab only appears after a collector binary is detected (same detect-first model as GPU). */
export function shouldShowPortsTab(
capabilities: SessionCapabilities | undefined,
): boolean {
return (
capabilities?.hasSs === true
|| capabilities?.hasNetstat === true
|| capabilities?.hasLsof === true
);
}
/** Destructive port/service actions stay off for network appliances. */
export function allowSystemManagerMutations(
host: Host | null | undefined,
): boolean {
return !isNetworkDeviceTarget(host);
}
/** Services tab only appears after systemctl is detected. */
export function shouldShowServicesTab(
capabilities: SessionCapabilities | undefined,
): boolean {
return capabilities?.hasSystemctl === true;
}
export function shouldCollectServerStats(
host: Host | null | undefined,
capabilities: SessionCapabilities | undefined,
_session: TerminalSession | null | undefined,
): boolean {
const detectedDeviceClass = classifyDistroId(host?.distro);
// Network devices (H3C, Huawei, Cisco, etc.) now have their own PTY-shell
// based stats collector via getServerStats — allow polling so the panel
// shows CPU/memory/port data instead of staying empty.
if (isNetworkDeviceTarget(host) || detectedDeviceClass === 'network-device') return true;
if (capabilities?.targetOs && capabilities.targetOs !== 'unknown') {
return capabilities.targetOs === 'linux' || capabilities.targetOs === 'darwin' || capabilities.targetOs === 'windows';
}
const hostOs = resolveHostOs(host);
if (hostOs === 'linux' || hostOs === 'macos' || hostOs === 'windows') return true;
return false;
}
export function buildSystemManagerTabs(
host: Host | null | undefined,
capabilities: SessionCapabilities | undefined,
session: TerminalSession | null | undefined,
): SystemManagerSubTab[] {
const tabs: SystemManagerSubTab[] = ['overview'];
if (shouldShowProcessesTab(host, capabilities)) tabs.push('processes');
if (shouldShowPortsTab(capabilities)) tabs.push('ports');
if (shouldShowServicesTab(capabilities)) tabs.push('services');
if (shouldShowTmuxTab(host, capabilities, session)) tabs.push('tmux');
if (shouldShowDockerTab(host, capabilities, session)) tabs.push('docker');
if (shouldShowGpuTab(capabilities)) tabs.push('gpu');
return tabs;
}