脚本实现自动化rpm安装(检测依赖并安装)

333 阅读4分钟

​ 以下脚本实际运行中应该会碰到一些未知问题,需要自己分析解决。  

#!/usr/bin/python
# -*- coding: utf-8 -*

import sys
import commands

falseKeyword="依赖检测失败:"
needKeyWord="需要" #被 ... 需要 的 需要
byKeyWord="被"     #被 ... 需要 的 被
verGapKeyword="="  # 等号右边是需要的版本,左边是库名称(可能包括x64信息)
archGapKeyword="(" # 左括号 左边是lib的名称,右边(括号里)是64位或32位的
archGapKeywordEnd=")"

dvdPath=sys.argv[1]
fileNamePre=sys.argv[2]

def installPkg(dvdPath, fileNamePre, archType = "x86_64"):
    print "Begin parsing for " + fileNamePre

    findCmd='find ' + dvdPath +' -name ' + fileNamePre + '*'
    if len(archType) > 0:
        findCmd = findCmd + ' |grep ' + archType
    print findCmd

    val = commands.getoutput(findCmd)

    if len(val) == 0:
        print "can't find " + fileNamePre
    else:
        print 'val=[' + val +']'

    installCmd = "rpm -ivh " + val + " 2>&1"
    valInstall = commands.getoutput(installCmd)

    print 'valInstall=[' + valInstall +']'

    posFailed = valInstall.find(falseKeyword)
    if posFailed != -1:
        print "安装失败,因:" + falseKeyword
    else:
        print "安装可能成功"
        return

    dependsRows = valInstall[posFailed+len(falseKeyword):]
    print 'dependsRows=[' + dependsRows + ']'

    rowsList = dependsRows.splitlines()

    for dependrow in rowsList:
        if dependrow.find(needKeyWord) == -1:
            continue
        dependrow = dependrow.strip()
        print 'dependrow=[' + dependrow + ']'
        libFullPos = dependrow.find(byKeyWord)        
        if libFullPos == -1:
            print "没有找到[" + byKeyWord + "]关键字,无法解析库信息"
            return
        libFull = dependrow[0:libFullPos].strip()
        print libFull
        libVerPos = libFull.find(verGapKeyword)
        if libVerPos == -1:
            print "没有找到[" + verGapKeyword + "]关键字,无法解析库版本"
            libNames=libFull
            #return
        else:
            libVer = libFull[libVerPos+len(verGapKeyword):]
            print libVer
            libNames = libFull[0:libVerPos].strip()
        print libNames
        libNamePos = libNames.find(archGapKeyword)
        if libNamePos == -1:
            print "开始安装:" + libNames
            installPkg(dvdPath, libNames)
        else:
            libName = libNames[0:libNamePos].strip()
            libArchRight=libNames.find(archGapKeywordEnd)
            libArch = libNames[libNamePos+len(archGapKeyword):libArchRight]
            print "libName[" + libName + "], libArch[" + libArch + "]"
            if libArch == "x86-64":
                libArch = "x86_64"
            elif libArch == "x86_64":
                libArch = "x86_64"
            elif len(libArch) == 0:
                print "无法处理这个库: " +libNames
            else:
                libName=libArch
                libArch = "x86_64"
            installPkg(dvdPath, libName, libArch)


installPkg(dvdPath, fileNamePre)

[root@bclinux8 ~]# yum install openssl-devel
服务器检查结果:
告警您的授权码是无效的,请获得正确的授权码来注册大云Linux操作系统。您可以使用'bclinux-license -g'命令获得机器码,然后与我们联系帮您产生订阅从而获得正确的授权码。

 示例:

[root@bclinux8 ~]# rpm -ivh /mnt/dvd1/BaseOS/Packages/libselinux-devel-2.9-2.1.el8.x86_64.rpm
警告:/mnt/dvd1/BaseOS/Packages/libselinux-devel-2.9-2.1.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 06bfb671: NOKEY
错误:依赖检测失败:
pkgconfig(libpcre2-8) 被 libselinux-devel-2.9-2.1.el8.x86_64 需要
[root@bclinux8 ~]# rpm -qpR /mnt/dvd1/BaseOS/Packages/libselinux-devel-2.9-2.1.el8.x86_64.rpm
警告:/mnt/dvd1/BaseOS/Packages/libselinux-devel-2.9-2.1.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 06bfb671: NOKEY
/usr/bin/pkg-config
libselinux(x86-64) = 2.9-2.1.el8
libselinux.so.1()(64bit)
libsepol-devel(x86-64) >= 2.9-1
pkgconfig(libpcre2-8)
pkgconfig(libsepol)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
[root@bclinux8 ~]# rpm -qa |grep pcre2
pcre2-utf32-10.32-1.el8.x86_64
pcre2-10.32-1.el8.x86_64
pcre2-utf16-10.32-1.el8.x86_64
[root@bclinux8 ~]# ./py_install_rpm.py /mnt/dvd1/  pcre2-devel
Begin parsing for pcre2-devel
find /mnt/dvd1/ -name pcre2-devel* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/pcre2-devel-10.32-1.el8.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/pcre2-devel-10.32-1.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 06bfb671: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
pcre2-devel-10.32-1.el8               ########################################]
安装可能成功
[root@bclinux8 ~]# rpm -qa |grep pcre2                        
pcre2-utf32-10.32-1.el8.x86_64
pcre2-10.32-1.el8.x86_64
pcre2-utf16-10.32-1.el8.x86_64
pcre2-devel-10.32-1.el8.x86_64
[root@bclinux8 ~]# ./py_install_rpm.py /mnt/dvd1/  openssl-deve
Begin parsing for openssl-deve
find /mnt/dvd1/ -name openssl-deve* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID 06bfb671: NOKEY
错误:依赖检测失败:
krb5-devel(x86-64) 被 openssl-devel-1:1.1.1c-3.el8_1.x86_64 需要]
安装失败,因:依赖检测失败:
dependsRows=[
krb5-devel(x86-64) 被 openssl-devel-1:1.1.1c-3.el8_1.x86_64 需要]
dependrow=[krb5-devel(x86-64) 被 openssl-devel-1:1.1.1c-3.el8_1.x86_64 需要]
krb5-devel(x86-64)
没有找到[=]关键字,无法解析库版本
krb5-devel(x86-64)
libName[krb5-devel], libArch[x86-64]
Begin parsing for krb5-devel
find /mnt/dvd1/ -name krb5-devel* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/krb5-devel-1.17-9.el8.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/krb5-devel-1.17-9.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 06bfb671: NOKEY
错误:依赖检测失败:
libselinux-devel 被 krb5-devel-1.17-9.el8.x86_64 需要]
安装失败,因:依赖检测失败:
dependsRows=[
libselinux-devel 被 krb5-devel-1.17-9.el8.x86_64 需要]
dependrow=[libselinux-devel 被 krb5-devel-1.17-9.el8.x86_64 需要]
libselinux-devel
没有找到[=]关键字,无法解析库版本
libselinux-devel
开始安装:libselinux-devel
Begin parsing for libselinux-devel
find /mnt/dvd1/ -name libselinux-devel* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/libselinux-devel-2.9-2.1.el8.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/libselinux-devel-2.9-2.1.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 06bfb671: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
libselinux-devel-2.9-2.1.el8          ########################################]
安装可能成功
[root@bclinux8 ~]# ./py_install_rpm.py /mnt/dvd1/  openssl-deve
Begin parsing for openssl-deve
find /mnt/dvd1/ -name openssl-deve* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID 06bfb671: NOKEY
错误:依赖检测失败:
krb5-devel(x86-64) 被 openssl-devel-1:1.1.1c-3.el8_1.x86_64 需要]
安装失败,因:依赖检测失败:
dependsRows=[
krb5-devel(x86-64) 被 openssl-devel-1:1.1.1c-3.el8_1.x86_64 需要]
dependrow=[krb5-devel(x86-64) 被 openssl-devel-1:1.1.1c-3.el8_1.x86_64 需要]
krb5-devel(x86-64)
没有找到[=]关键字,无法解析库版本
krb5-devel(x86-64)
libName[krb5-devel], libArch[x86-64]
Begin parsing for krb5-devel
find /mnt/dvd1/ -name krb5-devel* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/krb5-devel-1.17-9.el8.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/krb5-devel-1.17-9.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 06bfb671: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
krb5-devel-1.17-9.el8                 ########################################]
安装可能成功
[root@bclinux8 ~]# ./py_install_rpm.py /mnt/dvd1/  openssl-deve
Begin parsing for openssl-deve
find /mnt/dvd1/ -name openssl-deve* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID 06bfb671: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
openssl-devel-1:1.1.1c-3.el8_1        ########################################]
安装可能成功
[root@bclinux8 ~]# ./py_install_rpm.py /mnt/dvd1/  openssl-deve
Begin parsing for openssl-deve
find /mnt/dvd1/ -name openssl-deve* |grep x86_64
val=[/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm]
valInstall=[警告:/mnt/dvd1/BaseOS/Packages/openssl-devel-1.1.1c-3.el8_1.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID 06bfb671: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
软件包 openssl-devel-1:1.1.1c-3.el8_1.x86_64 已经安装]
安装可能成功