Sync subset from blackmatrix7/ios_rule_script
This commit is contained in:
@@ -17,6 +17,11 @@
|
|||||||
- `rule/Surge/ChinaIPs.list` <- `rule/Surge/ChinaIPs/ChinaIPs.list`
|
- `rule/Surge/ChinaIPs.list` <- `rule/Surge/ChinaIPs/ChinaIPs.list`
|
||||||
- `rule/Surge/Proxy.list` <- `rule/Surge/Proxy/Proxy.list`
|
- `rule/Surge/Proxy.list` <- `rule/Surge/Proxy/Proxy.list`
|
||||||
|
|
||||||
|
基于这些 Surge 规则,还会派生出:
|
||||||
|
|
||||||
|
- `rule/Loon/*.list`
|
||||||
|
- `rule/Clash/*.list`
|
||||||
|
|
||||||
同时生成 sing-box 专用规则文件:
|
同时生成 sing-box 专用规则文件:
|
||||||
|
|
||||||
- `rule/sing-box/ManualBackHome.json`
|
- `rule/sing-box/ManualBackHome.json`
|
||||||
@@ -49,4 +54,6 @@ Gitea Actions 工作流:
|
|||||||
这个项目给本地 `surgio` 用作远程规则源:
|
这个项目给本地 `surgio` 用作远程规则源:
|
||||||
|
|
||||||
- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/Surge`
|
- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/Surge`
|
||||||
|
- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/Loon`
|
||||||
|
- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/Clash`
|
||||||
- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/sing-box`
|
- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/sing-box`
|
||||||
|
|||||||
@@ -6,8 +6,12 @@ from pathlib import Path
|
|||||||
|
|
||||||
ROOT = Path(__file__).resolve().parent.parent
|
ROOT = Path(__file__).resolve().parent.parent
|
||||||
SURGE_DIR = ROOT / "rule" / "Surge"
|
SURGE_DIR = ROOT / "rule" / "Surge"
|
||||||
|
LOON_DIR = ROOT / "rule" / "Loon"
|
||||||
|
CLASH_DIR = ROOT / "rule" / "Clash"
|
||||||
SINGBOX_DIR = ROOT / "rule" / "sing-box"
|
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)
|
SINGBOX_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
UPSTREAM_TARGETS = {
|
UPSTREAM_TARGETS = {
|
||||||
@@ -31,6 +35,32 @@ FIELD_MAP = {
|
|||||||
"PROCESS-NAME": "process_name",
|
"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:
|
def build_rule_set(entries: dict[str, list[str]]) -> dict:
|
||||||
rules = []
|
rules = []
|
||||||
@@ -63,6 +93,30 @@ def parse_surge_list(path: Path) -> dict:
|
|||||||
return build_rule_set(entries)
|
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 = {
|
MANUAL_RULESETS = {
|
||||||
"ManualBackHome": {"version": 3, "rules": [{"ip_cidr": ["192.168.10.0/24"]}]},
|
"ManualBackHome": {"version": 3, "rules": [{"ip_cidr": ["192.168.10.0/24"]}]},
|
||||||
"ManualReject": {"version": 3, "rules": [{"domain": ["www.axure.com"]}]},
|
"ManualReject": {"version": 3, "rules": [{"domain": ["www.axure.com"]}]},
|
||||||
@@ -96,6 +150,12 @@ for name, filename in UPSTREAM_TARGETS.items():
|
|||||||
encoding="utf-8",
|
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():
|
for name, payload in MANUAL_RULESETS.items():
|
||||||
(SINGBOX_DIR / f"{name}.json").write_text(
|
(SINGBOX_DIR / f"{name}.json").write_text(
|
||||||
json.dumps(payload, ensure_ascii=False, indent=2) + "\n",
|
json.dumps(payload, ensure_ascii=False, indent=2) + "\n",
|
||||||
|
|||||||
@@ -5,25 +5,20 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|||||||
SURGE_DIR="$ROOT_DIR/rule/Surge"
|
SURGE_DIR="$ROOT_DIR/rule/Surge"
|
||||||
SINGBOX_DIR="$ROOT_DIR/rule/sing-box"
|
SINGBOX_DIR="$ROOT_DIR/rule/sing-box"
|
||||||
UPSTREAM_BASE="https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge"
|
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"
|
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
|
if [[ -f "$LOCAL_SYNC_ENV_FILE" ]]; then
|
||||||
source "$LOCAL_SYNC_ENV_FILE"
|
source "$LOCAL_SYNC_ENV_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
GITEA_REPO_OWNER="${GITEA_REPO_OWNER:-yuanzhen869}"
|
GITEA_REPO_OWNER="${GITEA_REPO_OWNER:-yuanzhen869}"
|
||||||
GITEA_REPO_NAME="${GITEA_REPO_NAME:-ios-rule-script-subset}"
|
GITEA_REPO_NAME="${GITEA_REPO_NAME:-ios-rule-script-subset}"
|
||||||
GITEA_SYNC_USERNAME="${GITEA_SYNC_USERNAME:-${GITEA_ADMIN_USERNAME:-yuanzhen869}}"
|
GITEA_SYNC_USERNAME="${GITEA_SYNC_USERNAME:-yuanzhen869}"
|
||||||
GITEA_SYNC_EMAIL="${GITEA_SYNC_EMAIL:-${GITEA_ADMIN_EMAIL:-yuanzhen869@gmail.com}}"
|
GITEA_SYNC_EMAIL="${GITEA_SYNC_EMAIL:-yuanzhen869@gmail.com}"
|
||||||
GITEA_SYNC_PASSWORD="${GITEA_SYNC_PASSWORD:-${GITEA_SYNC_TOKEN:-${GITEA_ADMIN_PASSWORD:-}}}"
|
GITEA_SYNC_PASSWORD="${GITEA_SYNC_PASSWORD:-${GITEA_SYNC_TOKEN:-}}"
|
||||||
|
|
||||||
if [[ -z "${GITEA_SYNC_PASSWORD}" ]]; then
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user