This commit is contained in:
riglen
2026-03-31 16:39:23 +08:00
parent 0d49398e2d
commit 09a9faa1be
7 changed files with 1274 additions and 37 deletions

View File

@@ -5,7 +5,7 @@ from pathlib import Path
import yaml
from app.config import get_settings
from app.models import AppConfig, ClientConfig, RuleConfig
from app.models import AppConfig, ClientConfig
def resolve_policy(policy: str, client: ClientConfig) -> str:
@@ -38,9 +38,31 @@ def load_rule_payload(path: Path) -> list[str]:
return lines
def _resolve_rule_lines(rule_name: str, app_config: AppConfig, client: ClientConfig) -> list[str]:
rule = app_config.rules[rule_name]
target = resolve_policy(rule.policy, client)
lines: list[str] = []
for payload_line in rule.payload:
line = f"{payload_line},{target}"
if rule.no_resolve:
line += ",no-resolve"
lines.append(line)
if rule.file:
line = f"RULE-SET,{rule_name},{target}"
if rule.no_resolve:
line += ",no-resolve"
lines.append(line)
return lines
def build_rule_provider_entries(app_config: AppConfig, client: ClientConfig, base_url: str, public_path: str):
providers: dict[str, dict] = {}
for name, rule in app_config.rules.items():
if not rule.file:
continue
entry = {
"behavior": rule.behavior,
"format": rule.format,
@@ -53,12 +75,8 @@ def build_rule_provider_entries(app_config: AppConfig, client: ClientConfig, bas
def build_rule_set_references(app_config: AppConfig, client: ClientConfig) -> list[str]:
refs: list[str] = []
for name, rule in app_config.rules.items():
target = resolve_policy(rule.policy, client)
line = f"RULE-SET,{name},{target}"
if rule.no_resolve:
line += ",no-resolve"
refs.append(line)
for name in app_config.rules:
refs.extend(_resolve_rule_lines(name, app_config, client))
refs.append(f"MATCH,{client.main_policy}")
return refs
@@ -66,7 +84,14 @@ def build_rule_set_references(app_config: AppConfig, client: ClientConfig) -> li
def build_inline_rules(app_config: AppConfig, client: ClientConfig) -> list[str]:
settings = get_settings()
lines: list[str] = []
for rule in app_config.rules.values():
for name, rule in app_config.rules.items():
for payload_line in rule.payload:
line = f"{payload_line},{resolve_policy(rule.policy, client)}"
if rule.no_resolve:
line += ",no-resolve"
lines.append(line)
if not rule.file:
continue
path = (settings.rules_dir / rule.file).resolve()
if not path.is_file() or settings.rules_dir.resolve() not in path.parents:
raise FileNotFoundError(f"Rule file missing: {rule.file}")