检查软件包或版本是否存在并获取发布版本号

import pandas as pd
import subprocess
import re
import sys

def parse_release(release_str):
    """解析release字符串,提取整数部分"""
    if not release_str:
        return 0
    # 仅匹配开头的数字部分
    match = re.match(r'^(\d+)', release_str)
    return int(match.group(1)) if match else 0

def check_repoquery():
    """检查repoquery命令是否可用"""
    try:
        subprocess.run(['repoquery', '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
        return True
    except (subprocess.SubprocessError, FileNotFoundError):
        return False

def main():
    # 检查依赖命令
    if not check_repoquery():
        print("错误: 未找到'repoquery'命令,请确保yum-utils已安装。")
        return

    print("正在读取 package.xlsx 文件...")
    try:
        df = pd.read_excel('package.xlsx')
        print("成功读取 package.xlsx 文件。")
    except FileNotFoundError:
        print("错误: 找不到 package.xlsx 文件")
        return
    except Exception as e:
        print(f"读取文件失败: {str(e)}")
        return

    result = []
    separator = "=" * 30

    for index, row in df.iterrows():
        pkg_name = None
        for field in ['软件名', '包名', '软件名称', 'package_name']:
            if field in row:
                pkg_name = str(row[field])
                break
        
        version = None
        for field in ['版本号', '版本', 'version']:
            if field in row:
                version = str(row[field])
                break
        
        if pkg_name is None or version is None:
            missing = []
            if pkg_name is None:
                missing.append("软件名/包名")
            if version is None:
                missing.append("版本/版本号")
            print(f"错误: 第{index+1}行未找到{', '.join(missing)}字段")
            continue

        print(f"正在检查 {pkg_name} {version}...")

        latest_release = None
        exists = False
        version_match = False

        cmd = ['repoquery', '-q', '--qf', '%{VERSION}-%{RELEASE}', pkg_name]
        try:
            output = subprocess.check_output(cmd, text=True, timeout=10, stderr=subprocess.STDOUT)
            packages = [line.strip() for line in output.split('\n') if line.strip()]
            
            if not packages:
                exists = False
                print(f"{pkg_name} 不存在于 yum 源中")
            else:
                exists = True
                print(f"找到 {len(packages)} 个相关包")
                
                for pkg in packages:
                    try:
                        ver_part, rel_part = pkg.rsplit('-', 1)
                        if ver_part == version:
                            version_match = True
                            rel_num = parse_release(rel_part)
                            if latest_release is None or rel_num > latest_release:
                                latest_release = rel_num
                    except ValueError:
                        print(f"警告: 包 {pkg} 格式异常,跳过")
                        continue
                
                print(f"{'匹配到' if version_match else '未匹配到'} 版本 {version}")
                if version_match:
                    print(f"最新 release 号: {latest_release}")
        
        except subprocess.TimeoutExpired:
            exists = False
            print(f"查询超时: {pkg_name}")
        except subprocess.CalledProcessError as e:
            exists = False
            print(f"查询失败: {e.output.strip()}")
        except Exception as e:
            exists = False
            print(f"未知错误: {str(e)}")

        result.append({
            '软件名': pkg_name,
            '版本': version,
            '是否存在': '是' if exists else '否',
            '是否匹配': '匹配' if version_match else '不匹配',
            '最新release号': latest_release if version_match else 'N/A'
        })
        print(separator)

    # 优化后的控制台表格输出
    print("\n================================= 查询结果汇总 =================================")
    print("{:<17}{:<14}{:<9}{:<12}{:<10}".format(
        "软件名", "版本", "是否存在", "是否匹配", "最新release号"
    ))
    print("-" * 80)  # 调整分隔线长度
    for item in result:
        print("{:<20}{:<16}{:<12}{:<14}{:<16}".format(
            item['软件名'],
            item['版本'],
            item['是否存在'],
            item['是否匹配'],
            str(item['最新release号'])
        ))
    print("-" * 80)  # 调整分隔线长度

    # 保存结果到Excel
    try:
        pd.DataFrame(result).to_excel('out.xlsx', index=False)
        print("\n结果已保存到 out.xlsx")
    except Exception as e:
        print(f"保存失败: {str(e)}")

if __name__ == "__main__":
    main()

excel示例

软件名 版本
tar 1.35
autoconf 2.71
automake 1.16.5
posted @ 2025-04-08 17:31  wanghongwei-dev  阅读(38)  评论(0)    收藏  举报