utils/pkg_list_update.py
#python脚本的第一行表示这个是python脚本#!/usr/bin/env python#导入库import sysimport osimport requestsimport urlparseimport commandsimport BeautifulSoupimport reVERSION="5.0"#字典赋初值g_pkg_src = {"Cen
·
#python脚本的第一行表示这个是python脚本
#!/usr/bin/env python
#导入库
import sys
import os
import requests
import urlparse
import commands
import BeautifulSoup
import re
VERSION="5.0"
#字典赋初值
g_pkg_src = {
"CentOS" : { "rpm": "ftp://repoftp:repopushez7411@117.78.41.188/releases/"+VERSION+"/centos/SRPMS" },
"Ubuntu" : { "deb": "ftp://repoftp:repopushez7411@117.78.41.188/releases/"+VERSION+"/ubuntu/dists/estuary-"+VERSION+"/main/source/Sources" },
"Debian" : { "deb": "ftp://repoftp:repopushez7411@117.78.41.188/releases/"+VERSION+"/debian/dists/estuary-"+VERSION+"/main/source/Sources" },
}
#定义一个函数,来得到候选的包,看code主要是处理rpm源码包
def decode_rpm_packages_list(ftp_url, platform, pkg_dict):
"""
To get candidate packages
"""
#使用 commands 库并赋予形参的值
status, packages_rsp = commands.getstatusoutput("curl -l " + ftp_url + "/*")
#去掉换行符
packages_rsp = packages_rsp.split('\n')
#遍历保存在packages_rsp 中的包
for packagename in packages_rsp:
#去掉包中的空格
packagename = packagename.strip()
#如果包是以.src.rpm 结束的
if packagename.endswith('.src.rpm'):
#从这里知道报名室友basename 和version组成,例如 kernel-5.0.src.rpm 通过rfind 和字符串截取分别得到包名和包的版本信息
pos = packagename.rfind('-')
packagename = packagename[:pos]
pos = packagename.rfind('-')
basename = packagename[:pos]
version = packagename[pos+1:]
#组成新的字符串
packagename = basename + "\t" + version
#如果pkg_dict字典中包含packagename,则拿到packagename的值之后,后面添加上形参执行的字符串platform
if pkg_dict.has_key(packagename):
pkg_dict[packagename] = pkg_dict[packagename] + "," + platform
#如果不存在的话,则以packagename 为key,以platfrom为值保存在pkg_dict
else :
pkg_dict[packagename] = platform
return
#和上面的函数类似,这里处理deb的源码包
def decode_deb_packages_list(src_url, platform, pkg_dict):
source_file = "./local_tmp_deb_source_file"
#通过os.system 执行shell 命令下载deb 源码包
os.system("wget -O " + source_file + " " + src_url)
deb_dict = {}
#打开这个文件,这里用with打卡效果更好
file_handle = open(source_file)
for line in file_handle:
elems = re.split('\ +', line)
packagename = ""
#这个文件中的每一行都是一个deb的源码包,这里是要找到包名
if len(elems) >= 3 and re.search('.orig.tar', elems[2]):
packagename = elems[2]
elif len(elems) >=4 and re.search('.orig.tar', elems[3]):
packagename = elems[3]
if packagename != "":
pos = packagename.find('.orig')
packagename = packagename[:pos]
pack_elems = packagename.split('_')
basename = pack_elems[0]
version = pack_elems[1]
#如果包名不为null,则把包名对应的 deb_dict 清空,为后面的重新复制做好准备
deb_dict[basename + "\t" + version] = 0
#和rpm 包相同的处理规则,更新pkg_dict 字典
for key in deb_dict.keys():
if pkg_dict.has_key(key):
pkg_dict[key] = pkg_dict[key] + "," + platform
else:
pkg_dict[key] = platform
#通过rm 命令删除这个文件
os.system("rm " + source_file)
return
def gen_pkg_list(pkg_list_filename):
pkg_dict = {}
for key in g_pkg_src.keys():
for pkg_type in g_pkg_src[key].keys():
#根据rpm还是deb分别更新对应的记录源码包的字典
if pkg_type == "rpm" :
decode_rpm_packages_list(g_pkg_src[key][pkg_type], key, pkg_dict)
elif pkg_type == "deb" :
decode_deb_packages_list(g_pkg_src[key][pkg_type], key, pkg_dict)
#在pkg_dict 中添加3项
pkg_dict["cassandra\t3.0"] = "CentOS,Ubuntu"
pkg_dict["cassandra\t2.0"] = "CentOS"
pkg_dict["elasticsearch\t5.5"] = "CentOS"
filehandle = open(pkg_list_filename, "w")
default_str = '''
* [Introduction](#1)
* [Packages List](#2)
# Open-Estuary Packages List
## <a name="1">Introduction</a>
It lists the packages which are maintained by Open-Estuary team so far.
## <a name="2">Packages List</a>
Currently the following packages are supported by Open-Estuary repo:
'''
#打开pkg_list_filename,并写入default_str
filehandle.write("%s\n"%default_str)
#继续写入
filehandle.write("|Package Name|Estuary Releases|Packages Releases|CentOS|Ubuntu|Debian|Notes|\n")
filehandle.write("|--|--|--|--|--|--|--|\n")
#得到保存源码包的字典的key,并排序
pkg_keys = pkg_dict.keys()
pkg_keys.sort()
for pkg in pkg_keys:
elems = pkg.split('\t')
#拿到源码包中的distro ,对应前面函数中的platform
distro = pkg_dict[pkg]
distro_enable_dict = {}
for distro_key in g_pkg_src.keys():
if re.search(distro_key, distro):
#看这个源码包属于哪个os,
distro_enable_dict[distro_key] = "Y"
#获得前一句保存的os,如果没有就为空
centos = distro_enable_dict.get("CentOS", "")
ubuntu = distro_enable_dict.get("Ubuntu", "")
debian = distro_enable_dict.get("Debian", "")
#将这些信息写入文件中
filehandle.write("|%s|%s|%s|%s|%s|%s|%s|\n"%(elems[0], VERSION, elems[1], centos, ubuntu, debian, ""))
filehandle.write("||||||||\n")
#关闭这个文件,如果有with打开这个文件的话,就不用关闭这个问题
filehandle.close()
return
#如果__name__ == "__main__" 说明是从命令行来执行这个脚本,并不是调用这个脚本中的函数
if __name__ == "__main__":
output_filename = "../packages_list.md"
#如果输入的参数大于等于2,就把第一个参数赋值给output_filename,否则output_filename 取默认值
if len(sys.argv) >= 2:
output_filename = sys.argv[1]
#输入的参数大于等于3
if len(sys.argv) >= 3:
old_version = VERSION
#第二个参数保存的是version
VERSION = sys.argv[2]
for key in g_pkg_src.keys():
for pkg_type in g_pkg_src[key].keys():
url = g_pkg_src[key][pkg_type]
url = url.replace(old_version, VERSION)
#更新g_pkg_src 中的下载链接rul,g_pkg_src相当于二维数组.在g_pkg_src 中key的值value 又是一个字典.
g_pkg_src[key][pkg_type] = url
#解析源码包
gen_pkg_list(output_filename)
更多推荐
已为社区贡献14条内容
所有评论(0)