Dernière activité 1 month ago

Révision c5d1610b4feb7885bb637ee7cec786b4bc71b314

gistfile1.txt Brut
1def count_resolved(rules_dir, rule_name, key):
2 """Count entries in resolved rule field"""
3 try:
4 resolved = _rule_resolve_internal(rules_dir, rule_name)
5 print(len(resolved.get(key, [])))
6 except:
7 print(0)
8
9def _rule_resolve_internal(rules_dir, rule_name, visited=None):
10 """Internal recursive resolver — returns dict, does not print"""
11 if visited is None:
12 visited = set()
13 if rule_name in visited:
14 raise ValueError(f"Circular dependency detected: {rule_name}")
15 visited.add(rule_name)
16
17 rule_file = find_rule_file(rules_dir, rule_name)
18 with open(rule_file) as f:
19 rule = json.load(f)
20
21 merged = {
22 'allow_ips': [],
23 'allow_ports': [],
24 'block_ips': [],
25 'block_ports': [],
26 'dns_redirect': False
27 }
28
29 for base_name in rule.get('extends', []):
30 base = _rule_resolve_internal(rules_dir, base_name, visited.copy())
31 merged['allow_ips'] += base.get('allow_ips', [])
32 merged['allow_ports'] += base.get('allow_ports', [])
33 merged['block_ips'] += base.get('block_ips', [])
34 merged['block_ports'] += base.get('block_ports', [])
35 if base.get('dns_redirect'):
36 merged['dns_redirect'] = True
37
38 # Merge own fields — use .get() with defaults for all fields
39 merged['allow_ips'] = list(dict.fromkeys(
40 merged['allow_ips'] + rule.get('allow_ips', [])))
41 merged['allow_ports'] = list(dict.fromkeys(
42 merged['allow_ports'] + rule.get('allow_ports', [])))
43 merged['block_ips'] = list(dict.fromkeys(
44 merged['block_ips'] + rule.get('block_ips', [])))
45 merged['block_ports'] = list(dict.fromkeys(
46 merged['block_ports'] + rule.get('block_ports', [])))
47 if rule.get('dns_redirect', False):
48 merged['dns_redirect'] = True
49
50 merged['name'] = rule.get('name', rule_name)
51 merged['desc'] = rule.get('desc', '')
52 merged['group'] = rule.get('group', '')
53 merged['extends'] = rule.get('extends', [])
54 return merged