add github-mirror
This commit is contained in:
parent
368aec13dc
commit
66800bd69a
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.DS_Store
|
76
github-release-mirror/config-demo.yaml
Normal file
76
github-release-mirror/config-demo.yaml
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
## 权限修改
|
||||||
|
# 是否以 root 运行。如果是,并且 fix-chown 为 true,则会根据 apply-uid 和 apply-gid修改所有产生的文件的所有者和组;如果不是,则不进行任何文件权限相关的修改。
|
||||||
|
run-as-root: true
|
||||||
|
fix-chown: true
|
||||||
|
apply-uid: 1000
|
||||||
|
apply-gid: 100
|
||||||
|
## 代理设置
|
||||||
|
proxy:
|
||||||
|
enabled: false # 是否启用代理
|
||||||
|
http: "http://127.0.0.1:7890" # HTTP 代理地址
|
||||||
|
https: "http://127.0.0.1:7890" # HTTPS 代理地址
|
||||||
|
## 文件相关配置
|
||||||
|
saved-path: "/home/flintylemming/share/github-release-mirror"
|
||||||
|
## 跟踪配置
|
||||||
|
# 标题
|
||||||
|
track-list:
|
||||||
|
# netbird:
|
||||||
|
# # (必填)Repo 的作者和项目名称,不需要完整地址
|
||||||
|
# repo-info: "netbirdio/netbird"
|
||||||
|
# # (选填)保存文件夹的名称,创建在 saved-path 下,如果不设置,使用该节标题名
|
||||||
|
# folder-name: "Netbird"
|
||||||
|
# # (选填)设置是否导出 What's Changed 为 md 文件,默认为 true
|
||||||
|
# get-changes-info: true
|
||||||
|
# # (选填)设置指定的后缀,只下载 Release 中指定后缀的文件
|
||||||
|
# file-type:
|
||||||
|
# - msi
|
||||||
|
# - deb
|
||||||
|
# - pkg
|
||||||
|
opentrace:
|
||||||
|
repo-info: "Archeb/opentrace"
|
||||||
|
folder-name: "OpenTrace"
|
||||||
|
get-changes-info: true
|
||||||
|
regex: "(osx|win)"
|
||||||
|
powertoys:
|
||||||
|
repo-info: "microsoft/PowerToys"
|
||||||
|
folder-name: "PowerToys"
|
||||||
|
get-changes-info: true
|
||||||
|
# rustdesk:
|
||||||
|
# repo-info: "rustdesk/rustdesk"
|
||||||
|
# folder-name: "RustDesk"
|
||||||
|
# file-type:
|
||||||
|
# - exe
|
||||||
|
# - dmg
|
||||||
|
smartporxy:
|
||||||
|
repo-info: "salarcode/SmartProxy"
|
||||||
|
folder-name: "SmartProxy"
|
||||||
|
ddns-go:
|
||||||
|
repo-info: "jeessy2/ddns-go"
|
||||||
|
folder-name: "ddns-go"
|
||||||
|
sms-forwarder:
|
||||||
|
repo-info: "pppscn/SmsForwarder"
|
||||||
|
folder-name: "SmsForwarder"
|
||||||
|
nezha-agent:
|
||||||
|
repo-info: "nezhahq/agent"
|
||||||
|
folder-name: "Nezha Agent"
|
||||||
|
# massCode:
|
||||||
|
# repo-info: "massCodeIO/massCode"
|
||||||
|
# folder-name: "massCode"
|
||||||
|
flclash:
|
||||||
|
repo-info: "chen08209/FlClash"
|
||||||
|
folder-name: "FlClash"
|
||||||
|
immich:
|
||||||
|
repo-info: "immich-app/immich"
|
||||||
|
folder-name: "immich"
|
||||||
|
file-type:
|
||||||
|
- apk
|
||||||
|
surge:
|
||||||
|
repo-info: "LanYunDev/InjectLib_bak"
|
||||||
|
folder-name: "Qurge"
|
||||||
|
beszel:
|
||||||
|
repo-info: "henrygd/beszel"
|
||||||
|
folder-name: "Beszel"
|
||||||
|
easytier:
|
||||||
|
repo-info: "EasyTier/EasyTier"
|
||||||
|
folder-name: "EasyTier"
|
115
github-release-mirror/main.py
Normal file
115
github-release-mirror/main.py
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
import os
|
||||||
|
import re
|
||||||
|
import requests
|
||||||
|
import yaml
|
||||||
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# 设置日志
|
||||||
|
logging.basicConfig(level=logging.INFO,
|
||||||
|
format='%(asctime)s - %(levelname)s - %(message)s',
|
||||||
|
handlers=[
|
||||||
|
logging.FileHandler("/tmp/github-release-mirror-log.txt"),
|
||||||
|
logging.StreamHandler()
|
||||||
|
])
|
||||||
|
|
||||||
|
# 获取当前脚本所在目录的绝对路径
|
||||||
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
config_path = os.path.join(script_dir, "config.yaml")
|
||||||
|
|
||||||
|
# 读取配置文件
|
||||||
|
with open(config_path, 'r') as file:
|
||||||
|
config = yaml.safe_load(file)
|
||||||
|
|
||||||
|
# 配置代理
|
||||||
|
proxies = {}
|
||||||
|
if 'proxy' in config and config['proxy'].get('enabled', False):
|
||||||
|
if 'http' in config['proxy']:
|
||||||
|
proxies['http'] = config['proxy']['http']
|
||||||
|
if 'https' in config['proxy']:
|
||||||
|
proxies['https'] = config['proxy']['https']
|
||||||
|
|
||||||
|
if proxies:
|
||||||
|
logging.info(f"已启用代理: {proxies}")
|
||||||
|
|
||||||
|
def download_file(url, filename):
|
||||||
|
"""下载文件到指定路径"""
|
||||||
|
request_kwargs = {'stream': True}
|
||||||
|
if proxies:
|
||||||
|
request_kwargs['proxies'] = proxies
|
||||||
|
|
||||||
|
with requests.get(url, **request_kwargs) as r:
|
||||||
|
with open(filename, 'wb') as f:
|
||||||
|
for chunk in r.iter_content(chunk_size=8192):
|
||||||
|
f.write(chunk)
|
||||||
|
logging.info(f"文件下载完成:{filename}")
|
||||||
|
|
||||||
|
def change_ownership(path, uid, gid):
|
||||||
|
"""更改文件或目录的所有者"""
|
||||||
|
os.chown(path, uid, gid)
|
||||||
|
for root, dirs, files in os.walk(path):
|
||||||
|
for d in dirs:
|
||||||
|
os.chown(os.path.join(root, d), uid, gid)
|
||||||
|
for f in files:
|
||||||
|
os.chown(os.path.join(root, f), uid, gid)
|
||||||
|
logging.info(f"已更改所有权:{path}")
|
||||||
|
|
||||||
|
def process_repo(repo_config, base_path, uid, gid):
|
||||||
|
repo_info = repo_config['repo-info']
|
||||||
|
folder_name = repo_config.get('folder-name', repo_info.split('/')[-1])
|
||||||
|
get_changes_info = repo_config.get('get-changes-info', True)
|
||||||
|
file_type = repo_config.get('file-type', [])
|
||||||
|
regex_pattern = repo_config.get('regex', None)
|
||||||
|
|
||||||
|
logging.info(f"\n正在处理项目:{folder_name}")
|
||||||
|
logging.info(f"仓库名称:{repo_info}")
|
||||||
|
|
||||||
|
API_URL = f"https://api.github.com/repos/{repo_info}/releases/latest"
|
||||||
|
|
||||||
|
request_kwargs = {}
|
||||||
|
if proxies:
|
||||||
|
request_kwargs['proxies'] = proxies
|
||||||
|
|
||||||
|
response = requests.get(API_URL, **request_kwargs)
|
||||||
|
latest_release = response.json()
|
||||||
|
latest_version = latest_release['tag_name']
|
||||||
|
release_notes = latest_release['body']
|
||||||
|
assets = latest_release['assets']
|
||||||
|
|
||||||
|
version_dir = base_path / folder_name / latest_version
|
||||||
|
if not version_dir.exists():
|
||||||
|
logging.info(f"发现新版本:{latest_version},正在下载...")
|
||||||
|
version_dir.mkdir(parents=True)
|
||||||
|
|
||||||
|
if get_changes_info:
|
||||||
|
with open(version_dir / "CHANGELOG.md", "w") as f:
|
||||||
|
f.write(release_notes)
|
||||||
|
logging.info("已保存变更日志。")
|
||||||
|
|
||||||
|
for asset in assets:
|
||||||
|
if file_type and not any(asset['name'].endswith(ext) for ext in file_type):
|
||||||
|
continue
|
||||||
|
if regex_pattern and not re.match(regex_pattern, asset['name']):
|
||||||
|
continue
|
||||||
|
|
||||||
|
download_url = asset['browser_download_url']
|
||||||
|
filename = version_dir / asset['name']
|
||||||
|
download_file(download_url, filename)
|
||||||
|
|
||||||
|
if config['run-as-root'] and config['fix-chown']:
|
||||||
|
change_ownership(version_dir, uid, gid)
|
||||||
|
logging.info(f"版本 {latest_version} 下载完成。")
|
||||||
|
else:
|
||||||
|
logging.info(f"最新版本 {latest_version} 已存在。")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
saved_path = Path(config['saved-path'])
|
||||||
|
uid = config['apply-uid']
|
||||||
|
gid = config['apply-gid']
|
||||||
|
|
||||||
|
for track_item, track_config in config['track-list'].items():
|
||||||
|
process_repo(track_config, saved_path, uid, gid)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user