xchwarze/universal-tool-updater
GitHub: xchwarze/universal-tool-updater
这是一个基于 Python 和 INI 配置的通用工具更新脚本,旨在通过正则抓取和多源策略自动化维护各类安全或逆向工具的最新版本。
Stars: 33 | Forks: 5
English | [Español](README.ES.md)
# 通用工具更新器
此工具旨在帮助简化日常工作中保持工具最新版本的繁琐过程。
这是本站 [toolkit](https://github.com/indetectables-net/toolkit) 的必要补充。

## 安装
您可以使用 [git](https://git-scm.com/download/win) 克隆该仓库,或者直接从下载页面下载。
```
git clone https://github.com/xchwarze/universal-tool-updater
```
## 设置
要添加工具,您需要编辑 `tools.ini` 文件。
默认情况下,它被配置为一个示例,以便用户快速理解如何使用该工具。
```
[DIE]
folder = Analysis\DIE
url = horsicq/DIE-engine
from = github
re_download = die_win64_portable_(?:\S+).zip
[Portmon]
folder = Monitor\Portmon
url = https://raw.githubusercontent.com/MicrosoftDocs/sysinternals/main/sysinternals/downloads/portmon.md
update_url = https://download.sysinternals.com/files/PortMon.zip
from = web
re_version = # Portmon v(\d+\.\d+)
```
用于配置的值如下:
| 名称 | 必填 | 描述 |
|--------------------|-----------|----------------------------------------------------------------------------------------------------------------|
| `folder` | 是 | 保存工具的文件夹。如果不存在,将会创建它。 |
| `url` | 是 | 用作版本检查和/或正则抓取主要来源的网页。 |
| `from` | 否 | 要使用的策略:`web`、`github`、`http` 或 `scoop`。默认为 `web`。 |
| `local_version` | 否 | 当前安装的版本。每次成功运行后更新。 |
| `re_version` | 否 | 用于从 `url` 的 HTML 中提取新版本字符串的正则表达式。 |
| `re_download` | 否 | 用于从 HTML 中提取下载链接的正则表达式。应捕获完整的 URL 或相对路径。 |
| `update_url` | 否 | 基础 URL 或直接下载链接。当 `re_download` 产生相对路径或未提供正则表达式时使用。 |
| `re_download_x64` | 否 | x64 系统上 `re_download` 的特定架构覆盖。如果未设置,则回退到 `re_download`。 |
| `re_download_x86` | 否 | x86 系统上 `re_download` 的特定架构覆盖。如果未设置,则回退到 `re_download`。 |
| `update_url_x64` | 否 | x64 系统上 `update_url` 的特定架构覆盖。如果未设置,则回退到 `update_url`。 |
| `update_url_x86` | 否 | x86 系统上 `update_url` 的特定架构覆盖。如果未设置,则回退到 `update_url`。 |
| `update_file_pass` | 否 | 解压下载的压缩包所需的密码。 |
| `merge` | 否 | 如果设置,将新下载的文件合并到现有文件夹中。 |
| `scoop_bucket` | 否 | 当 `from = scoop` 时使用的 Scoop bucket:`main` 或 `extras`。默认:`main`。 |
| `force_x86` | 否 | 当 `from = scoop` 时,无论操作系统架构如何,都强制进行 32 位下载。默认:`false`。 |
| `disable_repack` | 否 | 禁用此特定工具的重新打包。覆盖全局 `--disable-repack` 标志。默认:`false`。 |
| `disable_content_type_check` | 否 | 禁用下载时的 Content-Type 验证。默认情况下,下载器会拒绝返回非二进制 Content-Type(例如 `text/html`)的响应。设置为 `true` 以跳过此检查。 |
| `pre_update` | 否 | 在执行更新之前运行的脚本或命令。 |
| `post_update` | 否 | 在更新下载完成后立即运行的脚本或命令。 |
| `post_unpack` | 否 | 在解压下载的压缩包后运行的脚本或命令。 |
## 全局配置
默认参数可以保存在 `tools.ini` 的 `[UpdaterConfig]` 部分。这些值用作命令行参数的默认值,并可以通过 `--update-default-params` 保存。
| 名称 | 描述 |
|---------------------|-------------------------------------------------------------------------------------------------|
| `disable_clean` | 在更新期间跳过清理工具的文件夹。默认:`true`。 |
| `disable_repack` | 防止在更新过程后重新打包工具。默认:`true`。 |
| `disable_install_check` | 跳过检查工具是否已正确安装。默认:`false`。 |
| `disable_progress` | 禁用下载进度条。默认:`false`。 |
| `save_format_type` | 压缩更新的保存格式类型:`full`、`version` 或 `name`。默认:`full`。 |
| `use_github_api` | 用于经过身份验证的请求的 GitHub API 令牌。默认:空。 |
| `request_timeout` | HTTP 请求的超时时间(秒)。默认:`30`。 |
| `download_retries` | 下载失败时的重试次数。默认:`3`。 |
| `parallel_workers` | 并行更新的工具数量。默认:`1`。 |
| `download_segments` | 用于加速下载的段数。默认:`3`。 |
| `global_post_update` | 作为全局更新后钩子运行的脚本或命令。接收工具名称、文件夹和压缩文件名。 |
## 下载策略
1. **如果设置了 `re_download`**
a. 尝试从初始 `url` 的 HTML 中提取链接。
b. 如果获得匹配项且它是有效的绝对 URL → 使用它。
c. 如果获得匹配项但它是相对路径 →
- 如果定义了 `update_url`,则在其前面加上它。
- 否则,从原始页面的 scheme+netloc 构建。
d. 如果在初始 HTML 上没有匹配项且定义了 `update_url` → 获取一次 `update_url`,重试相同的正则表达式。
e. 如果仍然没有匹配项 → 引发错误。
2. **否则,如果仅设置了 `update_url`**
直接将 `update_url` 用作下载链接。
3. **HTTP 模式 (`from = http`)**
- 向 `update_url` 发送 **HEAD** 请求。
- 通过对 `Last-Modified` 或 `Content-Length` 标头进行哈希处理来提取版本指纹。
- 如果哈希值与 `local_version` 不同(或 `force_download`),则使用 `update_url` 作为下载链接。
- 如果标头匹配且 `force_download` 为 false,则不执行更新。
4. **Scoop 模式 (`from = scoop`)**
- 从 `https://raw.githubusercontent.com/ScoopInstaller/{Bucket}/master/bucket/{app}.json` 获取 JSON 清单。
- 从清单根目录读取 `version` 并与 `local_version` 进行比较。
- 根据检测到的操作系统架构,从 `architecture.64bit.url` 或 `architecture.32bit.url` 解析下载 URL。`force_x86 = true` 会覆盖此设置并始终使用 `32bit`。如果架构键不存在,则回退到根 `url` 字段。
- 如果 URL 字段是一个列表,则使用第一个元素。
5. **否则**
报错:既未提供 `re_download` 也未提供 `update_url`,因此无法确定下载链接。
## 命令行参数
更新器提供了一组灵活的参数来控制其行为:
| 参数 | 描述 |
|--------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
| `-h, --help` | 显示此帮助消息并退出。 |
| `-v, --version` | 显示程序的版本号并退出。 |
| `-u [UPDATE ...], --update [UPDATE ...]` | 指定要更新的工具列表。如果未提供,默认更新所有工具。 |
| `-dsu, --disable-self-update` | 禁用此脚本的自动自我更新。 |
| `-dfc, --disable-folder-clean` | 在更新期间跳过清理工具的文件夹。 |
| `-dr, --disable-repack` | 防止在更新过程后重新打包工具。 |
| `-dic, --disable-install-check` | 跳过检查工具是否已正确安装。 |
| `-dpb, --disable-progress-bar` | 禁用更新的下载进度条。 |
| `-sft {full,version,name}, --save-format-type {full,version,name}` | 指定压缩更新的保存格式类型:`full`、`version` 或 `name`。 |
| `-f, --force` | 强制下载更新,即使它们看起来是最新的。 |
| `-uga USE_GITHUB_API, --use-github-api USE_GITHUB_API` | 使用 GitHub API 进行更新,指定用于身份验证的令牌。 |
| `-udp, --update-default-params` | 更新存储在配置中的默认参数。 |
| `-dmc, --disable-mutex-check` | 通过禁用互斥检查,允许同时运行脚本的多个实例。 |
| `-d, --debug` | 启用详细的调试输出以进行故障排除。 |
| `--dry-run` | 检查可用的更新,而不下载或安装任何内容。 |
| `-rt SECONDS, --request-timeout SECONDS` | HTTP 请求的超时时间(秒)。默认:`30`。 |
| `-dre N, --download-retries N` | 下载失败时的重试次数(指数退避)。默认:`3`。 |
| `-pw N, --parallel-workers N` | 并行更新的工具数量。默认:`1`(顺序)。 |
| `-ds N, --download-segments N` | 用于加速下载的段数。默认:`3`。 |
## 示例
该工具支持各种命令和组合。以下是最常用的用法。
* 更新特定工具
```
updater.exe --update "Process Hacker 3"
```
* 强制更新工具
```
updater.exe --force --update DIE
```
* 更新而不压缩或清理文件夹
```
updater.exe --disable-folder-clean --disable-repack
```
## 结合 GitHub Api 使用
GitHub 下载默认通过抓取数据执行,但为了更稳健的操作,建议使用 GitHub api 进行操作。
为此,请按照以下步骤操作:
1. 通过点击 Generate new token 从 https://github.com/settings/tokens 生成您的令牌。
2. 使用以下命令运行更新器
```
updater.exe --update-default-params --use-github-api your_github_token
```
## 结合计划任务使用
* 将更新器工具添加到计划任务。您可以在此处阅读更多内容
"[使用 CLI 创建计划任务](https://www.windowscentral.com/how-create-task-using-task-scheduler-command-prompt)",
"[如何创建自动化任务](https://www.windowscentral.com/how-create-automated-task-using-task-scheduler-windows-10)" 和
"[防止命令窗口出现](https://pureinfotech.com/prevent-command-window-appearing-scheduled-tasks-windows-10/)"
```
# 在提升权限的 command prompt 中执行
SCHTASKS /CREATE /SC DAILY /TN "ToolkitUpdater" /TR "D:\code\toolkit\Updater\custom-task.bat" /ST 14:00
```
* 删除计划任务
```
# 在提升权限的 command prompt 中执行
SCHTASKS /DELETE /TN "ToolkitUpdater"
```
## 编译为 exe
```
cd src
pip install -r requirements.txt
pip install pyinstaller
pyinstaller --onefile UpdateManager.py --icon=../assets/appicon.ico --collect-all aiohttp --collect-all aiofiles
```
标签:DNS解析, 下载管理, 云资产清单, 便携软件, 工具更新, 工具链, 开源项目, 恶意代码分析, 数字取证, 漏洞挖掘, 版本检测, 版本管理, 系统工具, 自动化脚本, 自动更新, 软件管理, 逆向工具, 逆向工程, 配置文件