feat(k8s): M14 Namespace 管理看板(资源配额 + 命名空间 CRUD)
- 后端: ListNamespacesDetailed/CreateNamespace/DeleteNamespace/ListResourceQuotas/ListLimitRanges - 后端: GetNamespacesDetail handler (6 API calls aggregate, not N×3) - 后端: CreateNamespaceHandler + DeleteNamespaceHandler (system NS protection) - 前端: NamespaceManagementPage.tsx (~280行) — 表格+概览卡片+创建/删除弹框 - 路由: GET/POST/DELETE /:clusterCode/namespaces + GET /namespace/:ns/detail - 验证: 9/9 通过 (urllib), TS 零错误, Vite 构建成功
This commit is contained in:
1 parent
c7b61968bc
commit
8240a88a84
33 files changed
+2029
-71
No files matched your search
+71
-2
@@ -2,6 +2,8 @@
|
||||
// 本文件实现监听 TCP 端口的自动发现:
|
||||
// - 扫描 /proc/net/tcp 与 /proc/net/tcp6 中状态为 LISTEN(0A) 的套接字;
|
||||
// - 通过遍历 /proc/*/fd 反查套接字 inode 归属的进程。
|
||||
// - 内置系统进程排除列表(sshd、rpcbind、master 等永远不上报)。
|
||||
// - 支持远程端口策略:whitelist(全量上报,默认)/ blacklist(只上报白名单端口)。
|
||||
//
|
||||
// 署名 Logan.Li
|
||||
package collector
|
||||
@@ -15,14 +17,47 @@ import (
|
||||
"ezops/agent/model"
|
||||
)
|
||||
|
||||
// 系统级进程 — 永远不采集其监听端口
|
||||
var systemProcesses = map[string]bool{
|
||||
"sshd": true,
|
||||
"rpcbind": true,
|
||||
"master": true, // Postfix
|
||||
"systemd": true,
|
||||
"systemd-resolve": true,
|
||||
"systemd-journal": true,
|
||||
"dbus-daemon": true,
|
||||
"rsyslogd": true,
|
||||
"irqbalance": true,
|
||||
"polkitd": true,
|
||||
"accounts-daemon": true,
|
||||
"NetworkManager": true,
|
||||
"udisksd": true,
|
||||
"upowerd": true,
|
||||
"rtkit-daemon": true,
|
||||
"switcheroo-contr": true,
|
||||
"power-profiles-": true, // power-profiles-daemon
|
||||
"wpa_supplicant": true,
|
||||
"avahi-daemon": true,
|
||||
"cron": true,
|
||||
"atd": true,
|
||||
"agetty": true,
|
||||
}
|
||||
|
||||
// PortCollector 监听端口自动发现采集器
|
||||
type PortCollector struct{}
|
||||
type PortCollector struct {
|
||||
Policy *model.PortPolicy // 可选:后端下发的端口过滤策略
|
||||
}
|
||||
|
||||
// NewPortCollector 创建端口采集器实例
|
||||
func NewPortCollector() *PortCollector {
|
||||
return &PortCollector{}
|
||||
}
|
||||
|
||||
// SetPolicy 设置端口过滤策略(daemon 模式下从后端轮询获得)
|
||||
func (p *PortCollector) SetPolicy(policy *model.PortPolicy) {
|
||||
p.Policy = policy
|
||||
}
|
||||
|
||||
// listenSocket 描述一个处于 LISTEN 状态的套接字
|
||||
type listenSocket struct {
|
||||
port int
|
||||
@@ -47,7 +82,7 @@ func (p *PortCollector) Collect() ([]model.PortStat, error) {
|
||||
// 2. 构建 inode -> 进程信息 映射(仅 Linux 上可用)
|
||||
inodeMap := p.buildInodeMap()
|
||||
|
||||
// 3. 组装结果并按 (端口, 协议, PID) 去重
|
||||
// 3. 组装结果并按 (端口, 协议, PID) 去重,应用过滤策略
|
||||
seen := make(map[string]bool)
|
||||
ports := make([]model.PortStat, 0, len(sockets))
|
||||
for _, s := range sockets {
|
||||
@@ -55,6 +90,22 @@ func (p *PortCollector) Collect() ([]model.PortStat, error) {
|
||||
if info, ok := inodeMap[s.inode]; ok {
|
||||
pid, name = info.pid, info.name
|
||||
}
|
||||
|
||||
// ── 过滤逻辑 ──
|
||||
// 1) 永远排除系统级进程端口
|
||||
if isSystemProcess(name) {
|
||||
continue
|
||||
}
|
||||
|
||||
// 2) 黑名单模式:只上报在白名单中的端口
|
||||
if p.Policy != nil && p.Policy.IsBlacklistMode() {
|
||||
if !p.Policy.InWhitelist(s.port) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
// 白名单模式(默认):全量上报已排除系统进程的端口
|
||||
// ── 过滤逻辑结束 ──
|
||||
|
||||
key := strconv.Itoa(s.port) + "|" + s.protocol + "|" + strconv.Itoa(pid)
|
||||
if seen[key] {
|
||||
continue
|
||||
@@ -200,3 +251,21 @@ func readProcessName(pid string) string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// isSystemProcess 判断进程名是否为系统进程(永远不上报的端口)
|
||||
func isSystemProcess(name string) bool {
|
||||
if name == "" {
|
||||
return false
|
||||
}
|
||||
// 精确匹配
|
||||
if systemProcesses[name] {
|
||||
return true
|
||||
}
|
||||
// 前缀匹配(如 power-profiles-daemon)
|
||||
for prefix := range systemProcesses {
|
||||
if strings.HasPrefix(name, prefix) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in new issue
Block a user