2026-01-28 09:03:59 +08:00
2026-01-27 16:37:06 +08:00
2026-01-27 16:37:06 +08:00
2026-01-27 16:37:06 +08:00
2026-01-27 16:37:06 +08:00
2026-01-28 09:03:59 +08:00

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.0
  • 2: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: 可能的原因:

  1. 包名拼写错误或与APT源中的包名不匹配
  2. 该包不在配置的APT源中
  3. APT源没有该包的指定架构版本
  4. 包是通过其他方式安装的(如非deb包)

检查 failed/failed_packages_*.json 文件查看具体原因。

Q3: 如何添加更多的APT源?

A:config.pyAPT_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: 在以下情况使用:

  1. 首次运行,需要填充所有包的下载链接
  2. APT源发生了重大变化,需要重新获取所有URL
  3. 数据库中的 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: 可以通过以下方式验证:

  1. 查看 success/ 目录中的成功更新记录
  2. 直接查询数据库:
    SELECT name, name_en, download_url2, abi2_version
    FROM app_info
    WHERE download_url2 IS NOT NULL
    LIMIT 10;
    
  3. 抽样检查URL是否可访问

技术栈

  • Python 3.6+ - 主要编程语言
  • requests - HTTP请求库
  • apt_pkg - Debian包管理库
  • MySQLdb - MySQL数据库驱动
  • gzip - 压缩文件处理

许可证

本工具为内部使用工具,请根据实际情况使用。

Description
No description provided
Readme 44 KiB
Languages
Python 100%