#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)
	

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐