Initialize Clash Web source and deployment documentation

This commit is contained in:
lhc committed 2026-10-05 17:32:00 +08:00
commit 8e0fa00a73
66 files changed
+8532

No files matched your search

+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env python3
"""Cache mainland domain/IP rule sets locally. Does not restart any service."""
import argparse
import os
import tempfile
import urllib.request
from pathlib import Path
parser = argparse.ArgumentParser()
parser.add_argument('--output', default='data/mihomo/rules')
args = parser.parse_args()
directory = Path(args.output)
directory.mkdir(parents=True, exist_ok=True)
files = {'cn-domain.mrs': 'geosite/cn.mrs', 'cn-ip.mrs': 'geoip/cn.mrs'}
downloads = {}
for name, remote in files.items():
request = urllib.request.Request('https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/' + remote, headers={'User-Agent': 'ClashWeb-build'})
with urllib.request.urlopen(request, timeout=60) as response:
data = response.read(32 * 1024 * 1024 + 1)
# MRS resources use a Zstandard frame; core validation checks the decoded payload.
if len(data) > 32 * 1024 * 1024 or data[:4] != b'\x28\xb5\x2f\xfd':
raise SystemExit(f'{name}: invalid MRS resource or size exceeds limit')
downloads[name] = data
for name, data in downloads.items():
fd, temporary = tempfile.mkstemp(dir=directory, prefix='.rules-')
try:
with os.fdopen(fd, 'wb') as stream:
stream.write(data)
os.chmod(temporary, 0o640)
os.replace(temporary, directory / name)
finally:
if os.path.exists(temporary):
os.unlink(temporary)
print(f'Cached {name}: {len(data)} bytes')