# -*- coding: utf-8 -*- """防火墙检测:只统计「针对当前这份程序」的阻止规则。 真机上出现的问题: 测试目录里的副本(dist_exe)和源码模式下的 python.exe 被 Windows 建了阻止规则,于是 check() 报「存在 N 条阻止规则」,界面弹红色警告。 但用户实际在用的那份安装(LanRemote-Agent\\)一条都没有,连接完全正常。 这是误报,会让人白折腾。 正确语义: * 阻止规则是**按程序完整路径**生效的,别人的规则与我无关 * 所以只统计 Program 等于当前可执行文件的那些 * 其余数量单独报告,供参考,不影响 ok """ from __future__ import annotations import ast import sys from pathlib import Path ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") FIREWALL = ROOT / "windows" / "lanremote" / "firewall.py" OLD = ''' tcp = rule_exists(RULE_TCP) udp = rule_exists(RULE_UDP) app_rule = app_rule_ok() blocked = list_block_rules() elevated = is_elevated() ''' NEW = ''' tcp = rule_exists(RULE_TCP) udp = rule_exists(RULE_UDP) app_rule = app_rule_ok() elevated = is_elevated() # 阻止规则按程序完整路径生效,所以只统计**针对当前这份程序**的。 # 测试目录的副本、源码模式下的 python.exe 被阻止,与本安装无关, # 不该在这里报红(真机上就是这么误报的)。 all_blocked = list_block_rules() exe_now = executable_path() if exe_now: want = os.path.normcase(os.path.abspath(exe_now)) blocked = [ item for item in all_blocked if os.path.normcase( os.path.abspath((item.get("Program") or "").strip('"'))) == want ] else: blocked = all_blocked blocked_others = len(all_blocked) - len(blocked) ''' OLD_RETURN = ''' "blocked": blocked, "blocked_count": len(blocked), "ok": ok, ''' NEW_RETURN = ''' "blocked": blocked, "blocked_count": len(blocked), "blocked_others": blocked_others, "ok": ok, ''' def main() -> int: text = FIREWALL.read_text(encoding="utf-8") ok = True for old, new, tag in ((OLD, NEW, "阻止规则过滤"), (OLD_RETURN, NEW_RETURN, "返回 blocked_others")): if old not in text: print(f" [失败] {tag} 锚点未匹配") ok = False else: text = text.replace(old, new, 1) if ok: FIREWALL.write_text(text, encoding="utf-8") print(" firewall.py: 阻止规则只统计当前程序") try: ast.parse(FIREWALL.read_text(encoding="utf-8")) print(" 语法: OK") except SyntaxError as exc: print(f" 语法错误: {exc}") ok = False return 0 if ok else 1 if __name__ == "__main__": sys.exit(main())