Последняя активность 1 month ago

gistfile1.txt Исходник
1def rule_list_data(rules_dir, meta_dir):
2 """Return all rule data including base rules and extends"""
3 import glob
4
5 # Count peers per rule from meta files
6 rule_peer_counts = {}
7 for f in glob.glob(f"{meta_dir}/*.meta"):
8 try:
9 with open(f) as mf:
10 meta = json.load(mf)
11 rule = meta.get('rule', '')
12 if rule:
13 rule_peer_counts[rule] = rule_peer_counts.get(rule, 0) + 1
14 except:
15 pass
16
17 # Read all rules — both normal and base
18 rule_files = (
19 sorted(glob.glob(f"{rules_dir}/*.rule")) +
20 sorted(glob.glob(f"{rules_dir}/base/*.rule"))
21 )
22
23 for rule_file in rule_files:
24 is_base = '/base/' in rule_file
25 try:
26 with open(rule_file) as f:
27 r = json.load(f)
28 name = r.get('name', '')
29 desc = r.get('desc', '')
30 group = r.get('group', '')
31 extends = ','.join(r.get('extends', []))
32 # Use resolved rule for counts
33 resolved = _rule_resolve_internal(rules_dir, name)
34 n_allows = len(resolved.get('allow_ips', [])) + \
35 len(resolved.get('allow_ports', []))
36 n_blocks = len(resolved.get('block_ips', [])) + \
37 len(resolved.get('block_ports', []))
38 peer_count = rule_peer_counts.get(name, 0)
39 rule_files_data.sort(key=lambda x: (x['is_base'], x['group'] == '', x['group'], x['name']))
40 print(f"{name}|{desc}|{n_allows}|{n_blocks}|{peer_count}|{extends}|{is_base}|{group}")
41 except:
42 pass