Sync subset from blackmatrix7/ios_rule_script

This commit is contained in:
2026-03-23 15:53:21 +08:00
parent 9a07ab3ec0
commit d1a9dadbe1
3 changed files with 71 additions and 9 deletions

View File

@@ -6,8 +6,12 @@ from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
SURGE_DIR = ROOT / "rule" / "Surge"
LOON_DIR = ROOT / "rule" / "Loon"
CLASH_DIR = ROOT / "rule" / "Clash"
SINGBOX_DIR = ROOT / "rule" / "sing-box"
LOON_DIR.mkdir(parents=True, exist_ok=True)
CLASH_DIR.mkdir(parents=True, exist_ok=True)
SINGBOX_DIR.mkdir(parents=True, exist_ok=True)
UPSTREAM_TARGETS = {
@@ -31,6 +35,32 @@ FIELD_MAP = {
"PROCESS-NAME": "process_name",
}
LOON_SUPPORTED_RULES = {
"DOMAIN-SUFFIX",
"DOMAIN",
"DOMAIN-KEYWORD",
"USER-AGENT",
"URL-REGEX",
"IP-CIDR",
"GEOIP",
"FINAL",
}
CLASH_SUPPORTED_RULES = {
"DOMAIN-SUFFIX",
"DOMAIN-KEYWORD",
"DOMAIN",
"SRC-IP-CIDR",
"IP-CIDR",
"IP-CIDR6",
"GEOIP",
"DST-PORT",
"SRC-PORT",
"MATCH",
"FINAL",
"PROCESS-NAME",
}
def build_rule_set(entries: dict[str, list[str]]) -> dict:
rules = []
@@ -63,6 +93,30 @@ def parse_surge_list(path: Path) -> dict:
return build_rule_set(entries)
def convert_for_target(path: Path, target_rules: set[str]) -> list[str]:
out: list[str] = []
for raw in path.read_text(encoding="utf-8").splitlines():
line = raw.rstrip()
stripped = line.strip()
if not stripped or stripped.startswith("#"):
out.append(line)
continue
parts = [part.strip() for part in stripped.split(",")]
if len(parts) < 2:
continue
kind = parts[0].upper()
if kind not in target_rules:
continue
if kind == "FINAL":
if target_rules is CLASH_SUPPORTED_RULES:
out.append(line.replace("FINAL,", "MATCH,", 1))
else:
out.append(line)
continue
out.append(line)
return out
MANUAL_RULESETS = {
"ManualBackHome": {"version": 3, "rules": [{"ip_cidr": ["192.168.10.0/24"]}]},
"ManualReject": {"version": 3, "rules": [{"domain": ["www.axure.com"]}]},
@@ -96,6 +150,12 @@ for name, filename in UPSTREAM_TARGETS.items():
encoding="utf-8",
)
loon_lines = convert_for_target(SURGE_DIR / filename, LOON_SUPPORTED_RULES)
(LOON_DIR / filename).write_text("\n".join(loon_lines).rstrip() + "\n", encoding="utf-8")
clash_lines = convert_for_target(SURGE_DIR / filename, CLASH_SUPPORTED_RULES)
(CLASH_DIR / filename).write_text("\n".join(clash_lines).rstrip() + "\n", encoding="utf-8")
for name, payload in MANUAL_RULESETS.items():
(SINGBOX_DIR / f"{name}.json").write_text(
json.dumps(payload, ensure_ascii=False, indent=2) + "\n",

View File

@@ -5,25 +5,20 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SURGE_DIR="$ROOT_DIR/rule/Surge"
SINGBOX_DIR="$ROOT_DIR/rule/sing-box"
UPSTREAM_BASE="https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge"
GITEA_ENV_FILE="$ROOT_DIR/../gitea/.env"
LOCAL_SYNC_ENV_FILE="$ROOT_DIR/.sync.env"
if [[ -f "$GITEA_ENV_FILE" ]]; then
source "$GITEA_ENV_FILE"
fi
if [[ -f "$LOCAL_SYNC_ENV_FILE" ]]; then
source "$LOCAL_SYNC_ENV_FILE"
fi
GITEA_REPO_OWNER="${GITEA_REPO_OWNER:-yuanzhen869}"
GITEA_REPO_NAME="${GITEA_REPO_NAME:-ios-rule-script-subset}"
GITEA_SYNC_USERNAME="${GITEA_SYNC_USERNAME:-${GITEA_ADMIN_USERNAME:-yuanzhen869}}"
GITEA_SYNC_EMAIL="${GITEA_SYNC_EMAIL:-${GITEA_ADMIN_EMAIL:-yuanzhen869@gmail.com}}"
GITEA_SYNC_PASSWORD="${GITEA_SYNC_PASSWORD:-${GITEA_SYNC_TOKEN:-${GITEA_ADMIN_PASSWORD:-}}}"
GITEA_SYNC_USERNAME="${GITEA_SYNC_USERNAME:-yuanzhen869}"
GITEA_SYNC_EMAIL="${GITEA_SYNC_EMAIL:-yuanzhen869@gmail.com}"
GITEA_SYNC_PASSWORD="${GITEA_SYNC_PASSWORD:-${GITEA_SYNC_TOKEN:-}}"
if [[ -z "${GITEA_SYNC_PASSWORD}" ]]; then
echo "missing push credential: set GITEA_SYNC_TOKEN or GITEA_ADMIN_PASSWORD" >&2
echo "missing push credential: set GITEA_SYNC_TOKEN" >&2
exit 1
fi