Initialize Clash Web source and deployment documentation
This commit is contained in:
commit
8e0fa00a73
66 files changed
+8532
No files matched your search
Executable
+34
@@ -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')
|
||||
Reference in new issue
Block a user