#表明这是一个python 脚本
#!/usr/bin/env python
import sys
import os
import requests
import urlparse
import BeautifulSoup
import re
import threading
global_lock = threading.Lock()
#定义一个函数
def get_all_packages_name():
"""
To get candidate packages name
"""
#定义一个空字典
name_dict = {}
num = 0
# python调用shell 脚本的两种方式之一,一种是调用os.system,其返回值只能是0,1,2.
#一种是os.popen.其会把命令执行的结果作为返回值返回,例如这里我们就是要repoquery -qa --repoid
#命令的执行结果。这个执行结果每一行代表一个package.
packages_list = os.popen("repoquery -qa --repoid=" + repo_id).readlines()
for packagename in packages_list:
#取:后的第一个字符串,就是package的namee
packagename = packagename.split(':')[0]
pos = packagename.rfind('-')
packagename = packagename[:pos]
#将包的数量和name 存在字典中
name_dict[packagename] = name_dict.get(packagename, 0) + 1
num += 1
print("The repository:%s has %d packages"%(repo_id, num))
#返回这个字典
return name_dict
# name_dict = {}
# repos_list = []
# available_repos = os.popen("yum repolist").readlines()
# begin_to_parse = False
# for key in available_repos:
# if re.search('repo id', key):
# begin_to_parse = True
# continue
# elif not begin_to_parse:
# continue
#
# if not re.search("repolist", key):
# repo_id = re.split(' +', key)[0]
# if repo_id[0] == '!':
# repo_id = repo_id[1:]
# repo_id = repo_id.split('/')[0]
# repos_list.append(repo_id)
# for repo_id in repos_list:
# num = 0
# packages_list = os.popen("repoquery -qa --repoid=" + repo_id).readlines()
# for packagename in packages_list:
# packagename = packagename.split(':')[0]
# pos = packagename.rfind('-')
# packagename = packagename[:pos]
# name_dict[packagename] = name_dict.get(packagename, 0) + 1
# num += 1
# print("The repository:%s has %d packages"%(repo_id, num))
# return name_dict
def rpm_erase_all_packages(logdir):
#得到package的字典
packages_name = get_all_packages_name()
#新建两个文件,这个文件的路径logdir/del_failure_list 和 logdir/del_success_list
del_failure = open(os.path.join(logdir, "del_failure_list"), "w")
del_success = open(os.path.join(logdir, "del_success_list"), "w")
#packages_name.keys 就是package的name
for package in packages_name.keys():
#通过os.system 执行sudo yum erase -y 来删除这个包
os.system("sudo yum erase -y " + package)
#通过os.popen 执行rpm -qa 命令看这个包还能否查到
ret = os.popen("rpm -qa | grep " + package).readlines()
#如果能查到说明前面删除包的命令失败了,则将这个包写入到del_failure 中,删除成功的话,则写入到del_success 中
if len(ret) > 0:
del_failure.write("%s\t\n"%package)
else :
del_success.write("%s\t\n"%package)
return
#这个函数是要安装包,和rpm_erase_all_packages 中的函数一致,就不分析了.
def rpm_install_all_packages(logdir):
packages_name = get_all_packages_name()
install_failure = open(os.path.join(logdir, "install_failure_list"), "w")
install_success = open(os.path.join(logdir, "install_success_list"), "w")
for package in packages_name.keys():
os.system("sudo yum install -y " + package)
ret = os.popen("rpm -qa | grep " + package).readlines()
if len(ret) > 0:
install_success.write("%s\t\n"%package)
else :
install_failure.write("%s\t\n"%package)
return
#通过命令行执行的话,则下面这个if条件成立
if __name__ == "__main__":
#赋值
logdir = "/tmp/rpmverifylog"
cmd = ""
repo_id = "Estuaryftp"
#根据输入的数量来分参数赋值
if len(sys.argv) >= 4:
repo_id = str(sys.argv[3])
if len(sys.argv) >= 3:
logdir = str(sys.argv[2])
if len(sys.argv) >= 2:
cmd = str(sys.argv[1])
#logdir 这个路径如果不存在的话,则通过os.makedirs来新建
if not os.path.exists(logdir):
os.makedirs(logdir)
# for url in REPO_URLS:
# pos = url.find('/')
# PARENT_URLS.append(url[pos:])
#可以看到cmd 命令分为install和erase,分别执行前面分析过的rpm_install_all_packages 和 rpm_erase_all_packages 函数
if cmd == "install" :
rpm_install_all_packages(logdir)
elif cmd == "erase" :
rpm_erase_all_packages(logdir)
else :
#cmd 如果不是install 或者 erase的话,则打印log 说明这个python脚本的用法.
print("Usage: ./rpm_verify.py {install | erase} <log dir>")
utils/rpm_verify.py
最新推荐文章于 2020-11-21 09:46:48 发布