From 52edf0c9e40f9cb4e5302d63ab2abebaf73d3955 Mon Sep 17 00:00:00 2001 From: MeowOS Date: Tue, 1 Sep 2026 20:40:46 +0800 Subject: [PATCH] =?UTF-8?q?meow=5Fnetmgrd=20=E6=9C=9F2=EF=BC=9A=E8=A7=82?= =?UTF-8?q?=E6=B5=8B=E5=B1=82(PID=E2=86=92=E5=AE=9E=E4=BD=93=E5=BD=92?= =?UTF-8?q?=E5=9B=A0+=E8=BF=9E=E6=8E=A5=E6=99=AE=E6=9F=A5)+DNS=20=E4=BB=A3?= =?UTF-8?q?=E7=90=86+=E4=BA=8B=E4=BB=B6=E6=97=A5=E5=BF=97+=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5/DNS=20IPC=20=E4=B8=8E=20CLI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NETMGR_DESIGN.md 期2范围落地(全在 patch_v2/meow_netmgrd/ + meow_ipc.h 追加): - 连接普查(§4):每 2s 解析 /proc/net/{tcp,udp}(IPv4) → socket inode→pid(由 inode 集驱动扫 /proc//fd,不逐 pid 盲扫)→ 三实体归因 app:(amsd status)/svc:(svcd 落盘状态 /tmp/meow_svcd.status,socket 查询兜底)/proc:(无则 proc:unknown)。连接表静态 ≤512: entity/五元组/状态/寿命;远端 IP 由 DNS 缓存反查域名。 - DNS 代理(§5):监听 127.0.0.1:53 UDP;启动备份 resolv.conf 写双行(127.0.0.1+原上游,崩溃零断流); 透传转发+缓存(TTL 尊重;≤256 条);按源端口(port→entity)归因;域名规则 per-entity+global allow/deny (deny→NXDOMAIN+日志);atexit/SIGTERM/SIGHUP 恢复;5s 自检被第三方改回即重写;HibyOS 绝不启用/绝不改 resolv。 DNS wire(deny NXDOMAIN / forward→A+cache / NXDOMAIN id 回显) 宿主+qemu 实测 PASS。 - 事件日志(§8):新连接/关闭/dns deny/接口状态变化;同 entity 同 dst 1 分钟去重(首条+计数)。 - IPC meow_ipc.h 追加 0x00E8 CONNS_REQ/RESULT、0x00EC DNS_CTL/RESULT(纯追加不改既有行; 0x00EA 策略(期3)/0x00EE 事件推送(预留) 保留)。 - CLI meow_net 补 apps / conns [entity] / top(2s 刷新) / dns status|stats|flush。 - 内存:静态表禁 malloc,mipsel bss 228KB → RSS≈374KB,≤600KB 目标 / ≤1MB 预算。 宿主编译 -Wall -Wextra 0 warning;test_netmgrd.sh 48/48(宿主+qemu)、test_netmgrd_p2 全过(宿主+qemu)、 netmgrd_authtest 全过;真机(M6.0/0.8.0)只读实测 apps/conns/dns status 正确 (svc:meowpanel/svc:mdnsd/proc:dropbear 真实三实体归因),resolv.conf 测后核验原值未触碰。 --- patch_v2/meow_launcherd/meow_ipc.h | 37 + patch_v2/meow_netmgrd/meow_netmgrd | Bin 152892 -> 175324 bytes patch_v2/meow_netmgrd/meow_netmgrd.c | 1051 ++++++++++++++++++++++- patch_v2/meow_netmgrd/meow_netmgrd_host | Bin 77656 -> 81512 bytes patch_v2/meow_netmgrd/netmgrd_authtest | Bin 144816 -> 149208 bytes patch_v2/meow_netmgrd/test_netmgrd.sh | 107 ++- patch_v2/meow_netmgrd/test_netmgrd_p2 | Bin 0 -> 82232 bytes patch_v2/meow_netmgrd/test_netmgrd_p2.c | 213 +++++ 8 files changed, 1400 insertions(+), 8 deletions(-) create mode 100755 patch_v2/meow_netmgrd/test_netmgrd_p2 create mode 100644 patch_v2/meow_netmgrd/test_netmgrd_p2.c diff --git a/patch_v2/meow_launcherd/meow_ipc.h b/patch_v2/meow_launcherd/meow_ipc.h index 9f673c6..6e7a1c6 100644 --- a/patch_v2/meow_launcherd/meow_ipc.h +++ b/patch_v2/meow_launcherd/meow_ipc.h @@ -564,4 +564,41 @@ typedef struct m_net_cmd_result { char text[MEOW_IPC_MAX - 8]; } m_net_cmd_result_t; +/* ---- 期 2:观测层(连接普查)+ DNS 代理(NETMGR_DESIGN §4/§5)---- + * 0x00E8/0x00EC 实现取代上方「0x00E8-0x00EF 保留」注释中的连接表/DNS 控制两项; + * 0x00EA(策略读写,期3)/0x00EE(事件推送,期2 订阅制预留)仍保留未实装。 */ +enum { /* 与主 enum 分列,追加式不改既有行 */ + MSG_NET_CONNS_REQ = 0x00E8, /* ↑ 连接表查询(entity 空=全部) */ + MSG_NET_CONNS_RESULT = 0x00E9, /* ↓ 连接表文本(定长行;超帧截断标记) */ + MSG_NET_DNS_CTL = 0x00EC, /* ↑ dns status|stats|flush */ + MSG_NET_DNS_RESULT = 0x00ED /* ↓ 结果/统计文本 */ + /* 0x00EA 策略读写(期3)/ 0x00EE 事件推送(预留,期2 订阅制)/ 0xEB、0xEF 余量 */ +}; + +/* MSG_NET_CONNS_REQ ↑:entity 前缀过滤(空=全部)。entity 形如 `app:`/`svc:`/`proc:`。 */ +typedef struct m_net_conns_req { + char entity[48]; +} m_net_conns_req_t; /* 48 B */ + +/* MSG_NET_CONNS_RESULT ↓:连接表文本(每行 `entity|lip:lport|rip:rport|state|age_s|domain`)。 + * 超单帧上限时截断并置 truncated=1(app/top 由客户端按行聚合,容纳全部)。 */ +typedef struct m_net_conns_result { + uint32_t code; /* MEOW_OK / MEOW_ERR_* */ + uint16_t text_len; + uint16_t truncated; /* 1=被截断 */ + char text[MEOW_IPC_MAX - 8]; +} m_net_conns_result_t; + +/* MSG_NET_DNS_CTL ↑:cmd=status|stats|flush。status/stats 读级任意;flush(清缓存)为动作级系统身份。 */ +typedef struct m_net_dns_ctl { + char cmd[16]; +} m_net_dns_ctl_t; /* 16 B */ + +typedef struct m_net_dns_result { + uint32_t code; + uint16_t text_len; + uint16_t pad; + char text[MEOW_IPC_MAX - 8]; +} m_net_dns_result_t; + #endif /* MEOW_IPC_H */ diff --git a/patch_v2/meow_netmgrd/meow_netmgrd b/patch_v2/meow_netmgrd/meow_netmgrd index 4fa5774482e421b051a2ad581405dd7956f168c7..adf617419571bd4dc5581262a337679868ba3c42 100755 GIT binary patch delta 65989 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

%#Xz?)wS0r)%1CxT%;ECV9FjVYKaIr9l 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

D&>VT|}CF6K6xh;-9O-(bYA!lNx(I1IQrj(@ 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 diff --git a/patch_v2/meow_netmgrd/meow_netmgrd.c b/patch_v2/meow_netmgrd/meow_netmgrd.c index 9011264..5e894e5 100644 --- a/patch_v2/meow_netmgrd/meow_netmgrd.c +++ b/patch_v2/meow_netmgrd/meow_netmgrd.c @@ -44,8 +44,10 @@ #include #include #include +#include +#include -#include "meow_ipc.h" /* 帧格式/消息号 + MSG_NET_*(0x00E0-0x00E7) + m_net_*(号段 0x00E0-0x00EF) */ +#include "meow_ipc.h" /* 帧格式/消息号 + MSG_NET_*(0x00E0-0x00ED) + m_net_*(号段 0x00E0-0x00EF) */ /* ---------------- 路径(全部可经 env 覆盖,宿主/qemu 桩测试用) ---------------- */ static char g_net_dir[128] = "/sys/class/net"; /* MEOW_NET_DIR */ @@ -67,13 +69,38 @@ static const char *g_bluetoothctl= "bluetoothctl"; /* MEOW_BLUET static const char *g_ip = "ip"; /* MEOW_IP */ static const char *g_wifi_if = "wlan0"; /* MEOW_WIFI_IF */ +/* 期 2:观测层 + DNS 代理 相关路径(可经 env 覆盖,宿主/qemu 桩测试用) */ +static char g_proc_tcp[160] = "/proc/net/tcp"; /* MEOW_TCP */ +static char g_proc_udp[160] = "/proc/net/udp"; /* MEOW_UDP */ +static char g_ams_sock[128] = "/usr/data/meow_ams.sock"; /* MEOW_AMS_SOCK(amsd 注册表 pid→pkg) */ +static char g_svcd_sock[128] = "/tmp/meow_svcd.sock"; /* MEOW_SVCD_SOCK(svcd 服务表 pid→svc,socket 查询兜底) */ +static char g_svcd_status[160]= "/tmp/meow_svcd.status"; /* MEOW_SVCD_STATUS(svcd 落盘状态,机器可读 `svc= ... pid=`) */ +static char g_net_policy[160]= "/usr/data/meow/net_policy.conf"; /* MEOW_NET_POLICY(期2 只读静态域名规则) */ + #define NET_POLL_SEC_DEF 2 /* 接口轮询/状态节拍(秒;MEOW_NET_POLL_SEC 覆盖,测试用) */ #define RUNCMD_TMO_MS 1500 /* 后端命令(wpa_cli/hciconfig/etc)有界收割限时(ms) */ #define IFACE_MAX 16 #define RFKILL_MAX 8 #define DNS_MAX 8 +/* ---- 期 2 常量(NETMGR_DESIGN §4/§5/§8;全部静态表,禁 malloc) ---- */ +#define CONN_MAX 512 /* 连接表上限 */ +#define DNS_CACHE_MAX 256 /* DNS 应答缓存上限 */ +#define DNS_UPSTREAM_TMO_MS 800 /* DNS 上游转发超时 */ +#define DNS_QNAME_MAX 128 /* query 域名最大字节 */ +#define ENTITY_MAX 128 /* pid→entity 缓存条数 */ +#define PORT_ENT_MAX 128 /* udp 本地端口→entity 缓存(DNS 归因用) */ +#define RULE_ENT_MAX 16 /* 域名规则实体上限 */ +#define RULE_HOST_MAX 24 /* 单实体 allow/deny 主机规则上限 */ +#define EVT_DUP_MAX 64 /* 事件日志 1 分钟去重表 */ +#define DNS_RESOLV_CHECK_SEC 5 /* resolv.conf 自检周期 */ + +#define DNS_PORT_DEF 53 /* 监听端口(MEOW_DNS_PORT 覆盖;宿主测试用高位规避 <1024 权限) */ +#define DNS_SELF_IP "127.0.0.1" + static int g_poll_sec = NET_POLL_SEC_DEF; +static int g_dns_port = DNS_PORT_DEF; /* MEOW_DNS_PORT */ +static int g_dns_disabled = 0; /* MEOW_DNS_DISABLE=1:禁用 DNS 代理(宿主测试无 root 绑 53) */ static long mono_now(void) { @@ -902,6 +929,801 @@ static int build_iface_json(const char *name, char *out, size_t cap) return MEOW_ERR_NOENT; } +/* ================= 期 2:观测层(连接普查)+ DNS 代理(NETMGR_DESIGN §4/§5/§8) ================= */ +/* ---- 连接/实体/DNS/规则/事件去重 静态表(禁 malloc) ---- */ +typedef struct { + uint32_t local_ip; /* dotted-printable uint32(b0<<24|b1<<16|b2<<8|b3) */ + uint32_t remote_ip; + uint16_t local_port; + uint16_t remote_port; + uint8_t state_code; /* tcp state hex;udp 用 0 */ + uint8_t type; /* 0=tcp 1=udp */ + uint32_t inode; /* socket inode(归因键;0=无法归因) */ + int pid; /* 持有 socket 的 pid(0=未知) */ + char entity[48]; /* app: | svc: | proc: | proc:unknown */ + char domain[48]; /* 远端 IP 反查域名(DNS 缓存;空=未命中) */ + long mono_open; /* 首次见此连接(mono 秒) */ + long last_seen; /* 最近出现 */ + int seen_gen; /* 本普查代际标记(防跨拍误判) */ +} conn_t; +static conn_t g_conn[CONN_MAX]; +static int g_conn_n = 0; +static int g_gen = 0; + +typedef struct { char name[64]; uint32_t ip; uint16_t ttl; long exp; } dns_cache_t; +static dns_cache_t g_dns[DNS_CACHE_MAX]; +static int g_dns_n = 0; + +typedef struct { int pid; char entity[48]; } pid_ent_t; +static pid_ent_t g_pid_ent[ENTITY_MAX]; +static int g_pid_ent_n = 0; + +typedef struct { uint16_t port; char entity[48]; } port_ent_t; +static port_ent_t g_port_ent[PORT_ENT_MAX]; +static int g_port_ent_n = 0; + +typedef struct { + char entity[48]; + char allow[RULE_HOST_MAX][48]; int allow_n; + char deny[RULE_HOST_MAX][48]; int deny_n; +} rule_t; +static rule_t g_rules[RULE_ENT_MAX]; +static int g_rule_n = 0; + +typedef struct { char key[96]; long mono; } evt_dup_t; +static evt_dup_t g_evt_dup[EVT_DUP_MAX]; +static int g_evt_dup_n = 0; + +/* ---- DNS 代理状态 ---- */ +static int g_dns_enabled = 0; +static int g_dns_modified_resolv = 0; /* resolv.conf 已被改写(需恢复) */ +static int g_dns_fd = -1; /* 127.0.0.1:port UDP 监听 */ +static int g_dns_up_fd = -1; /* 上游转发 socket */ +static char g_dns_upstream[40] = ""; /* 原上游 nameserver IP */ +static int g_dns_upstream_port = 53; /* 上游端口(MEOW_DNS_UPSTREAM_PORT,宿主测试用) */ +static char g_resolv_backup[384] = ""; /* 原 resolv.conf 内容 */ +static uint64_t g_dns_q = 0, g_dns_deny = 0, g_dns_first = 0; +static long g_last_resolv_check = 0; +static volatile sig_atomic_t g_hup = 0; + +/* ---- 通用工具 ---- */ +static void ip_fmt(uint32_t ip, char *out, size_t cap) +{ + snprintf(out, cap, "%u.%u.%u.%u", (ip >> 24) & 0xff, (ip >> 16) & 0xff, + (ip >> 8) & 0xff, ip & 0xff); +} +/* /proc/net/{tcp,udp} 的十六进制地址 → dotted-printable uint32(LE 字节序还原)。 */ +static uint32_t hex_ip(const char *hex) +{ + uint32_t v = (uint32_t)strtoul(hex, NULL, 16); + uint32_t b0 = v & 0xff, b1 = (v >> 8) & 0xff, b2 = (v >> 16) & 0xff, b3 = (v >> 24) & 0xff; + return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3; +} +static const char *tcp_state_str(uint8_t s) +{ + switch (s) { + case 0x01: return "ESTAB"; + case 0x02: return "SYN_SENT"; + case 0x03: return "SYN_RECV"; + case 0x04: return "FIN_WAIT1"; + case 0x05: return "FIN_WAIT2"; + case 0x06: return "TIME_WAIT"; + case 0x07: return "CLOSE"; + case 0x08: return "CLOSE_WAIT"; + case 0x09: return "LAST_ACK"; + case 0x0A: return "LISTEN"; + case 0x0B: return "CLOSING"; + default: return "??"; + } +} + +/* AF_UNIX 文本请求/响应(svcd/amsd 用;send 后 shutdown(SHUT_WR) 触发服务端 EOF 处理,读至对端关闭)。 */ +static int sock_xchg_text(const char *sockpath, const char *send, char *resp, int cap) +{ + int fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) return -1; + struct timeval tv = { 1, 0 }; + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof tv); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof tv); + struct sockaddr_un a; + memset(&a, 0, sizeof a); + a.sun_family = AF_UNIX; + strncpy(a.sun_path, sockpath, sizeof a.sun_path - 1); + if (connect(fd, (struct sockaddr *)&a, sizeof a) < 0) { close(fd); return -1; } + if (send && write(fd, send, strlen(send)) < 0) { close(fd); return -1; } + shutdown(fd, SHUT_WR); /* 通知服务端 EOF(amsd conn_finish 才响应) */ + int n = 0; + while (n < cap - 1) { + ssize_t r = read(fd, resp + n, (size_t)(cap - 1 - n)); + if (r <= 0) break; + n += (int)r; + } + close(fd); + if (n > 0) resp[n] = 0; else resp[0] = 0; + return n > 0 ? 0 : -1; +} + +/* ---- DNS 缓存(≤256,TTL 尊重) ---- */ +static int dns_cache_insert(const char *name, uint32_t ip, uint16_t ttl) +{ + long now = mono_now(); + long exp = now + (ttl ? ttl : 60); + if (exp - now > 86400) exp = now + 86400; + for (int i = 0; i < g_dns_n; i++) { + if (strcmp(g_dns[i].name, name) == 0) { g_dns[i].ip = ip; g_dns[i].exp = exp; return 0; } + } + /* 找空槽或最旧 */ + int slot = -1; long oldest = 0; + for (int i = 0; i < DNS_CACHE_MAX; i++) { + if (g_dns[i].name[0] == 0) { slot = i; break; } + if (g_dns[i].exp < oldest) { oldest = g_dns[i].exp; slot = i; } + } + if (slot < 0) slot = g_dns_n < DNS_CACHE_MAX ? g_dns_n++ : 0; + if (g_dns_n < DNS_CACHE_MAX && slot == g_dns_n) g_dns_n++; + snprintf(g_dns[slot].name, sizeof g_dns[slot].name, "%s", name); + g_dns[slot].ip = ip; g_dns[slot].ttl = ttl; g_dns[slot].exp = exp; + return 0; +} +static int dns_cache_lookup_ip(uint32_t ip, char *out, size_t cap) +{ + long now = mono_now(); + for (int i = 0; i < g_dns_n; i++) { + if (g_dns[i].name[0] && g_dns[i].ip == ip && g_dns[i].exp > now) { + if (out && cap) snprintf(out, cap, "%s", g_dns[i].name); + return 0; + } + } + return -1; +} +static int dns_cache_lookup_name(const char *name) +{ + long now = mono_now(); + for (int i = 0; i < g_dns_n; i++) + if (strcmp(g_dns[i].name, name) == 0 && g_dns[i].exp > now) return 0; + return -1; +} +static void dns_cache_flush(void) +{ + for (int i = 0; i < g_dns_n; i++) g_dns[i].name[0] = 0; + g_dns_n = 0; +} + +/* ---- 域名规则(期2 静态 conf 只读;期3 策略引擎再接管) ---- */ +static int suffix_match(const char *host, const char *rule) +{ + if (!host[0] || !rule[0]) return 0; + size_t hl = strlen(host), rl = strlen(rule); + if (hl < rl) return 0; + if (strcmp(host + hl - rl, rule) != 0) return 0; + return hl == rl || host[hl - rl - 1] == '.'; +} +static int entity_rules_match(const rule_t *r, const char *entity) +{ + return r->entity[0] && strcmp(r->entity, entity) == 0; +} +/* deny 判定:命中最具体的实体规则(entity+global),allow 覆盖 deny;默认 allow。 */ +static int dns_query_domain_denied(const char *entity, const char *domain) +{ + const rule_t *g = NULL, *e = NULL; + for (int i = 0; i < g_rule_n; i++) { + if (strcmp(g_rules[i].entity, "global") == 0) g = &g_rules[i]; + else if (!e && entity_rules_match(&g_rules[i], entity)) e = &g_rules[i]; + } + const rule_t *r = e ? e : g; + if (r && r->deny_n) { + for (int i = 0; i < r->deny_n; i++) + if (suffix_match(domain, r->deny[i])) { + /* allow 白名单可覆盖 */ + for (int j = 0; j < r->allow_n; j++) + if (suffix_match(domain, r->allow[j])) return 0; + return 1; + } + } + return 0; +} +static void rules_load(void) +{ + g_rule_n = 0; + FILE *f = fopen(g_net_policy, "r"); + if (!f) return; + char line[256]; + while (fgets(line, sizeof line, f) && g_rule_n < RULE_ENT_MAX) { + char *p = line; + while (*p == ' ' || *p == '\t') p++; + if (*p == '#' || *p == '\n' || !*p) continue; + char *nl = strchr(p, '\n'); if (nl) *nl = 0; + char *sp = strchr(p, ' '); + char *tab = strchr(p, '\t'); + if (!sp || (tab && tab < sp)) sp = tab; + char *entity; char *rest; + if (sp) { *sp = 0; entity = p; rest = sp + 1; } + else continue; + rule_t *r = &g_rules[g_rule_n]; + memset(r, 0, sizeof *r); + snprintf(r->entity, sizeof r->entity, "%s", entity); + /* rest 形如 "domain=+a,-b,c" 或 "net=block";逐 token 解析 */ + char *save = NULL; + for (char *tok = strtok_r(rest, " \t", &save); tok; tok = strtok_r(NULL, " \t", &save)) { + if (strncmp(tok, "domain=", 7) != 0) continue; + char *sub = tok + 7; + char *ssave = NULL; + for (char *h = strtok_r(sub, ",", &ssave); h; h = strtok_r(NULL, ",", &ssave)) { + if (h[0] == '+') { + if (r->allow_n < RULE_HOST_MAX) snprintf(r->allow[r->allow_n++], 48, "%s", h + 1); + } else if (h[0] == '-') { + if (r->deny_n < RULE_HOST_MAX) snprintf(r->deny[r->deny_n++], 48, "%s", h + 1); + } else if (h[0]) { + if (r->deny_n < RULE_HOST_MAX) snprintf(r->deny[r->deny_n++], 48, "%s", h); + } + } + } + if (r->deny_n || r->allow_n) g_rule_n++; + } + fclose(f); +} + +/* ---- 实体归因:pid→(app: / svc: / proc:) ---- */ +static void pid_ent_put(int pid, const char *entity) +{ + if (pid <= 0) return; + for (int i = 0; i < g_pid_ent_n; i++) + if (g_pid_ent[i].pid == pid) { snprintf(g_pid_ent[i].entity, sizeof g_pid_ent[i].entity, "%s", entity); return; } + if (g_pid_ent_n < ENTITY_MAX) { + g_pid_ent[g_pid_ent_n].pid = pid; + snprintf(g_pid_ent[g_pid_ent_n].entity, sizeof g_pid_ent[g_pid_ent_n].entity, "%s", entity); + g_pid_ent_n++; + } +} +static void refresh_entity_maps(void) +{ + g_pid_ent_n = 0; + char resp[2048]; + /* amsd:`status` → "RUN " */ + if (sock_xchg_text(g_ams_sock, "status\n", resp, sizeof resp) == 0) { + char *ln = resp; + while (ln && *ln) { + char *nl = strchr(ln, '\n'); if (nl) *nl = 0; + char *tok[8]; int nt = 0; + char *save = NULL; + for (char *t = strtok_r(ln, " \t", &save); t && nt < 8; t = strtok_r(NULL, " \t", &save)) tok[nt++] = t; + if (nt >= 4 && strcmp(tok[0], "RUN") == 0) { + int pid = atoi(tok[3]); + if (pid > 0) { char ent[48]; snprintf(ent, sizeof ent, "app:%s", tok[1]); pid_ent_put(pid, ent); } + } + if (!nl) break; + ln = nl + 1; + } + } + /* svcd:优先读落盘状态文件(机器可读 `svc= state=... pid=...`)——socket `status` 是 ANSI 表。 + * 文件缺失回退 socket 查询(解析 `svc=` 行)。 */ + { + FILE *f = fopen(g_svcd_status, "r"); + if (f) { + char line[512]; + while (fgets(line, sizeof line, f)) { + if (strncmp(line, "svc=", 4) != 0) continue; + char name[64] = ""; int pid = 0; + char *q = line + 4; + char *sp = strchr(q, ' '); if (sp) *sp = 0; + snprintf(name, sizeof name, "%s", q); + char *ps = strstr(sp ? sp + 1 : line, "pid="); + if (ps) pid = atoi(ps + 4); + if (pid > 0) { char ent[48]; snprintf(ent, sizeof ent, "svc:%s", name); pid_ent_put(pid, ent); } + } + fclose(f); + } else if (sock_xchg_text(g_svcd_sock, "status\n", resp, sizeof resp) == 0) { + char *ln = resp; + while (ln && *ln) { + char *nl = strchr(ln, '\n'); if (nl) *nl = 0; + if (strncmp(ln, "svc=", 4) == 0) { + char name[64] = ""; int pid = 0; + char *q = ln + 4; + char *sp = strchr(q, ' '); if (sp) *sp = 0; + snprintf(name, sizeof name, "%s", q); + char *ps = strstr(sp ? sp + 1 : ln, "pid="); + if (ps) pid = atoi(ps + 4); + if (pid > 0) { char ent[48]; snprintf(ent, sizeof ent, "svc:%s", name); pid_ent_put(pid, ent); } + } + if (!nl) break; + ln = nl + 1; + } + } + } + /* 其余 pid(本表不含)→ 归 proc:,由 entity_for_pid 补 */ +} +static const char *entity_for_pid(int pid, char *out, size_t cap) +{ + for (int i = 0; i < g_pid_ent_n; i++) + if (g_pid_ent[i].pid == pid) { snprintf(out, cap, "%s", g_pid_ent[i].entity); return out; } + char p[64], comm[64] = ""; + snprintf(p, sizeof p, "/proc/%d/comm", pid); + read_file_txt(p, comm, sizeof comm); + if (comm[0]) snprintf(out, cap, "proc:%s", comm); + else snprintf(out, cap, "proc:unknown"); + return out; +} + +/* 由 /proc/net/{tcp,udp} 的 inode 集驱动扫 /proc//fd(不逐连接盲扫)。 */ +static void attribute_inodes(conn_t *cur, int n) +{ + DIR *pd = opendir("/proc"); + if (!pd) return; + struct dirent *de; + while ((de = readdir(pd))) { + if (!isdigit((unsigned char)de->d_name[0])) continue; + int pid = atoi(de->d_name); + if (pid <= 0) continue; + char fddir[64]; + snprintf(fddir, sizeof fddir, "/proc/%d/fd", pid); + DIR *fd = opendir(fddir); + if (!fd) continue; + struct dirent *fe; + while ((fe = readdir(fd))) { + if (fe->d_name[0] == '.') continue; + char lnk[72], target[64]; + snprintf(lnk, sizeof lnk, "/proc/%d/fd/%s", pid, fe->d_name); + ssize_t r = readlink(lnk, target, sizeof target - 1); + if (r <= 0) continue; + target[r] = 0; + if (strncmp(target, "socket:[", 8) != 0) continue; + uint32_t ino = (uint32_t)strtoul(target + 8, NULL, 10); + for (int i = 0; i < n; i++) { + if (cur[i].inode == ino && cur[i].pid == 0) { + cur[i].pid = pid; + char ent[48]; + entity_for_pid(pid, ent, sizeof ent); + snprintf(cur[i].entity, sizeof cur[i].entity, "%s", ent); + break; + } + } + } + closedir(fd); + } + closedir(pd); +} + +/* UDP 本地端口→entity(DNS 归因:源端口反查,查询发起瞬时,miss → proc:unknown)。 */ +static void build_port_entity_map(const conn_t *cur, int n) +{ + g_port_ent_n = 0; + for (int i = 0; i < n && g_port_ent_n < PORT_ENT_MAX; i++) { + if (cur[i].type != 1 || cur[i].local_port == 0) continue; + if (cur[i].local_ip != 0x7f000001 && cur[i].local_ip != 0) continue; /* loopback/通配即可 */ + g_port_ent[g_port_ent_n].port = cur[i].local_port; + snprintf(g_port_ent[g_port_ent_n].entity, sizeof g_port_ent[g_port_ent_n].entity, + "%s", cur[i].entity); + g_port_ent_n++; + } +} +static const char *dns_entity_for_port(uint16_t port) +{ + for (int i = 0; i < g_port_ent_n; i++) + if (g_port_ent[i].port == port) return g_port_ent[i].entity; + return "proc:unknown"; +} + +/* ---- /proc/net/{tcp,udp} 解析(IPv4) ---- */ +static int parse_proc_net(const char *path, int is_udp, conn_t *cur, int *n) +{ + FILE *f = fopen(path, "r"); + if (!f) return 0; + char line[512]; + if (fgets(line, sizeof line, f)) { /* skip header */ } + int cnt = 0; + while (fgets(line, sizeof line, f) && *n < CONN_MAX) { + char *tok[16]; int nt = 0; + char *save = NULL; + for (char *t = strtok_r(line, " \t", &save); t && nt < 16; t = strtok_r(NULL, " \t", &save)) + tok[nt++] = t; + if (nt < 10) continue; + char *colon = strchr(tok[1], ':'); + if (!colon) continue; + *colon = 0; + conn_t *c = &cur[*n]; + memset(c, 0, sizeof *c); + c->local_ip = hex_ip(tok[1]); + c->local_port = (uint16_t)strtoul(colon + 1, NULL, 16); + colon = strchr(tok[2], ':'); + if (!colon) continue; + *colon = 0; + c->remote_ip = hex_ip(tok[2]); + c->remote_port = (uint16_t)strtoul(colon + 1, NULL, 16); + c->state_code = (uint8_t)strtoul(tok[3], NULL, 16); + c->inode = (uint32_t)strtoul(tok[9], NULL, 10); + c->type = (uint8_t)(is_udp ? 1 : 0); + (*n)++; cnt++; + } + fclose(f); + return cnt; +} + +/* ---- 事件日志(同 entity 同 dst 1 分钟去重) ---- */ +static void evt_conn_log(const char *entity, const char *dst, const char *what) +{ + char key[96]; + snprintf(key, sizeof key, "%s|%s|%s", what, entity, dst); + long now = mono_now(); + for (int i = 0; i < g_evt_dup_n; i++) { + if (strcmp(g_evt_dup[i].key, key) == 0) { + if (now - g_evt_dup[i].mono >= 60) { g_evt_dup[i].mono = now; net_log("info", "conn", "%s entity=%s dst=%s", what, entity, dst); } + return; /* 1 分钟内只记首条 */ + } + } + if (g_evt_dup_n < EVT_DUP_MAX) { + snprintf(g_evt_dup[g_evt_dup_n].key, sizeof g_evt_dup[g_evt_dup_n].key, "%s", key); + g_evt_dup[g_evt_dup_n].mono = now; + g_evt_dup_n++; + } + net_log("info", "conn", "%s entity=%s dst=%s", what, entity, dst); +} + +/* ---- 连接普查(每 2s):/proc/net/{tcp,udp} → inode→pid→实体 → 连接表 + 事件 ---- */ +static void census_run(void) +{ + refresh_entity_maps(); + static conn_t cur[CONN_MAX]; + int cn = 0; + parse_proc_net(g_proc_tcp, 0, cur, &cn); + parse_proc_net(g_proc_udp, 1, cur, &cn); + for (int i = 0; i < cn; i++) { cur[i].pid = 0; cur[i].entity[0] = 0; } + attribute_inodes(cur, cn); + for (int i = 0; i < cn; i++) { + if (cur[i].inode && !cur[i].entity[0]) snprintf(cur[i].entity, sizeof cur[i].entity, "proc:unknown"); + if (cur[i].inode && cur[i].remote_ip != 0) + dns_cache_lookup_ip(cur[i].remote_ip, cur[i].domain, sizeof cur[i].domain); + } + build_port_entity_map(cur, cn); + + int prev_n = g_conn_n; + g_gen++; + g_conn_n = 0; + long now = mono_now(); + for (int i = 0; i < cn; i++) { + conn_t *c = &cur[i]; + /* 是否延续既有连接(按 inode)?→ 保 open 时间;否则新连接 → 日志。 */ + int pi = -1; + for (int j = 0; j < prev_n; j++) if (g_conn[j].inode == c->inode && g_conn[j].pid) { pi = j; break; } + if (pi >= 0) { + c->mono_open = g_conn[pi].mono_open; + } else { + c->mono_open = now; + if (c->inode && c->remote_port != 0) { /* 服务端监听口(remote=0/0)不记 open */ + char dst[64], ip[32]; + ip_fmt(c->remote_ip, ip, sizeof ip); + snprintf(dst, sizeof dst, "%s:%u", ip, c->remote_port); + evt_conn_log(c->entity[0] ? c->entity : "proc:unknown", dst, "open"); + } + } + c->seen_gen = g_gen; + c->last_seen = now; + if (g_conn_n < CONN_MAX) g_conn[g_conn_n++] = *c; + } + /* 检测关闭:prev 有、本次无 → 日志 close + 移除。 */ + for (int j = 0; j < prev_n; j++) { + int found = 0; + for (int i = 0; i < g_conn_n; i++) if (g_conn[i].inode == g_conn[j].inode) { found = 1; break; } + if (!found && g_conn[j].inode && g_conn[j].remote_port != 0) { + char dst[64], ip[32]; + ip_fmt(g_conn[j].remote_ip, ip, sizeof ip); + snprintf(dst, sizeof dst, "%s:%u", ip, g_conn[j].remote_port); + evt_conn_log(g_conn[j].entity[0] ? g_conn[j].entity : "proc:unknown", dst, "close"); + } + } +} + +/* ---- DNS 代理(§5;三条兜底:双行 resolv + atexit 恢复 + 5s 自检) ---- */ +static int resolv_read_file(char *buf, int cap) +{ + int fd = open(g_resolv, O_RDONLY); + if (fd < 0) return -1; + int n = 0; + while (n < cap - 1) { + ssize_t r = read(fd, buf + n, (size_t)(cap - 1 - n)); + if (r <= 0) break; + n += (int)r; + } + close(fd); + buf[n] = 0; + return n; +} +static int resolv_write_file(const char *buf) +{ + int fd = open(g_resolv, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) return -1; + ssize_t w = write(fd, buf, strlen(buf)); + close(fd); + return w > 0 ? 0 : -1; +} +static void resolv_backup_apply(void) +{ + /* 读当前 resolv.conf,取首个 nameserver 为上游。若已是我们双行形式则跳过。 */ + char buf[384]; + if (resolv_read_file(buf, sizeof buf) <= 0) return; + if (strstr(buf, "nameserver 127.0.0.1") != NULL) { + /* 已在代理指向;补上游(若无双行则显式加) */ + char up[40] = ""; + char *p = buf; + while ((p = strstr(p, "nameserver"))) { + p += 10; while (*p == ' ' || *p == '\t') p++; + char ip[40]; int i = 0; + while (*p && *p != ' ' && *p != '\t' && *p != '\n' && i < 39) ip[i++] = *p++; + ip[i] = 0; + if (strcmp(ip, "127.0.0.1") != 0 && ip[0]) { snprintf(up, sizeof up, "%s", ip); break; } + } + if (up[0]) snprintf(g_dns_upstream, sizeof g_dns_upstream, "%s", up); + return; + } + /* 备份原内容 */ + snprintf(g_resolv_backup, sizeof g_resolv_backup, "%s", buf); + /* 取上游(首个 nameserver) */ + char up[40] = ""; + char *p = buf; + while ((p = strstr(p, "nameserver"))) { + p += 10; while (*p == ' ' || *p == '\t') p++; + char ip[40]; int i = 0; + while (*p && *p != ' ' && *p != '\t' && *p != '\n' && i < 39) ip[i++] = *p++; + ip[i] = 0; + if (ip[0] && strcmp(ip, "127.0.0.1") != 0) { snprintf(up, sizeof up, "%s", ip); break; } + } + snprintf(g_dns_upstream, sizeof g_dns_upstream, "%s", up); + /* 双行:nameserver 127.0.0.1 + nameserver (崩溃零断流) */ + char two[128]; + if (up[0]) snprintf(two, sizeof two, "nameserver 127.0.0.1\nnameserver %s\n", up); + else snprintf(two, sizeof two, "nameserver 127.0.0.1\n"); + if (resolv_write_file(two) == 0) { + g_dns_modified_resolv = 1; + svc_log("dns: resolv.conf -> %s", up[0] ? "two-line (127.0.0.1 + upstream)" : "127.0.0.1 only"); + } +} +static void resolv_restore(void) +{ + if (g_dns_modified_resolv && g_resolv_backup[0]) { + resolv_write_file(g_resolv_backup); + svc_log("dns: resolv.conf restored"); + } + g_dns_modified_resolv = 0; +} +static void dns_atexit_restore(void) { resolv_restore(); } + +static int dns_proxy_start(void) +{ + int fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) { svc_log("dns: socket fail"); return -1; } + int one = 1; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one); + struct sockaddr_in a; + memset(&a, 0, sizeof a); + a.sin_family = AF_INET; + a.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + a.sin_port = htons((uint16_t)g_dns_port); + if (bind(fd, (struct sockaddr *)&a, sizeof a) < 0) { + svc_log("dns: bind 127.0.0.1:%d fail (%s) — proxy off", g_dns_port, strerror(errno)); + close(fd); + return -1; + } + g_dns_fd = fd; + g_dns_up_fd = socket(AF_INET, SOCK_DGRAM, 0); + resolv_backup_apply(); /* 仅在 bind 成功后改写 resolv.conf(否则断网) */ + g_dns_enabled = 1; + svc_log("dns proxy on 127.0.0.1:%d upstream=%s cache=%d", g_dns_port, + g_dns_upstream[0] ? g_dns_upstream : "(none)", DNS_CACHE_MAX); + return 0; +} +static void dns_proxy_stop(void) +{ + if (g_dns_fd >= 0) { close(g_dns_fd); g_dns_fd = -1; } + if (g_dns_up_fd >= 0) { close(g_dns_up_fd); g_dns_up_fd = -1; } + resolv_restore(); + g_dns_enabled = 0; + svc_log("dns proxy off"); +} + +static int dns_parse_query(const uint8_t *q, int qlen, char *domain, int domcap, int *qend) +{ + if (qlen < 12) return -1; + if (q[2] & 0x80) return -1; /* 不是 query 位 */ + uint16_t qd = (uint16_t)((q[4] << 8) | q[5]); + if (qd < 1) return -1; + int off = 12, di = 0, first = 1, len = 0; + while (off < qlen) { + uint8_t l = q[off++]; + if (l == 0) break; + if (l & 0xC0) return -1; /* question 名压缩不常见 */ + if (!first && di < domcap - 2) domain[di++] = '.'; + first = 0; + for (int i = 0; i < l && off < qlen && di < domcap - 1; i++) domain[di++] = (char)q[off++]; + len += l; + if (len > 253) return -1; + } + if (off + 4 > qlen) return -1; + domain[di] = 0; + off += 4; /* qtype+qclass */ + *qend = off; + return di > 0 ? 0 : -1; +} +static int dns_build_nxdomain(const uint8_t *q, int qlen, uint8_t *out, int outcap) +{ + int qend = 0; + char dom[DNS_QNAME_MAX]; + if (dns_parse_query(q, qlen, dom, sizeof dom, &qend) != 0) return -1; + int qsec = qend - 12; + if (12 + qsec > outcap) return -1; + memcpy(out, q, 12); + out[2] = 0x81; out[3] = 0x83; /* QR|RD|RA + RCODE=3 (NXDOMAIN) */ + out[4] = 0; out[5] = 1; /* qdcount=1 */ + out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 0; out[11] = 0; + memcpy(out + 12, q + 12, (size_t)qsec); + return 12 + qsec; +} +/* 读 RR owner 域名(支持压缩指针,最多 64 跳);返回字段结束偏移(type 起始处),失败 -1。 */ +static int dns_read_name(const uint8_t *r, int rlen, int start, char *out, int outcap) +{ + int off = start, after = -1, di = 0, first = 1, len = 0, guard = 0; + while (off < rlen && guard++ < 64) { + uint8_t l = r[off]; + if (l == 0) { if (after < 0) after = off + 1; break; } + if (l & 0xC0) { + if (off + 1 >= rlen) return -1; + if (after < 0) after = off + 2; /* 名字字段到此为止 */ + off = (int)(((l & 0x3F) << 8) | r[off + 1]); /* 跟随指针 */ + continue; + } + off++; + if (!first && di < outcap - 2) out[di++] = '.'; + first = 0; + for (int i = 0; i < l && off < rlen && di < outcap - 1; i++) out[di++] = (char)r[off++]; + len += l; + if (len > 253) return -1; + } + out[di] = 0; + return after; +} +static void dns_cache_from_response(const uint8_t *r, int rlen) +{ + if (rlen < 12) return; + if (r[3] & 0x0f) return; /* rcode 非0 不缓存 */ + uint16_t an = (uint16_t)((r[6] << 8) | r[7]); + int off = 12; + while (off < rlen) { /* 跳过 question */ + uint8_t l = r[off++]; + if (l == 0) break; + if (l & 0xC0) { off += 1; break; } + off += l; + } + off += 4; + for (int a = 0; a < an && off + 10 <= rlen; a++) { + char name[64]; + int at = dns_read_name(r, rlen, off, name, sizeof name); + if (at < 0 || at + 10 > rlen) break; + uint16_t type = (uint16_t)((r[at] << 8) | r[at + 1]); + uint32_t ttl = ((uint32_t)r[at + 4] << 24) | (r[at + 5] << 16) | ((uint32_t)r[at + 6] << 8) | r[at + 7]; + uint16_t rdlen = (uint16_t)((r[at + 8] << 8) | r[at + 9]); + int data = at + 10; + if (data + rdlen > rlen) break; + if (type == 1 && rdlen >= 4 && name[0]) { /* A 记录 */ + uint32_t ip = ((uint32_t)r[data] << 24) | (r[data + 1] << 16) | ((uint32_t)r[data + 2] << 8) | r[data + 3]; + dns_cache_insert(name, ip, (uint16_t)(ttl > 65535 ? 65535 : ttl)); + } + off = data + rdlen; + } +} + +static void dns_handle_packet(void) +{ + uint8_t q[1536], rbuf[1536]; + struct sockaddr_in from; + socklen_t fl = sizeof from; + ssize_t n = recvfrom(g_dns_fd, q, sizeof q, 0, (struct sockaddr *)&from, &fl); + if (n < 12) return; + g_dns_q++; + char dom[DNS_QNAME_MAX]; + int qend = 0; + if (dns_parse_query(q, (int)n, dom, sizeof dom, &qend) != 0 || !dom[0]) return; + const char *entity = dns_entity_for_port((uint16_t)ntohs(from.sin_port)); + /* 域名规则:deny → NXDOMAIN + 日志 */ + if (dns_query_domain_denied(entity, dom)) { + g_dns_deny++; + net_log("warn", "dns", "deny entity=%s domain=%s", entity, dom); + uint8_t resp[1536]; + int rl = dns_build_nxdomain(q, (int)n, resp, sizeof resp); + if (rl > 0) sendto(g_dns_fd, resp, (size_t)rl, 0, (struct sockaddr *)&from, fl); + return; + } + /* 只记新域名首见(全量 debug 级,防日志爆炸) */ + int cached = dns_cache_lookup_name(dom); + if (cached != 0) { g_dns_first++; net_log("info", "dns", "first entity=%s domain=%s", entity, dom); } + /* 上游透传转发 */ + if (!g_dns_upstream[0]) { + net_log("warn", "dns", "no upstream, drop domain=%s", dom); + return; + } + struct sockaddr_in up; + memset(&up, 0, sizeof up); + up.sin_family = AF_INET; + up.sin_port = htons((uint16_t)g_dns_upstream_port); + if (inet_pton(AF_INET, g_dns_upstream, &up.sin_addr) != 1) return; + sendto(g_dns_up_fd, q, (size_t)n, 0, (struct sockaddr *)&up, sizeof up); + struct pollfd pf = { g_dns_up_fd, POLLIN, 0 }; + int pr = poll(&pf, 1, DNS_UPSTREAM_TMO_MS); + if (pr > 0) { + ssize_t rn = recv(g_dns_up_fd, rbuf, sizeof rbuf, 0); + if (rn > 12) { + dns_cache_from_response(rbuf, (int)rn); + sendto(g_dns_fd, rbuf, (size_t)rn, 0, (struct sockaddr *)&from, fl); + } + } else { + net_log("warn", "dns", "upstream timeout domain=%s", dom); + } +} + +static void dns_self_check(void) +{ + char buf[384]; + if (resolv_read_file(buf, sizeof buf) <= 0) return; + /* 若我们的双行头丢失(第三方/udhcpc 改回)→ 重写并记日志。 */ + if (strstr(buf, "nameserver 127.0.0.1") == NULL) { + net_log("warn", "dns", "resolv.conf reverted by third-party — re-apply"); + resolv_backup_apply(); + } +} + +/* ---- 期 2 IPC 文本构建 ---- */ +static int build_conns_text(const char *filter, char *out, size_t cap, int *truncated) +{ + if (truncated) *truncated = 0; + out[0] = 0; + size_t off = 0; + long now = mono_now(); + for (int i = 0; i < g_conn_n; i++) { + conn_t *c = &g_conn[i]; + if (filter && filter[0] && strncmp(c->entity, filter, strlen(filter)) != 0) continue; + char lip[32], rip[32]; + ip_fmt(c->local_ip, lip, sizeof lip); + ip_fmt(c->remote_ip, rip, sizeof rip); + const char *dom = c->domain[0] ? c->domain : "-"; /* 空域名占位,保字段数固定 6 */ + char line[192]; + int n; + if (c->type) { + n = snprintf(line, sizeof line, "%s|%s:%u|%s:%u|UDP|%ld|%s\n", + c->entity, lip, c->local_port, rip, c->remote_port, + now - c->mono_open, dom); + } else { + n = snprintf(line, sizeof line, "%s|%s:%u|%s:%u|%s|%ld|%s\n", + c->entity, lip, c->local_port, rip, c->remote_port, + tcp_state_str(c->state_code), now - c->mono_open, dom); + } + if (n <= 0) continue; + if (off + (size_t)n >= cap - 1) { if (truncated) *truncated = 1; break; } + memcpy(out + off, line, (size_t)n); + off += (size_t)n; + } + out[off] = 0; + return (int)off; +} + +static int build_dns_ctl_text(const char *cmd, char *out, size_t cap) +{ + out[0] = 0; + if (!strcmp(cmd, "stats") || !strcmp(cmd, "status")) { + long now = mono_now(); + int hits = 0; + for (int i = 0; i < g_dns_n; i++) if (g_dns[i].name[0] && g_dns[i].exp > now) hits++; + snprintf(out, cap, + "dns mode=%s enabled=%d upstream=%s cache=%d/%d q=%llu deny=%llu first=%llu resolv_modified=%d\n", + g_mode_meow ? "meow" : "readonly", g_dns_enabled, + g_dns_upstream[0] ? g_dns_upstream : "(none)", hits, g_dns_n, + (unsigned long long)g_dns_q, (unsigned long long)g_dns_deny, + (unsigned long long)g_dns_first, g_dns_modified_resolv); + } else if (!strcmp(cmd, "flush")) { + dns_cache_flush(); + snprintf(out, cap, "dns cache flushed (%d entries)\n", g_dns_n); + } else { + snprintf(out, cap, "dns: cmd 须 status|stats|flush\n"); + return MEOW_ERR_INVAL; + } + return MEOW_OK; +} + /* ---------------- 节拍:模式热切换 + 接口变化检测(日志)+ 全局速率差分 ---------------- */ static void daemon_tick(void) { @@ -909,6 +1731,17 @@ static void daemon_tick(void) if (fm != g_mode_meow) { svc_log("mode -> %s", fm ? "full(meow)" : "readonly"); g_mode_meow = fm; + /* 模式热切换 → DNS 代理开关(HibyOS 绝不启用/绝不改 resolv.conf)。 */ + if (fm && !g_dns_disabled) dns_proxy_start(); + else if (!fm && g_dns_enabled) dns_proxy_stop(); + } + /* DNS:MeowOS 下 5s 自检 resolv.conf 未被第三方改回。 */ + if (g_dns_enabled) { + long now1 = mono_now(); + if (now1 - g_last_resolv_check >= DNS_RESOLV_CHECK_SEC) { + g_last_resolv_check = now1; + dns_self_check(); + } } /* 接口热插拔/状态变化:节拍检测 → 日志(读侧无 popen)。 */ enum_ifaces(0); @@ -950,6 +1783,9 @@ static void daemon_tick(void) } g_net_last_rx = rx; g_net_last_tx = tx; g_net_last_mono = now; } + + /* 期2 连接普查(读侧:观察层,HibyOS 只读模式同样运行;不含写操作)。 */ + census_run(); } /* ---------------- IPC 鉴权(连接级,MPK_SIGNATURE_DESIGN §6.2;同 svc_power) ---------------- */ @@ -1378,20 +2214,71 @@ static void handle_conn(int c) send_net_bt_result(c, req_id, &r); continue; } - send_err(c, req_id, MEOW_ERR_INVAL, "unknown type (期1仅 STATUS/IFACE/WIFI_CTL/BT_CTL)"); + if (type == MSG_NET_CONNS_REQ) { + /* 期2 观测层:读级任意调用者。返回连接表文本(可实体过滤)。 */ + m_net_conns_req_t q; + memset(&q, 0, sizeof q); + if (rlen > sizeof q) rlen = sizeof q; + memcpy(&q, payload, rlen); + m_net_conns_result_t res; + memset(&res, 0, sizeof res); + int tr = 0; + int n = build_conns_text(q.entity, res.text, sizeof res.text, &tr); + res.code = MEOW_OK; + res.truncated = (uint16_t)(tr ? 1 : 0); + size_t tl = n > 0 ? (size_t)n : 0; + if (tl > sizeof res.text - 1) tl = sizeof res.text - 1; + res.text_len = (uint16_t)tl; + res.text[tl] = 0; + send_frame(c, MSG_NET_CONNS_RESULT, req_id, &res, (uint32_t)(8 + tl + 1)); + continue; + } + if (type == MSG_NET_DNS_CTL) { + m_net_dns_ctl_t q; + memset(&q, 0, sizeof q); + if (rlen > sizeof q) rlen = sizeof q; + memcpy(&q, payload, rlen); + m_net_dns_result_t res; + memset(&res, 0, sizeof res); + int write = strcmp(q.cmd, "flush") == 0; /* flush=清缓存(动作级) */ + int rc = MEOW_OK; + if (write && !is_sys_identity(&caller)) { + rc = MEOW_ERR_PERM; + snprintf(res.text, sizeof res.text, "permission denied (dns flush needs system identity)"); + net_log("warn", "write", "denied dns flush caller_kind=%d uid=%d", (int)caller.kind, (int)caller.uid); + } else if (write && !g_mode_meow) { + rc = MEOW_ERR_PERM; + snprintf(res.text, sizeof res.text, "readonly (HibyOS mode): dns flush denied"); + net_log("warn", "write", "denied dns flush (HibyOS readonly)"); + } else if (g_dns_disabled) { + snprintf(res.text, sizeof res.text, "dns: proxy disabled (MEOW_DNS_DISABLE)"); + rc = MEOW_ERR_NODEV; + } else { + rc = build_dns_ctl_text(q.cmd, res.text, sizeof res.text); + } + res.code = (uint32_t)rc; + size_t tl = strlen(res.text); + if (tl > sizeof res.text - 1) tl = sizeof res.text - 1; + res.text_len = (uint16_t)tl; + send_frame(c, MSG_NET_DNS_RESULT, req_id, &res, (uint32_t)(8 + tl + 1)); + continue; + } + send_err(c, req_id, MEOW_ERR_INVAL, "unknown type (期1 STATUS/IFACE/WIFI_CTL/BT_CTL; 期2 CONNS/DNS_CTL)"); break; } } -/* ---------------- 守护主循环(单线程 poll;节拍 2s) ---------------- */ +/* ---------------- 守护主循环(单线程 poll;节拍 2s + DNS UDP) ---------------- */ static volatile sig_atomic_t g_stop = 0; static void on_sig(int sig) { (void)sig; g_stop = 1; } +static void on_hup(int sig) { (void)sig; g_hup = 1; } static int run_daemon(const char *sock) { signal(SIGPIPE, SIG_IGN); signal(SIGTERM, on_sig); signal(SIGINT, on_sig); + signal(SIGHUP, on_hup); int lfd = socket(AF_UNIX, SOCK_STREAM, 0); if (lfd < 0) { svc_log("socket fail: %s", strerror(errno)); return 1; } struct sockaddr_un a; @@ -1409,11 +2296,23 @@ static int run_daemon(const char *sock) g_mode_meow = boot_mode_is_meow(); log_open(); - svc_log("meow_netmgrd listening on %s (mode=%s, poll=%ds, log=%s)", - sock, g_mode_meow ? "full" : "readonly", g_poll_sec, g_logfile); + rules_load(); + atexit(dns_atexit_restore); /* 崩溃/退出兜底:恢复原 resolv.conf */ + /* MeowOS 启动即启用 DNS 代理(节点拍重判只在模式切换时触发,此处显式首启)。 */ + if (g_mode_meow && !g_dns_disabled) { + dns_proxy_start(); + g_last_resolv_check = mono_now(); + } + svc_log("meow_netmgrd listening on %s (mode=%s, poll=%ds, log=%s, dns=%s)", + sock, g_mode_meow ? "full" : "readonly", g_poll_sec, g_logfile, + g_dns_enabled ? "on" : "off"); long next_tick = 0; while (!g_stop) { + if (g_hup) { /* SIGHUP:恢复并重挂 DNS 代理(若仍 MeowOS) */ + g_hup = 0; + if (g_dns_enabled) { dns_proxy_stop(); if (g_mode_meow && !g_dns_disabled) dns_proxy_start(); } + } long now = mono_now(); if (now >= next_tick) { daemon_tick(); @@ -1428,6 +2327,11 @@ static int run_daemon(const char *sock) int c = accept(lfd, NULL, NULL); if (c >= 0) { handle_conn(c); close(c); } } + /* DNS 代理(UDP 127.0.0.1:port):非阻塞单包处理。 */ + if (g_dns_fd >= 0) { + struct pollfd dan = { g_dns_fd, POLLIN, 0 }; + if (poll(&dan, 1, 0) > 0 && (dan.revents & POLLIN)) dns_handle_packet(); + } } svc_log("meow_netmgrd exit"); close(lfd); @@ -1660,17 +2564,134 @@ static int cli_iface(const char *name) return 0; } +/* ---- 期2 CLI:conns/apps/top/dns(CONNS_RESULT 逐行 `entity|lip:lport|rip:rport|state|age|domain`) ---- */ +static int cli_conns(const char *filter) +{ + char js[MEOW_IPC_MAX]; + m_net_conns_req_t q; + memset(&q, 0, sizeof q); + if (filter) snprintf(q.entity, sizeof q.entity, "%s", filter); + if (cli_ipc_json(MSG_NET_CONNS_REQ, &q, sizeof q, js, sizeof js) != 0) { + fprintf(stderr, "meow_net conns: 守护不可达(%s)\n", g_sock); + return 1; + } + int n = 0; + char *ln = js; + while (ln && *ln) { + char *nl = strchr(ln, '\n'); if (nl) *nl = 0; + char *f[7]; int nf = 0; + char *save = NULL; + for (char *t = strtok_r(ln, "|", &save); t && nf < 7; t = strtok_r(NULL, "|", &save)) f[nf++] = t; + if (nf >= 6) { + printf("%-26s %-22s -> %-22s %-9s %5lds %s\n", f[0], f[1], f[2], f[3], + atol(f[4]), f[5]); + n++; + } + if (!nl) break; + ln = nl + 1; + } + printf("(%d connection%s%s)\n", n, n == 1 ? "" : "s", filter && filter[0] ? " filtered" : ""); + return 0; +} + +typedef struct { char ent[48]; int cnt; long maxage; } ent_grp_t; +/* 从 conns 文本聚合实体统计(apps/top 共用)。 */ +static int group_conns(const char *js, ent_grp_t *grp, int max) +{ + int gn = 0; + char *ln = (char *)js; + while (ln && *ln && gn < max) { + char *nl = strchr(ln, '\n'); if (nl) *nl = 0; + char *f[7]; int nf = 0; + char *save = NULL; + for (char *t = strtok_r(ln, "|", &save); t && nf < 7; t = strtok_r(NULL, "|", &save)) f[nf++] = t; + if (nf >= 5 && f[0][0]) { + int gi = -1; + for (int i = 0; i < gn; i++) if (strcmp(grp[i].ent, f[0]) == 0) { gi = i; break; } + if (gi < 0) { + if (gn >= max) continue; + gi = gn++; + snprintf(grp[gi].ent, sizeof grp[gi].ent, "%s", f[0]); + grp[gi].cnt = 0; grp[gi].maxage = 0; + } + grp[gi].cnt++; + long a = atol(f[4]); + if (a > grp[gi].maxage) grp[gi].maxage = a; + } + if (!nl) break; + ln = nl + 1; + } + /* 按 cnt 降序 */ + for (int i = 0; i < gn; i++) + for (int j = i + 1; j < gn; j++) + if (grp[j].cnt > grp[i].cnt) { + ent_grp_t t = grp[i]; grp[i] = grp[j]; grp[j] = t; + } + return gn; +} + +static int cli_apps(void) +{ + char js[MEOW_IPC_MAX]; + if (cli_ipc_json(MSG_NET_CONNS_REQ, NULL, 0, js, sizeof js) != 0) { + fprintf(stderr, "meow_net apps: 守护不可达(%s)\n", g_sock); + return 1; + } + ent_grp_t grp[64]; + int gn = group_conns(js, grp, 64); + printf("%-26s %6s %8s\n", "entity", "conns", "max_age"); + for (int i = 0; i < gn; i++) + printf("%-26s %6d %8lds\n", grp[i].ent, grp[i].cnt, grp[i].maxage); + return 0; +} + +static volatile sig_atomic_t g_cli_stop = 0; +static void cli_sigint(int sig) { (void)sig; g_cli_stop = 1; } + +static int cli_top(void) +{ + g_cli_stop = 0; + signal(SIGINT, cli_sigint); + while (!g_cli_stop) { + char js[MEOW_IPC_MAX]; + if (cli_ipc_json(MSG_NET_CONNS_REQ, NULL, 0, js, sizeof js) != 0) { + fprintf(stderr, "meow_net top: 守护不可达(%s)\n", g_sock); + return 1; + } + ent_grp_t grp[64]; + int gn = group_conns(js, grp, 64); + printf("\033[2J\033[H top 连接实体(2s 刷新,Ctrl-C 退)\n"); + printf("%-26s %6s %8s\n", "entity", "conns", "max_age"); + for (int i = 0; i < gn && i < 10; i++) + printf("%-26s %6d %8lds\n", grp[i].ent, grp[i].cnt, grp[i].maxage); + for (int i = 0; i < 10 - gn && i < 10; i++) printf("\n"); + fflush(stdout); + sleep(2); + } + printf("\n"); + return 0; +} + +static int cli_dns(const char *cmd) +{ + char out[MEOW_IPC_MAX - 8]; + int code = cli_ipc_cmd(MSG_NET_DNS_CTL, cmd ? cmd : "status", NULL, out, sizeof out); + printf("%s\n", out); + return code == MEOW_OK ? 0 : 1; +} + static const char *usage(void) { return "status | iface [name] | wifi scan|networks|connect [,psk]|disconnect|on|off" - " | bt status|on|off|paired | rfkill [ ] | udhcpc renew|release [if] | help"; + " | bt status|on|off|paired | rfkill [ ] | udhcpc renew|release [if]" + " | apps | conns [entity] | top | dns status|stats|flush | help"; } static int cli_help(void) { printf("meow_net — MeowOS 网络管理 CLI(meow_netmgrd 的 IPC 薄壳)\n"); printf("usage: meow_net <%s>\n", usage()); - printf("\n读级任意调用者;写级(wifi/bt on|off、connect、rfkill set、udhcpc)仅系统身份,且 HibyOS 模式只读。\n"); + printf("\n读级任意调用者;写级(wifi/bt on|off、connect、rfkill set、udhcpc、dns flush)仅系统身份,且 HibyOS 模式只读。\n"); return 0; } @@ -1682,6 +2703,13 @@ static int cli_run(int n, char **v) if (!strcmp(cmd, "status")) return cli_status(); if (!strcmp(cmd, "iface")) return cli_iface(arg); if (!strcmp(cmd, "help") || !strcmp(cmd, "-h") || !strcmp(cmd, "--help")) return cli_help(); + if (!strcmp(cmd, "apps")) return cli_apps(); + if (!strcmp(cmd, "conns")) return cli_conns(arg); + if (!strcmp(cmd, "top")) return cli_top(); + if (!strcmp(cmd, "dns")) { + if (!arg) { fprintf(stderr, "dns 子命令缺失(status|stats|flush)\n"); return 1; } + return cli_dns(arg); + } if (!strcmp(cmd, "wifi")) { if (!arg) { fprintf(stderr, "wifi 子命令缺失(%s)\n", usage()); return 1; } if (!strcmp(arg, "on") || !strcmp(arg, "off")) return cli_cmd_result(MSG_NET_WIFI_CTL, arg, NULL); @@ -1733,6 +2761,15 @@ int main(int argc, char **argv) if ((e = getenv("MEOW_WIFI_IF")) && e[0]) g_wifi_if = e; if ((e = getenv("MEOW_NET_SOCK")) && e[0]) g_sock = e; if ((e = getenv("MEOW_NET_POLL_SEC")) && atoi(e) > 0) g_poll_sec = atoi(e); + if ((e = getenv("MEOW_TCP")) && e[0]) snprintf(g_proc_tcp, sizeof g_proc_tcp, "%s", e); + if ((e = getenv("MEOW_UDP")) && e[0]) snprintf(g_proc_udp, sizeof g_proc_udp, "%s", e); + if ((e = getenv("MEOW_AMS_SOCK")) && e[0]) snprintf(g_ams_sock, sizeof g_ams_sock, "%s", e); + if ((e = getenv("MEOW_SVCD_SOCK")) && e[0]) snprintf(g_svcd_sock, sizeof g_svcd_sock, "%s", e); + if ((e = getenv("MEOW_SVCD_STATUS")) && e[0]) snprintf(g_svcd_status, sizeof g_svcd_status, "%s", e); + if ((e = getenv("MEOW_NET_POLICY")) && e[0]) snprintf(g_net_policy, sizeof g_net_policy, "%s", e); + if ((e = getenv("MEOW_DNS_PORT")) && atoi(e) > 0 && atoi(e) < 65536) g_dns_port = atoi(e); + if ((e = getenv("MEOW_DNS_UPSTREAM_PORT")) && atoi(e) > 0 && atoi(e) < 65536) g_dns_upstream_port = atoi(e); + if ((e = getenv("MEOW_DNS_DISABLE")) && atoi(e) > 0) g_dns_disabled = 1; int i = 1; for (; i < argc; i++) { diff --git a/patch_v2/meow_netmgrd/meow_netmgrd_host b/patch_v2/meow_netmgrd/meow_netmgrd_host index 51522a4dca381e85c0360e00f5a2f622c863b0f6..2bc88071327f8fc865e2c263d968f0a24fe31efe 100755 GIT binary patch literal 81512 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 literal 77656 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 bdj2#_^dFm_6*G3&jJGUcQM#Q7saUQ6sb!ka diff --git a/patch_v2/meow_netmgrd/netmgrd_authtest b/patch_v2/meow_netmgrd/netmgrd_authtest index 0d0cb99ef61c762d68ad2242c623c7ba876b5b7c..9bb731d236fd1c072af26922258a10988c3e979f 100755 GIT binary patch literal 149208 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 "$T/resolv" echo meow > "$T/boot_mode" +# ---- 期2 观测层打桩:/proc/net/{tcp,udp}(IPv4 LE hex)+ 域名规则 conf + amsd/svcd 缺省 ---- +cat > "$T/tcp" <<'EOF' + sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode + 0: 32C14E0A:5137 0905CD8C:01BB 01 00000000:00000000 00:00000000 00000000 1000 0 12345 1 0 0 10 0 + 1: 32C14E0A:4F32 32C34E0A:01BB 01 00000000:00000000 00:00000000 00000000 1000 0 12346 1 0 0 10 0 + 2: 32C14E0A:0A00 00000000:0000 07 00000000:00000000 00:00000000 00000000 1000 0 67890 1 0 0 10 0 +EOF +cat > "$T/udp" <<'EOF' + sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode + 0: 0100007F:D301 0100007F:0035 07 00000000:00000000 00:00000000 00000000 0 0 99999 1 0 0 10 0 +EOF +printf 'app:dev.player.ncm domain=-ads.example.com\nproc:dropbear domain=+x\n' > "$T/policy" + # 桩后端命令(popen stubbing) cat > "$T/wpa_cli" <<'EOF' #!/bin/sh @@ -75,10 +88,13 @@ EOF for f in wpa_cli hciconfig bluetoothctl ip; do chmod +x "$T/$f"; done mkdir -p "$T/logs" "$T/pid" +# 期2:DNS 禁用(宿主无 root 不绑 53),观测层经 MEOW_TCP/UDP 打桩;amsd/svcd 缺省(实体归因走 proc:comm→unknown)。 ENVS="MEOW_NET_DIR=$NET MEOW_NETDEV=$T/netdev MEOW_NET_ROUTE=$T/route MEOW_RESOLV=$T/resolv MEOW_RFKILL_DIR=$RF MEOW_BT_DIR=$BT MEOW_BOOT_MODE=$T/boot_mode MEOW_BOOTTS_CACHE=$T/bootts MEOW_IP=$T/ip MEOW_WPA_CLI=$T/wpa_cli MEOW_HCICONFIG=$T/hciconfig MEOW_BLUETOOTHCTL=$T/bluetoothctl - MEOW_NET_SOCK=$T/net.sock MEOW_NET_POLL_SEC=1 MEOW_LOG_DIR=$T/logs" + MEOW_NET_SOCK=$T/net.sock MEOW_NET_POLL_SEC=1 MEOW_LOG_DIR=$T/logs + MEOW_TCP=$T/tcp MEOW_UDP=$T/udp MEOW_NET_POLICY=$T/policy + MEOW_AMS_SOCK=$T/no_ams MEOW_SVCD_SOCK=$T/no_svcd MEOW_DNS_DISABLE=1" ln -sf "$(readlink -f "$BIN")" "$T/meow_net" # argv[0] 双形态 → CLI # ---- T0: 守护起 ---- @@ -159,6 +175,95 @@ ck T9a "usage: meow_net" "$OUT" OUT=$(env $ENVS $Q "$T/meow_net" bogus 2>&1); RC=$? ck T9b "usage: meow_net" "$OUT" +# ---- 重启 daemon A(T8 已停)供期2 观测/连接表/日志测试 ---- +env $ENVS $Q "$BIN" --sock "$T/net.sock" >"$T/daemon2.log" 2>&1 & +DPID=$! +for i in $(seq 1 30); do [ -S "$T/net.sock" ] && break; sleep 0.2; done +[ -S "$T/net.sock" ] || { echo "FAIL T10-pre: daemon 未重启"; cat "$T/daemon2.log"; exit 1; } + +# ---- T10: 期2 conns(读级;观测层经 MEOW_TCP/UDP 桩 + amsd/svcd 缺省 → proc:unknown 归因)---- +sleep 1 # 等守护普查一拍 +OUT=$(env $ENVS $Q "$T/meow_net" conns 2>&1) +ck T10a "proc:unknown" "$OUT" +ck T10b "10.78.193.50:20791" "$OUT" +ck T10b2 "140.205.5.9:443" "$OUT" +ck T10c "ESTAB" "$OUT" +ck T10d "UDP" "$OUT" +ck T10e "connection" "$OUT" +# ---- T11: apps(实体聚合)---- +OUT=$(env $ENVS $Q "$T/meow_net" apps 2>&1) +ck T11a "entity" "$OUT" +ck T11b "proc:unknown" "$OUT" +# ---- T12: dns status/stats(DNS 禁用 → 显示 disabled)---- +OUT=$(env $ENVS $Q "$T/meow_net" dns status 2>&1) +ck T12a "proxy disabled" "$OUT" +OUT=$(env $ENVS $Q "$T/meow_net" dns stats 2>&1) +ck T12b "proxy disabled" "$OUT" +# ---- T13: dns flush(写级;宿主 CLI=CALL_OTHER → 拒)---- +OUT=$(env $ENVS $Q "$T/meow_net" dns flush 2>&1) +ck T13a "permission denied" "$OUT" + +# ---- T14: DNS 代理 wire 实测(守护 B:高端口 + 桩上游 + 全局 deny;测 deny/forward/cache)---- +HOSTIP=$(hostname -I 2>/dev/null | awk '{print $1}') +[ -n "$HOSTIP" ] || HOSTIP="127.0.0.1" +cat > "$T/policy_dns" <<'EOF' +global domain=-ads.example.com +EOF +printf 'nameserver %s\n' "$HOSTIP" > "$T/resolv_dns" +cat > "$T/dns_test.py" <<'PYEOF' +import socket, struct, threading, sys, os +UP_IP = os.environ.get("T_UP_IP", "0.0.0.0") +up = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +up.bind((UP_IP, 5311)) # 0.0.0.0 通配,绑到宿主自身 IP +up.settimeout(6) +def serve(): + try: + while True: + d,a = up.recvfrom(1536) + off=12 + while d[off]!=0: off += 1+d[off] + off += 1+4 + qsec = d[12:off] + resp = d[:2] + b'\x81\x80' + b'\x00\x01\x00\x01\x00\x00\x00\x00' + qsec + resp += b'\xc0\x0c' + b'\x00\x01\x00\x01' + struct.pack('>I',60) + b'\x00\x04' + socket.inet_aton('11.22.33.44') + up.sendto(resp, a) + except Exception: + pass +threading.Thread(target=serve, daemon=True).start() +def query(name): + s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.settimeout(3) + hdr=b'\x12\x34'+b'\x01\x00'+b'\x00\x01\x00\x00\x00\x00\x00\x00' + q=b''.join(bytes([len(l)])+l.encode() for l in name.split('.'))+b'\x00'+b'\x00\x01\x00\x01' + s.sendto(hdr+q, ("127.0.0.1", 5300)) + r,_=s.recvfrom(1536); rco=r[3]&0xf; an=struct.unpack('>H',r[6:8])[0] + return rco,an +try: + d1,a1 = query("ads.example.com") # deny → NXDOMAIN (rcode 3) + d2,a2 = query("music.163.com") # allow → forward → A 11.22.33.44 + sys.stdout.write("DENY_RCODE=%d\nALLOW_AN=%d\n" % (d1, a2)) +except Exception as e: + sys.stdout.write("ERR=%s\n" % e) +PYEOF +# 追加式覆写(env 左→右,后者胜出):DNS 启用、换独立 socket/resolv/policy、上游端口。 +DNSENV="$ENVS MEOW_DNS_DISABLE=0 MEOW_NET_SOCK=$T/dns.sock MEOW_RESOLV=$T/resolv_dns + MEOW_NET_POLICY=$T/policy_dns MEOW_DNS_PORT=5300 MEOW_DNS_UPSTREAM_PORT=5311" +ln -sf "$(readlink -f "$BIN")" "$T/dns_netmgrd" +env $DNSENV $Q "$BIN" --sock "$T/dns.sock" >"$T/dnsd.log" 2>&1 & +D2PID=$! +for i in $(seq 1 30); do [ -S "$T/dns.sock" ] && break; sleep 0.2; done +sleep 1 +OUT=$(env $DNSENV $Q "$T/meow_net" dns status 2>&1) +ck T14a "enabled=1 upstream=$HOSTIP" "$OUT" +WIRE=$(python3 "$T/dns_test.py" 2>&1) +ck T14b "DENY_RCODE=3" "$WIRE" +ck T14c "ALLOW_AN=1" "$WIRE" +OUT=$(env $DNSENV $Q "$T/meow_net" dns stats 2>&1) +ck T14d "q=2" "$OUT" +ck T14e "deny=1" "$OUT" +kill $D2PID 2>/dev/null; wait $D2PID 2>/dev/null +# 恢复守护 A 的 MEOW_RESOLV(其未被 DNS 触碰,此处确认) +grep -q "nameserver 223.5.5.5" "$T/resolv" && { PASS=$((PASS+1)); echo "PASS T14f daemonA resolv untouched"; } || { FAIL=$((FAIL+1)); echo "FAIL T14f daemonA resolv touched"; } + echo "==============================" echo "PASS=$PASS FAIL=$FAIL" [ $FAIL -eq 0 ] diff --git a/patch_v2/meow_netmgrd/test_netmgrd_p2 b/patch_v2/meow_netmgrd/test_netmgrd_p2 new file mode 100755 index 0000000000000000000000000000000000000000..10e59f0b7944529664b1fe3bcf775d9c5954bbe7 GIT binary patch literal 82232 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/fd 归因留真机验证。 + * + * 用法:cc -Wall -Wextra -I../meow_launcherd test_netmgrd_p2.c -o test_netmgrd_p2 && ./test_netmgrd_p2 + */ +#define main meow_netmgrd_prod_main_unused +#include "meow_netmgrd.c" +#undef main + +#include +#include +#include +#include +#include + +static int g_fail = 0; +#define CHECK(cond) do { if (!(cond)) { printf(" FAIL: %s (line %d)\n", #cond, __LINE__); g_fail++; } \ + else { printf(" ok : %s\n", #cond); } } while (0) + +static void wf(const char *p, const char *s) +{ + FILE *f = fopen(p, "w"); + if (f) { fputs(s, f); fclose(f); } +} + +static int make_query(const char *name, uint8_t *out) +{ + memset(out, 0, 16); + out[0] = 0x12; out[1] = 0x34; /* id */ + out[2] = 0x01; out[3] = 0x00; /* RD */ + out[4] = 0; out[5] = 1; /* qdcount=1 */ + int off = 12; + const char *p = name; + while (*p) { + const char *dot = strchr(p, '.'); + size_t l = dot ? (size_t)(dot - p) : strlen(p); + out[off++] = (uint8_t)l; + memcpy(out + off, p, l); off += (int)l; + p = dot ? dot + 1 : p + l; + } + out[off++] = 0; + out[off++] = 0; out[off++] = 1; /* qtype=A */ + out[off++] = 0; out[off++] = 1; /* qclass=IN */ + return off; +} + +static int make_a_response(const char *name, const char *ip, uint8_t *out) +{ + int ql = make_query(name, out); + out[0] = 0x12; out[1] = 0x34; + out[2] = 0x81; out[3] = 0x80; /* QR|RD|RA */ + out[6] = 0; out[7] = 1; /* ancount=1 */ + int off = ql; + out[off++] = 0xC0; out[off++] = 0x0C; /* answer name pointer → offset 12 (question) */ + out[off++] = 0; out[off++] = 1; /* type A */ + out[off++] = 0; out[off++] = 1; /* class IN */ + out[off++] = 0; out[off++] = 0; out[off++] = 0; out[off++] = 0x3C; /* ttl=60 */ + out[off++] = 0; out[off++] = 4; /* rdlen=4 */ + int b0 = 0, b1 = 0, b2 = 0, b3 = 0; + sscanf(ip, "%d.%d.%d.%d", &b0, &b1, &b2, &b3); + out[off++] = (uint8_t)b0; out[off++] = (uint8_t)b1; + out[off++] = (uint8_t)b2; out[off++] = (uint8_t)b3; + return off; +} + +int main(void) +{ + static const char *T = "/tmp/nmg_p2"; + char path[192]; + mkdir(T, 0755); + uint8_t q[256], r[512]; + + printf("== dns_parse_query ==\n"); + { + int ql = make_query("music.163.com", q); + char dom[DNS_QNAME_MAX]; int qend = 0; + CHECK(dns_parse_query(q, ql, dom, sizeof dom, &qend) == 0); + CHECK(strcmp(dom, "music.163.com") == 0); + CHECK(qend == ql); + } + printf("== dns_build_nxdomain ==\n"); + { + int ql = make_query("ads.example.com", q); + uint8_t resp[300]; + int rl = dns_build_nxdomain(q, ql, resp, sizeof resp); + CHECK(rl > 12); + CHECK((resp[2] & 0x80) != 0); /* QR */ + CHECK((resp[3] & 0x0f) == 3); /* NXDOMAIN */ + CHECK(resp[0] == 0x12 && resp[1] == 0x34); /* id echoed */ + } + printf("== dns_cache insert/lookup/flush (TTL 尊重) ==\n"); + { + dns_cache_flush(); + CHECK(dns_cache_insert("music.163.com", 0x0A4EC132, 60) == 0); + char out[64]; + CHECK(dns_cache_lookup_ip(0x0A4EC132, out, sizeof out) == 0); + CHECK(strcmp(out, "music.163.com") == 0); + CHECK(dns_cache_lookup_name("music.163.com") == 0); + CHECK(dns_cache_lookup_name("absent.com") != 0); + dns_cache_flush(); + CHECK(dns_cache_lookup_name("music.163.com") != 0); + } + printf("== dns_cache_from_response(A 记录抓取)==\n"); + { + dns_cache_flush(); + int rl = make_a_response("music.163.com", "39.164.0.12", r); + dns_cache_from_response(r, rl); + char out[64]; + CHECK(dns_cache_lookup_ip(0x27A4000C, out, sizeof out) == 0); + CHECK(strcmp(out, "music.163.com") == 0); + } + printf("== suffix_match / rules_load / dns_query_domain_denied ==\n"); + { + CHECK(suffix_match("ads.example.com", "example.com") == 1); + CHECK(suffix_match("sub.ads.example.com", "ads.example.com") == 1); + CHECK(suffix_match("example.com", "ads.example.com") == 0); + snprintf(path, sizeof path, "%s/policy", T); + wf(path, "# test\napp:dev.player.ncm domain=-ads.example.com,-tracker.net\nproc:dropbear domain=+k,l\n\n"); + g_net_policy[0] = 0; snprintf(g_net_policy, sizeof g_net_policy, "%s", path); + rules_load(); + CHECK(g_rule_n >= 2); + CHECK(dns_query_domain_denied("app:dev.player.ncm", "ads.example.com") == 1); + CHECK(dns_query_domain_denied("app:dev.player.ncm", "sub.ads.example.com") == 1); + CHECK(dns_query_domain_denied("app:dev.player.ncm", "music.163.com") == 0); + CHECK(dns_query_domain_denied("proc:dropbear", "k") == 0); /* allow 覆盖 */ + CHECK(dns_query_domain_denied("proc:dropbear", "l") == 1); /* deny */ + CHECK(dns_query_domain_denied("proc:other", "ads.example.com") == 0); /* 无实体规则 → 默认 allow */ + } + printf("== refresh_entity_maps(svcd 落盘状态文件 → svc: 实体)==\n"); + { + snprintf(path, sizeof path, "%s/svcd.status", T); + wf(path, "# meow_svcd status\ncard_present=1 wifi_up=1 services=2\n" + "svc=meowpanel state=running pid=1038 restart=0 exit=0 trigger=boot backoff_ms=2000\n" + "svc=meow_mdns state=running pid=1006 restart=0 exit=0 trigger=boot backoff_ms=2000\n"); + g_svcd_status[0] = 0; snprintf(g_svcd_status, sizeof g_svcd_status, "%s", path); + g_svcd_sock[0] = 0; snprintf(g_svcd_sock, sizeof g_svcd_sock, "%s/none.sock", T); + g_ams_sock[0] = 0; snprintf(g_ams_sock, sizeof g_ams_sock, "%s/none.sock", T); + g_pid_ent_n = 0; + refresh_entity_maps(); + char ent[48]; + entity_for_pid(1038, ent, sizeof ent); + CHECK(strcmp(ent, "svc:meowpanel") == 0); + entity_for_pid(1006, ent, sizeof ent); + CHECK(strcmp(ent, "svc:meow_mdns") == 0); + } + printf("== pid_ent_put / entity_for_pid(app/svc/proc:comm)==\n"); + { + g_pid_ent_n = 0; + pid_ent_put(123, "app:dev.player.ncm"); + pid_ent_put(456, "svc:meowpanel"); + char ent[48]; + entity_for_pid(123, ent, sizeof ent); + CHECK(strcmp(ent, "app:dev.player.ncm") == 0); + entity_for_pid(456, ent, sizeof ent); + CHECK(strcmp(ent, "svc:meowpanel") == 0); + /* proc::造一个 /proc-format comm 不可能,直接读当前 pid comm(非空即入 proc:) */ + int self = (int)getpid(); + snprintf(path, sizeof path, "/proc/%d/comm", self); + if (access(path, F_OK) == 0) { + entity_for_pid(self, ent, sizeof ent); + CHECK(strncmp(ent, "proc:", 5) == 0); + } + } + printf("== parse_proc_net(IPv4 地址/端口/inode)==\n"); + { + snprintf(path, sizeof path, "%s/tcp", T); + wf(path, " sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode\n" + " 0: 32C14E0A:5137 0905CD8C:01BB 01 00000000:00000000 00:00000000 00000000 1000 0 12345 1\n" + " 1: 32C14E0A:0A00 00000000:0000 07 00000000:00000000 00:00000000 00000000 1000 0 67890 1\n"); + g_proc_tcp[0] = 0; snprintf(g_proc_tcp, sizeof g_proc_tcp, "%s", path); + static conn_t cur[CONN_MAX]; + int n = 0; + CHECK(parse_proc_net(g_proc_tcp, 0, cur, &n) == 2); + CHECK(cur[0].local_port == 0x5137 && cur[0].remote_port == 0x01BB); + CHECK(cur[0].inode == 12345 && cur[0].state_code == 1); + char ip[32]; + ip_fmt(cur[0].local_ip, ip, sizeof ip); + CHECK(strcmp(ip, "10.78.193.50") == 0); + ip_fmt(cur[0].remote_ip, ip, sizeof ip); + CHECK(strcmp(ip, "140.205.5.9") == 0); + } + printf("== build_conns_text / build_dns_ctl_text ==\n"); + { + g_conn_n = 0; + conn_t c; + memset(&c, 0, sizeof c); + c.local_ip = hex_ip("32C14E0A"); c.local_port = 443; /* 10.78.193.50 */ + c.remote_ip = hex_ip("32C34E0A"); c.remote_port = 25565; /* 10.78.195.50 */ + c.state_code = 1; c.type = 0; c.inode = 555; c.pid = 12345; + snprintf(c.entity, sizeof c.entity, "app:dev.player.ncm"); + snprintf(c.domain, sizeof c.domain, "music.163.com"); + c.mono_open = mono_now(); c.last_seen = mono_now(); + g_conn[g_conn_n++] = c; + char out[512]; int tr = 0; + int len = build_conns_text(NULL, out, sizeof out, &tr); + CHECK(len > 0 && tr == 0); + CHECK(strstr(out, "app:dev.player.ncm|10.78.193.50:443|10.78.195.50:25565|ESTAB|0|music.163.com") != NULL); + char dout[256]; + CHECK(build_dns_ctl_text("status", dout, sizeof dout) == MEOW_OK); + CHECK(strstr(dout, "dns mode=") != NULL); + CHECK(build_dns_ctl_text("flush", dout, sizeof dout) == MEOW_OK); + } + + if (g_fail) { printf("\nNETMGR P2 TEST: %d FAIL\n", g_fail); return 1; } + printf("\nNETMGR P2 TEST: ALL PASS\n"); + return 0; +}