本文共 5500 字,大约阅读时间需要 18 分钟。
#python脚本的第一行表示这个是python脚本#!/usr/bin/env python#导入库import sysimport osimport requestsimport urlparseimport commandsimport BeautifulSoupimport reVERSION="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) returndef 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## Introduction It lists the packages which are maintained by Open-Estuary team so far.## Packages List 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)
转载地址:http://wrjmi.baihongyu.com/