APT源Deb包下载链接更新工具
从指定的APT源中获取deb包的下载链接,并自动更新到数据库中。支持版本比较、多源管理、缓存机制等功能。
安装步骤
1. 环境要求
- Python 3.6+
- MySQL 或 MariaDB
- 网络连接(访问APT源)
2. 安装Python依赖
方法一:使用apt安装(推荐)
sudo apt install python3-mysqldb python3-requests python3-apt
方法二:使用pip安装
pip install -r requirements.txt
依赖包说明:
requests>=2.28.0- HTTP请求库python3-apt>=3.0.0- Debian软件包管理库,提供版本比较功能MySQLdb- MySQL数据库驱动(通过python3-mysqldb安装)
3. 数据库准备
确保数据库表包含以下字段:
-- 检查现有字段
DESCRIBE app_info;
-- 如果缺少以下字段,需要创建
ALTER TABLE app_info ADD COLUMN download_url2 VARCHAR(500) COMMENT '下载URL';
ALTER TABLE app_info ADD COLUMN abi2_version VARCHAR(100) COMMENT 'ABI版本号';
重要字段说明:
name_en- 英文包名(用于查询)name- 中文名称(显示用)download_url2- 下载URL(更新目标)abi2_version- ABI版本号(版本比较依据)loongArch- 架构标识(筛选条件)
配置说明
编辑 config.py 文件进行配置:
1. 数据库配置
DATABASE_CONFIG = {
'host': 'your-database-host', # 数据库主机地址
'port': 3306, # 数据库端口
'database': 'your-database', # 数据库名
'user': 'your-user', # 数据库用户名
'password': 'your-password', # 数据库密码
'charset': 'utf8mb4' # 字符集
}
2. APT源配置
APT_SOURCES = [
{
'type': 'deb', # 源类型
'url': 'http://10.2.10.68:8000/controlled/', # 源URL
'distribution': 'loongnix-stable', # 发行版
'components': ['main', 'non-free'] # 组件列表
}
# 可以添加更多APT源
]
3. 架构配置
APT_ARCH = 'loongarch64' # 架构类型,如loongarch64,mips64
4. 表和字段配置
TABLE_NAME = 'app_info' # 表名
PACKAGE_NAME_FIELD = 'name_en' # 包名字段
DOWNLOAD_URL_FIELD = 'download_url2' # 下载URL字段
ABI2_VERSION_FIELD = 'abi2_version' # 版本字段
使用方法
基本用法
# 增量更新模式(默认)
python3 update_deb_urls.py
# 强制更新所有包
python3 update_deb_urls.py --force
# 赋予执行权限后直接运行
chmod +x update_deb_urls.py
./update_deb_urls.py
命令行参数
| 参数 | 说明 |
|---|---|
--force |
强制更新所有包,跳过版本比较 |
执行流程
1. 初始化配置和连接
├── 读取APT源配置
├── 连接数据库
└── 创建HTTP会话(带重试机制)
2. 加载Packages索引
├── 遍历所有APT源
├── 下载Packages文件(支持缓存和gzip)
├── 解析并建立索引
└── 使用apt_pkg进行版本排序
3. 从数据库读取包列表
├── 查询所有name_en不为空且loongArch='loongArch64'的记录
└── 获取name, name_en, abi2_version字段
4. 处理每个包
├── 在索引中查找包
├── 比较版本(非强制模式)
├── 构造下载URL
└── 添加到更新列表
5. 批量更新数据库
├── 验证字段存在
├── 执行批量UPDATE
└── 提交事务
6. 保存结果
├── 创建分类JSON文件
└── 输出统计信息
输出说明
日志输出
程序会输出详细的日志信息:
2026-01-26 16:00:00 - INFO - ============================================================
2026-01-26 16:00:00 - INFO - 开始更新deb包下载链接
2026-01-26 16:00:00 - INFO - 模式: 增量更新(基于abi2_version比较)
2026-01-26 16:00:00 - INFO - ============================================================
2026-01-26 16:00:00 - INFO - 使用架构: loong64
2026-01-26 16:00:01 - INFO - 数据库连接成功
2026-01-26 16:00:01 - INFO - 开始加载所有Packages文件...
2026-01-26 16:00:02 - INFO - 正在获取: http://10.2.10.68:8000/controlled/dists/loongnix-stable/main/binary-loong64/Packages
2026-01-26 16:00:05 - INFO - 已加载: http://10.2.10.68:8000/controlled/loongnix-stable/main
2026-01-26 16:00:06 - INFO - 索引加载完成,共 1200 个包
2026-01-26 16:00:06 - INFO - 从数据库获取到 1460 个包信息
处理进度: 100/1460
处理进度: 200/1460
...
2026-01-26 16:05:00 - INFO - 包 [1450/1460] 更新: 火焰截图 (flameshot) - 12.1.0+ds-2.lnd.2 -> 12.1.0+ds-2.lnd.3
2026-01-26 16:05:01 - INFO - 开始批量更新 15 个包...
2026-01-26 16:05:02 - INFO - 批量更新完成,影响 15 行
2026-01-26 16:05:02 - INFO - 结果已保存到目录:
2026-01-26 16:05:02 - INFO - - update/update_results_20260126_160502.json(完整结果)
2026-01-26 16:05:02 - INFO - - success/success_packages_20260126_160502.json(成功更新)
2026-01-26 16:05:02 - INFO - - skipped/skipped_packages_20260126_160502.json(跳过)
2026-01-26 16:05:02 - INFO - - failed/failed_packages_20260126_160502.json(失败)
2026-01-26 16:05:02 - INFO - ============================================================
2026-01-26 16:05:02 - INFO - 处理完成
2026-01-26 16:05:02 - INFO - 总计: 1460 个包
2026-01-26 16:05:02 - INFO - 更新: 15 个包
2026-01-26 16:05:02 - INFO - 跳过: 970 个包(版本未变化)
2026-01-26 16:05:02 - INFO - 失败: 475 个包
2026-01-26 16:05:02 - INFO - ============================================================
结果文件
程序会在以下目录保存结果:
project/
├── update/
│ └── update_results_YYYYMMDD_HHMMSS.json # 完整结果
├── success/
│ └── success_packages_YYYYMMDD_HHMMSS.json # 成功更新的包
├── skipped/
│ └── skipped_packages_YYYYMMDD_HHMMSS.json # 跳过的包
└── failed/
└── failed_packages_YYYYMMDD_HHMMSS.json # 失败的包
完整结果文件格式
{
"timestamp": "20260126_160502",
"summary": {
"success": 15,
"skipped": 970,
"failed": 475
},
"success": [
{
"name": "火焰截图",
"name_en": "flameshot",
"old_abi2_version": "12.1.0+ds-2.lnd.2",
"new_version": "12.1.0+ds-2.lnd.3",
"download_url": "http://10.2.10.68:8000/controlled/pool/main/f/flameshot/flameshot_12.1.0+ds-2.lnd.3_loong64.deb"
}
],
"skipped": [
{
"name": "GNU图像处理程序",
"name_en": "gimp",
"abi2_version": "3.0.4-3",
"reason": "版本未变化"
}
],
"failed": [
{
"name": "龙芯天气",
"name_en": "loongsonweather",
"current_abi2_version": "",
"reason": "未在APT源中找到"
}
]
}
实现原理
1. Packages文件解析
程序按照Debian Packages文件格式解析:
Package: flameshot
Version: 12.1.0+ds-2.lnd.3
Architecture: loong64
Filename: pool/main/f/flameshot/flameshot_12.1.0+ds-2.lnd.3_loong64.deb
Size: 1234567
MD5sum: abc123...
SHA256: def456...
Homepage: https://flameshot.org/
Description: Powerful yet simple to use screenshot software
2. 版本比较
使用 apt_pkg.version_compare() 进行正确的Debian版本比较:
import apt_pkg
apt_pkg.init_system()
result = apt_pkg.version_compare(version1, version2)
# 返回值: -1 (version1 < version2), 0 (equal), 1 (version1 > version2)
支持版本号格式:
1.0.02:8.2.3995-1(包含epoch)12.1.0+ds-2.lnd.3(包含上游版本和修订版)
常见问题
Q1: 提示"字段 download_url2 不存在"怎么办?
A: 需要在数据库表中添加该字段:
ALTER TABLE app_info ADD COLUMN download_url2 VARCHAR(500);
ALTER TABLE app_info ADD COLUMN abi2_version VARCHAR(100);
Q2: 某些包找不到怎么办?
A: 可能的原因:
- 包名拼写错误或与APT源中的包名不匹配
- 该包不在配置的APT源中
- APT源没有该包的指定架构版本
- 包是通过其他方式安装的(如非deb包)
检查 failed/failed_packages_*.json 文件查看具体原因。
Q3: 如何添加更多的APT源?
A: 在 config.py 的 APT_SOURCES 列表中添加新的源配置:
APT_SOURCES = [
# 现有源
{
'type': 'deb',
'url': 'http://buildd.loongnix.cn:8000/controlled/',
'distribution': 'loongnix-stable',
'components': ['main', 'non-free']
},
# 新增源
{
'type': 'deb',
'url': 'http://another-source.example.com/',
'distribution': 'stable',
'components': ['main', 'contrib', 'non-free']
}
]
Q4: 什么时候使用 --force 参数?
A: 在以下情况使用:
- 首次运行,需要填充所有包的下载链接
- APT源发生了重大变化,需要重新获取所有URL
- 数据库中的
abi2_version数据不可靠
Q5: 如何修改日志级别?
A: 编辑 update_deb_urls.py 文件,修改日志级别:
logging.basicConfig(
level=logging.DEBUG, # 改为DEBUG查看详细信息
# level=logging.INFO, # 默认INFO
format='%(asctime)s - %(levelname)s - %(message)s'
)
Q6: 缓存文件在哪里?
A: 缓存文件存储在项目根目录的 .apt_cache/ 目录下,文件名为URL的哈希值。如果需要清除缓存:
rm -rf .apt_cache/
Q7: 如何验证更新结果?
A: 可以通过以下方式验证:
- 查看
success/目录中的成功更新记录 - 直接查询数据库:
SELECT name, name_en, download_url2, abi2_version FROM app_info WHERE download_url2 IS NOT NULL LIMIT 10; - 抽样检查URL是否可访问
技术栈
- Python 3.6+ - 主要编程语言
- requests - HTTP请求库
- apt_pkg - Debian包管理库
- MySQLdb - MySQL数据库驱动
- gzip - 压缩文件处理
许可证
本工具为内部使用工具,请根据实际情况使用。
Description
Languages
Python
100%