diff --git a/CmdChecker/__init__.py b/CmdChecker/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fea8b2a70d392b74e4bf3876a66a4e048078bee6 --- /dev/null +++ b/CmdChecker/__init__.py @@ -0,0 +1,6 @@ +# coding=utf-8 +""" +@Project : OSChecker +@Time : 2022/7/27 15:16 +@Author : wangbin +""" diff --git a/CmdChecker/cmd_checker.py b/CmdChecker/cmd_checker.py new file mode 100644 index 0000000000000000000000000000000000000000..0420987b33e36808eb74dcdbea24dffe2847cc88 --- /dev/null +++ b/CmdChecker/cmd_checker.py @@ -0,0 +1,286 @@ +# coding=utf-8 +""" +@Project : OSChecker +@Time : 2022/7/27 15:22 +@Author : wangbin +""" +import argparse +import sys +import os +import json +import time +import re +import logging +from subprocess import PIPE, Popen + + +def log_handler(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + + ch = logging.StreamHandler() + formatter = logging.Formatter('[%(asctime)s][CmdChecker][%(levelname)s][%(message)s]') + ch.setFormatter(formatter) + logger.addHandler(ch) + + log_file_path = 'CmdChecker/logs/log_cmd_checker.txt' + fh = logging.FileHandler(log_file_path) + formatter = logging.Formatter('[%(asctime)s][CmdChecker][%(filename)s:%(lineno)d]:[%(levelname)s][%(message)s]') + fh.setFormatter(formatter) + logger.addHandler(fh) + return logger + + +logger = log_handler() + + +class Standard: + """ + 描述标准的类 + """ + def __init__(self, cmd_json): + with open(cmd_json, 'r', encoding='utf-8') as f: + self.cmd_list = json.load(f).get('system_cmds') + + def get_list(self): + return self.cmd_list + + +class CMD: + """ + cmd类 + """ + def __init__(self, cmd_path): + """ + 读取系统制定路径内的命令 + :param cmd_path: + """ + with open(cmd_path, 'r', encoding='utf-8') as f: + path_list = json.load(f).get('系统命令位置') + self.cmd_list = [] + for path in path_list: + for root, dirs, files in os.walk(path): + for cmd in files: + self.cmd_list.append(cmd) + with open(cmd_path, 'r', encoding='utf-8') as f: + self.cmd_with_file = json.load(f).get('需要文件的命令') + + def is_exist(self, cmd): + """ + cmd 存在性检查 + :param cmd: + :return: + """ + result = 'pass' if cmd in self.cmd_list else 'fail' + return { + 'result': result + } + + def check_run(self, cmd): + """ + cmd 执行检查 + :param cmd: + :return: + """ + if cmd in self.cmd_with_file.keys(): + file = self.cmd_with_file.get(cmd) + file = os.path.abspath(f"CmdChecker/testfiles/{file}") + command = f'{cmd} {file}' + else: + command = f'{cmd} --version' + re_str = 'not found' + re_str_CN = '未找到' + p = Popen(command, shell=True, stderr=PIPE, stdout=PIPE) + stdout, stderr = p.communicate() + error_by_stderr = re.search(re_str, stderr.decode('utf-8')) + error_CN_by_stderr = re.search(re_str_CN, stderr.decode('utf-8')) + if error_by_stderr or error_CN_by_stderr: + return { + 'result': 'fail' + } + return { + 'result': 'pass' + } + + @staticmethod + def get_os_cmd_version(cmd): + re_str = r'\b\d+\.[\d\.a-z]+' + if cmd == 'sh': + po = os.popen(f'echo $SHELL') + cmd = po.readline() + cmd = cmd[:-1] + # if cmd == 'pax': + # po = os.popen(f'{cmd} --version') + # fetch = po.readline() + # version_by_version = re.search(re_str, fetch) + # if version_by_version: + # os_version = version_by_version.group() + # return os_version + # + # fetch = os.popen(f'{cmd} -V').readline() + # version_by_V = re.search(re_str, fetch) + # if version_by_V: + # os_version = version_by_V.group() + # return os_version + for params in ['--version', '-V']: + p = Popen(f'{cmd} {params}', shell=True, stderr=PIPE, stdout=PIPE) + stdout, stderr = p.communicate() + version_by_stdout = re.search(re_str, stdout.decode('utf-8')) + version_by_stderr = re.search(re_str, stderr.decode('utf-8')) + if version_by_stdout: + os_version = version_by_stdout.group() + return os_version + if version_by_stderr: + os_version = version_by_stderr.group() + return os_version + + return 'not found' + + @staticmethod + def get_os_cmd_path(cmd): + if cmd == 'sh': + shell_cmd = 'echo $SHELL' + else: + shell_cmd = 'which ' + cmd + + po = os.popen(f'{shell_cmd}') + path = po.read().split('\n')[0] + + return path or 'not found' + + @staticmethod + def compare_version(standard_version, os_version): + ver1 = [int(x) for x in standard_version.split('.')] + ver2 = [int(x) for x in os_version.split('.')] + scenario_1 = ver1[0] > ver2[0] + scenario_2 = ver1[0] == ver2[0] and ver1[1] > ver2[1] + if len(ver1) > 2 and len(ver2) > 2: + scenario_3 = ver1[0] == ver2[0] and ver1[1] == ver2[1] and ver1[2] > ver2[2] + else: + scenario_3 = False + if scenario_1 or scenario_2 or scenario_3: + logger.info(f'标准版本:{standard_version}, 系统中实际版本:{os_version},标准测试 FAIL 。。。') + return 'fail' + logger.info(f'标准版本:{standard_version}, 系统中实际版本:{os_version},标准测试 PASS 。。。') + return 'pass' + + +class Result: + def __init__(self): + self.result = [] + + def add(self, stand, exist_result, run_result, cmd_version, cmd_path): + + if run_result.get('result') == 'pass': + result = 'pass' + elif run_result.get('result') == 'skip': + result = 'pass' + elif run_result.get('result') == 'fail': + result = 'fail' + else: + result = 'warning' + + self.result.append({ + 'name': stand.get('name'), + 'exist_check': exist_result, + 'run_check': run_result, + 'cmd_version': cmd_version, + 'cmd_path': cmd_path, + 'result': result + }) + + def stat(self): + total = 0 + pass_count = 0 + warn_count = 0 + for res in self.result: + total += 1 + pass_count += 1 if res.get('result') == 'pass' else 0 + warn_count += 1 if res.get('run_check').get('result') == 'warning' else 0 + data = { + 'total': total, + 'pass': pass_count, + 'warning': warn_count, + 'fail': total - pass_count - warn_count + } + # logger.info(data) + return data + + def export(self, timestamp=None, path=None): + # pprint.pprint(self.result) + data = { + 'handler': 'cmdchecker', + 'result': self.result + } + path = path or 'Outputs' + if not timestamp: + result_file = path + '/cmd_' + time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + '.json' + else: + result_file = path + '/cmd_' + timestamp + '.json' + with open(result_file, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=1) + logger.info(f'CmdChecker 测试完成,测试结果见 {path}') + return path + + +class CmdChecker: + def __init__(self, cmd_json_path=None, cmd_path_conf_path=None): + logger.info('CmdChecker 执行开始。。。') + cmd_json = cmd_json_path or os.path.abspath('Jsons/cmd_list.json') + cmd_config_path = cmd_path_conf_path or os.path.abspath('Config/cmd_config.json') + self.standard = Standard(cmd_json).get_list() + self.os_cmd = CMD(cmd_config_path) + self.result = Result() + + def check(self): + # tmp = [] + for stand in self.standard: + logger.info(f'cmd running...{stand}...') + exist_result = self.os_cmd.is_exist(stand.get('name')) + run_result = self.os_cmd.check_run(stand.get('name')) + cmd_version = CMD.get_os_cmd_version(stand.get('name')) + cmd_path = CMD.get_os_cmd_path(stand.get('name')) + + self.result.add(stand=stand, exist_result=exist_result, run_result=run_result, cmd_version=cmd_version, cmd_path=cmd_path) + logger.info(f"\ncmd: {stand.get('name')}\n" + f"exist_check: {exist_result}\n" + f"run_result: {run_result}\n" + f"cmd_version: {cmd_version}\n" + f"cmd_path: {cmd_path}\n") + # tmp.append({ + # "name": stand.get('name'), + # "version": os_V + # }) + # path = 'CmdChecker/report/cmd_result_tmp.json' + # with open(path, 'w', encoding='utf-8') as f: + # json.dump({'result': tmp}, f) + + def export(self, timestamp=None): + return self.result.export(timestamp) + + def stat(self): + data = self.result.stat() + logger.info(f'CmdChecker 测试结果:{data}') + return data + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="操作系统标准工具SIG CMDChecker") + parser.add_argument('-V', '--version', action='version', version='version 1.0 操作系统标准工具SIG CMDChecker') + parser.add_argument('-L', '--list', default=None, metavar='cmd_list.json', help='cmd_list的json文件') + parser.add_argument('-P', '--path', default=None, metavar='cmd_config.json', help='cmd可能存在的路径配置文件') + parser.add_argument('-T', '--timestamp', default=None, action='store', type=str) + args = parser.parse_args() + if args.list and not os.path.isfile(args.list): + print('CmdList.json 文件不正确 !!!') + sys.exit(1) + if args.path and not os.path.isfile(args.path): + print('cmd_config.json 文件不正确 !!!') + sys.exit(1) + + # main(args.list, args.path) + checker = CmdChecker() + checker.check() + checker.export(args.timestamp) + checker.stat() + diff --git a/CmdChecker/logs/.file b/CmdChecker/logs/.file new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/CmdChecker/logs/log_cmd_checker.txt b/CmdChecker/logs/log_cmd_checker.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/CmdChecker/testfiles/at b/CmdChecker/testfiles/at new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/CmdChecker/testfiles/cat b/CmdChecker/testfiles/cat new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/CmdChecker/testfiles/strings b/CmdChecker/testfiles/strings new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/CmdChecker/testfiles/test.sh b/CmdChecker/testfiles/test.sh new file mode 100644 index 0000000000000000000000000000000000000000..dd1b483e818a87a17b9671616f63cca7062ba7d7 --- /dev/null +++ b/CmdChecker/testfiles/test.sh @@ -0,0 +1 @@ +echo "Hello World!" diff --git a/CmdChecker/utils.py b/CmdChecker/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..0c54120d200184bc60a178a4d0ba8ee1ef3bc945 --- /dev/null +++ b/CmdChecker/utils.py @@ -0,0 +1,31 @@ +# coding=utf-8 +""" +@Project : 20220916-OSChecker +@Time : 2022/9/20 14:24 +@Author : wangbin +""" + +import json +import pprint + +with open('cmdlist.txt') as f: + data = f.readlines() + + +pprint.pprint(data) + +result = [] +for cmd in data: + result.append({ + 'name': cmd.replace('\n', '') + }) + +result = { + 'std_name': '信息技术应用创新 操作系统应用编程接口要求', + 'system_cmds': result +} +# res = json.dumps(result) +# pprint.pprint(res) + +with open('cmd_list.json', 'w', encoding='utf-8') as f: + json.dump(result, f, ensure_ascii=False, indent=1) diff --git a/Config/cmd_config.json b/Config/cmd_config.json new file mode 100644 index 0000000000000000000000000000000000000000..5d2616d0910287f061fa6f6ea25fcbeb4193351c --- /dev/null +++ b/Config/cmd_config.json @@ -0,0 +1,11 @@ +{ + "标准名称": "信息技术应用创新 操作系统应用变成接口要求", + "系统命令位置": [ + "/usr/bin/", + "/usr/local/bin/", + "/usr/sbin/" + ], + "需要文件的命令": { + "sh": "tesh.sh" + } +} \ No newline at end of file diff --git a/Config/cmd_result_tmp.json b/Config/cmd_result_tmp.json new file mode 100644 index 0000000000000000000000000000000000000000..c34e9d358d95ef9e89a4355569c4c546c8dbcad5 --- /dev/null +++ b/Config/cmd_result_tmp.json @@ -0,0 +1,564 @@ +{ + "result": [ + { + "name": "at", + "version": "3.1.23" + }, + { + "name": "batch", + "version": "not found" + }, + { + "name": "sh", + "version": "skip" + }, + { + "name": "bc", + "version": "1.07.1" + }, + { + "name": "ar", + "version": "2.34" + }, + { + "name": "strings", + "version": "2.34" + }, + { + "name": "strip", + "version": "2.34" + }, + { + "name": "brctl", + "version": "not found" + }, + { + "name": "chkconfig", + "version": "not found" + }, + { + "name": "[", + "version": "not found" + }, + { + "name": "basename", + "version": "8.30" + }, + { + "name": "cat", + "version": "8.30" + }, + { + "name": "chgrp", + "version": "8.30" + }, + { + "name": "chmod", + "version": "8.30" + }, + { + "name": "chown", + "version": "8.30" + }, + { + "name": "cksum", + "version": "8.30" + }, + { + "name": "comm", + "version": "8.30" + }, + { + "name": "cp", + "version": "8.30" + }, + { + "name": "csplit", + "version": "8.30" + }, + { + "name": "cut", + "version": "8.30" + }, + { + "name": "date", + "version": "8.30" + }, + { + "name": "dd", + "version": "8.30" + }, + { + "name": "df", + "version": "8.30" + }, + { + "name": "dirname", + "version": "8.30" + }, + { + "name": "du", + "version": "8.30" + }, + { + "name": "echo", + "version": "not found" + }, + { + "name": "env", + "version": "8.30" + }, + { + "name": "expand", + "version": "8.30" + }, + { + "name": "expr", + "version": "8.30" + }, + { + "name": "false", + "version": "not found" + }, + { + "name": "fold", + "version": "8.30" + }, + { + "name": "groups", + "version": "8.30" + }, + { + "name": "head", + "version": "8.30" + }, + { + "name": "id", + "version": "8.30" + }, + { + "name": "install", + "version": "8.30" + }, + { + "name": "join", + "version": "8.30" + }, + { + "name": "ln", + "version": "8.30" + }, + { + "name": "logname", + "version": "8.30" + }, + { + "name": "ls", + "version": "8.30" + }, + { + "name": "md5sum", + "version": "8.30" + }, + { + "name": "mkdir", + "version": "8.30" + }, + { + "name": "mkfifo", + "version": "8.30" + }, + { + "name": "mknod", + "version": "8.30" + }, + { + "name": "mktemp", + "version": "8.30" + }, + { + "name": "mv", + "version": "8.30" + }, + { + "name": "nice", + "version": "8.30" + }, + { + "name": "nl", + "version": "8.30" + }, + { + "name": "nohup", + "version": "8.30" + }, + { + "name": "od", + "version": "8.30" + }, + { + "name": "paste", + "version": "8.30" + }, + { + "name": "pathchk", + "version": "8.30" + }, + { + "name": "pr", + "version": "8.30" + }, + { + "name": "printf", + "version": "not found" + }, + { + "name": "pwd", + "version": "not found" + }, + { + "name": "rm", + "version": "8.30" + }, + { + "name": "rmdir", + "version": "8.30" + }, + { + "name": "seq", + "version": "8.30" + }, + { + "name": "sleep", + "version": "8.30" + }, + { + "name": "sort", + "version": "skip" + }, + { + "name": "split", + "version": "8.30" + }, + { + "name": "stty", + "version": "8.30" + }, + { + "name": "sync", + "version": "8.30" + }, + { + "name": "tail", + "version": "8.30" + }, + { + "name": "tee", + "version": "8.30" + }, + { + "name": "test", + "version": "not found" + }, + { + "name": "touch", + "version": "8.30" + }, + { + "name": "tr", + "version": "8.30" + }, + { + "name": "true", + "version": "not found" + }, + { + "name": "tsort", + "version": "8.30" + }, + { + "name": "tty", + "version": "8.30" + }, + { + "name": "uname", + "version": "8.30" + }, + { + "name": "unexpand", + "version": "8.30" + }, + { + "name": "uniq", + "version": "8.30" + }, + { + "name": "wc", + "version": "8.30" + }, + { + "name": "cpio", + "version": "2.13" + }, + { + "name": "crontab", + "version": "1003.2" + }, + { + "name": "lp", + "version": "not found" + }, + { + "name": "lpr", + "version": "not found" + }, + { + "name": "cmp", + "version": "3.7" + }, + { + "name": "diff", + "version": "3.7" + }, + { + "name": "ed", + "version": "not found" + }, + { + "name": "file", + "version": "5.38" + }, + { + "name": "find", + "version": "4.7.0" + }, + { + "name": "xargs", + "version": "4.7.0" + }, + { + "name": "awk", + "version": "5.0.1" + }, + { + "name": "gettext", + "version": "0.19.8.1" + }, + { + "name": "msgfmt", + "version": "0.19.8.1" + }, + { + "name": "gencat", + "version": "skip" + }, + { + "name": "getconf", + "version": "skip" + }, + { + "name": "iconv", + "version": "2.31" + }, + { + "name": "locale", + "version": "2.31" + }, + { + "name": "localedef", + "version": "2.31" + }, + { + "name": "egrep", + "version": "3.4" + }, + { + "name": "fgrep", + "version": "3.4" + }, + { + "name": "grep", + "version": "3.4" + }, + { + "name": "gunzip", + "version": "1.10" + }, + { + "name": "gzip", + "version": "1.10" + }, + { + "name": "zcat", + "version": "1.10" + }, + { + "name": "hostname", + "version": "3.23" + }, + { + "name": "lsb_release", + "version": "not found" + }, + { + "name": "less", + "version": "not found" + }, + { + "name": "m4", + "version": "1.4.18" + }, + { + "name": "mailx", + "version": "not found" + }, + { + "name": "make", + "version": "4.2.1" + }, + { + "name": "man", + "version": "2.9.1" + }, + { + "name": "infocmp", + "version": "6.2.20200212" + }, + { + "name": "tput", + "version": "6.2.20200212" + }, + { + "name": "passwd", + "version": "not found" + }, + { + "name": "patch", + "version": "2.7.6" + }, + { + "name": "pidof", + "version": "not found" + }, + { + "name": "ps", + "version": "not found" + }, + { + "name": "fuser", + "version": "not found" + }, + { + "name": "killall", + "version": "not found" + }, + { + "name": "sed", + "version": "4.7" + }, + { + "name": "sendmail", + "version": "not found" + }, + { + "name": "groupadd", + "version": "not found" + }, + { + "name": "groupdel", + "version": "not found" + }, + { + "name": "groupmod", + "version": "not found" + }, + { + "name": "newgrp", + "version": "not found" + }, + { + "name": "useradd", + "version": "not found" + }, + { + "name": "userdel", + "version": "not found" + }, + { + "name": "usermod", + "version": "not found" + }, + { + "name": "pax", + "version": "not found" + }, + { + "name": "shutdown", + "version": "not found" + }, + { + "name": "tar", + "version": "1.30" + }, + { + "name": "time", + "version": "1.7" + }, + { + "name": "col", + "version": "not found" + }, + { + "name": "dmesg", + "version": "2.34" + }, + { + "name": "ipcrm", + "version": "2.34" + }, + { + "name": "ipcs", + "version": "2.34" + }, + { + "name": "kill", + "version": "not found" + }, + { + "name": "logger", + "version": "2.34" + }, + { + "name": "more", + "version": "2.34" + }, + { + "name": "mount", + "version": "2.34" + }, + { + "name": "renice", + "version": "2.34" + }, + { + "name": "su", + "version": "2.34" + }, + { + "name": "umount", + "version": "2.34" + }, + { + "name": "chfn", + "version": "not found" + }, + { + "name": "chsh", + "version": "not found" + }, + { + "name": "which", + "version": "not found" + } + ] +} \ No newline at end of file diff --git a/Docs/01-GUIs/alpha-01.png b/Docs/01-GUIs/alpha-01.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1ebaa7c7a8e9cceaec629ecbc46118a7b8b8a4 Binary files /dev/null and b/Docs/01-GUIs/alpha-01.png differ diff --git "a/Docs/CmdChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" "b/Docs/CmdChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" new file mode 100644 index 0000000000000000000000000000000000000000..2f610a735ef83e64b6b916630afc99df7c235914 --- /dev/null +++ "b/Docs/CmdChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" @@ -0,0 +1,42 @@ +# CmdChecker + +cmdchecker 是一款检查操作系统内置命令是否符合标准的快捷工具 +## 环境要求 +python 3.7+ + +## 使用方法 +1. 进入OSChecker主目录 +cd OSChecker +2. 使用python3执行cmdchecker检查工具 +python3 CmdChecker/cmd_checker.py +3. 常用参数 +usage: cmd_checker.py [-h] [-V] [-L cmd_list.json] [-P config.json] + + + 操作系统标准工具SIG CMDChecker + optional arguments: + -h, --help show this help message and exit + -V, --version show program's version number and exit + -L cmd_list.json, --list cmd_list.json + cmd_list的json文件 + -P config.json, --path config.json + cmd可能存在的路径配置文件 + +## 结果说明 + { + "handler": "cmdchecker", ——子工具名 + "result": [ ——结果集合 + { + "name": "ar", ——检查命令 + "exist_check": { ——命令存在性检查 + "result": "pass" ——检查结果 + }, + "run_check": { ——命令运行检查 + "result": "pass" ——检查结果 + }, + "cmd_version": "2.34", ——命令版本 + "result": "pass" ——综合测试结果 + }, + …… + ] + } \ No newline at end of file diff --git "a/Docs/FsChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" "b/Docs/FsChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" new file mode 100644 index 0000000000000000000000000000000000000000..79ae4d5ef2baa7788efd7d74b0c846e126a423cb --- /dev/null +++ "b/Docs/FsChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" @@ -0,0 +1,36 @@ +# FsChecker +fschecker 是一款检查操作系统文件系统是否符合标准的快捷工具 +## 环境要求 +python 3.7+ + +## 使用方法 +1. 进入OSChecker主目录 +cd OSChecker +2. 使用python3执行fschecker检查工具 +python3 FsChecker/fs_checker.py +3. 常用参数 +usage: fs_checker.py [-h] [-V] [-L fs_list.json] + + + 操作系统标准工具SIG FsChecker + optional arguments: + -h, --help show this help message and exit + -V, --version show program's version number and exit + -L fs_list.json, --list fs_list.json + fs_list的json文件 + +## 结果说明 + { + "handler": "fs_checker", ——子工具名 + "result": [ ——结果集合 + { + "FS_name": "/", ——检查目录或文件名 + "exist_check": { ——存在性检查 + "result": "pass" ——检查结果 + }, + "file_permissions": "0775", ——目录或文件权限 + "result": "pass" ——综合检查结果 + }, + …… + ] + } \ No newline at end of file diff --git "a/Docs/LibChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" "b/Docs/LibChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" new file mode 100644 index 0000000000000000000000000000000000000000..414a4881c2451f9b6e2fa994d217a4771cfe29b7 --- /dev/null +++ "b/Docs/LibChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" @@ -0,0 +1,11 @@ +# CmdChecker + +libchecker 是一款检查操作系统当前环境多包含的动态库是否符合标准的快捷工具 +## 环境要求 +python 3.7+ + +## 使用方法 +1. 进入OSAPIChecker主目录 +cd OSAPIChecker +2. 使用python3执行libchecker检查工具 +python3 LibChecker/lib_checker.py diff --git "a/Docs/OSAPIChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" "b/Docs/OSAPIChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" new file mode 100644 index 0000000000000000000000000000000000000000..941f7e96679f4beea6bd18d3e4fbc9a3ebca25ce --- /dev/null +++ "b/Docs/OSAPIChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" @@ -0,0 +1,63 @@ +# OSAPIChecker(主程序) + +OSAPIChecker是测试工具的主程序,将各个子模块进行汇总处理。 + +## 环境要求 +python 3.7+ +golang 1.13+ +python3-reportlab + +## 使用方法 +1. 进入OSChecker主目录 +./OSAPIChecker.py + +2. 常用参数 +usage: OSChecker [-h] [-c CHANNEL] [-s STRATEGY] [-l LEVEL] [-t OSTYPE] [-p PKGMNGR] [-o ORGANIZE] [-R] + +optional arguments: + -h, --help show this help message and exit + -c CHANNEL, --channel CHANNEL + Choice OSAPIChecker channels: + libchecker,cmdchecker,fschecker,servicechecker,all + -s STRATEGY, --strategy STRATEGY + Choice OSAPIChecker strategy: basic,expansion,with- + expand + -l LEVEL, --level LEVEL + Choice OSAPIChecker level like: l1,l2,l3,l1l2,l1l2l3 + -t OSTYPE, --ostype OSTYPE + OSType of current OS: desktop, server + -p PKGMNGR, --pkgmngr PKGMNGR + Package Manager of current OS: apt-deb, yum-rpm + -o ORGANIZE, --organize ORGANIZE + Choice Organize + -R, --reports Generate Reports + +参数解析: +-h, --help: + 显示帮助信息 +-c CHANNEL, --channel CHANNEL: + 选择要测试子模块(libchecker,cmdchecker,fschecker,servicechecker) + 默认是all--全部测试 +-s STRATEGY, --strategy STRATEGY: + 选择libchecker测试的库的类型(basic、expansion、with-expand) + 其中,with-expand是(basic+expansion) + 默认是basic +-l LEVEL, --level LEVEL: + 选择libchecker测试的级别(l1、l2、l3或者是三者组合) + 默认是l1l2 +-t OSTYPE, --ostype OSTYPE: + 选择libchecker测试的OS类型(desktop、server) + 默认是desktop +-p PKGMNGR, --pkgmngr PKGMNGR: + 选择libchecker测试的软件包类别(apt-deb、yum-rpm) + 默认是apt-deb +-o ORGANIZE, --organize ORGANIZE + 送测单位名称 + 默认是空 +-R, --reports + 生成报告(默认不生成报告) + + +3. 注意 +1) 在进行测试时,请根据需要填写必要的参数信息 +2) 当前除libchecker外,其他子模块使用的默认配置,当前主程序不做单独配置处理(部分工具存在参数冲突), 若有需要, 请单独运行子模块程序 diff --git a/FsChecker/__init__.py b/FsChecker/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..b4fc49e449c81392123110ede4bc9a818db477b8 --- /dev/null +++ b/FsChecker/__init__.py @@ -0,0 +1,6 @@ +# coding=utf-8 +""" +@Project : OSChecker +@Time : 2022/7/27 15:17 +@Author : wangbin +""" diff --git a/FsChecker/fs_checker.py b/FsChecker/fs_checker.py new file mode 100644 index 0000000000000000000000000000000000000000..3c883bfce1883172fb9ccface95805cf6a9f9f75 --- /dev/null +++ b/FsChecker/fs_checker.py @@ -0,0 +1,174 @@ +# coding=utf-8 +""" +@Project : OSChecker +@Time : 2022/7/27 15:22 +@Author : wangbin +""" +import argparse +import sys +import os +import json +import logging +import time + + +def log_handler(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + + ch = logging.StreamHandler() + formatter = logging.Formatter('[%(asctime)s][FsChecker][%(levelname)s][%(message)s]') + ch.setFormatter(formatter) + logger.addHandler(ch) + + log_file_path = 'FsChecker/logs/log_fs_checker.txt' + fh = logging.FileHandler(log_file_path) + formatter = logging.Formatter('[%(asctime)s][FsChecker][%(filename)s:%(lineno)d]:[%(levelname)s][%(message)s]') + fh.setFormatter(formatter) + logger.addHandler(fh) + return logger + + +logger = log_handler() + + +class Standard: + """ + 描述标准的类 + """ + def __init__(self, cmd_json): + with open(cmd_json, 'r', encoding='utf-8') as f: + self.cmd_list = json.load(f).get('FS') + + def get_list(self): + """ + 返回标准文件内的fs列表 + :return: list + """ + return self.cmd_list + + +class Result: + """ + 结果类 + """ + def __init__(self): + self.result = [] + + def add(self, stand, exist_result, file_permissions): + self.result.append({ + 'FS_name': stand.get('FS_name'), + 'exist_check': exist_result, + 'file_permissions': file_permissions, + 'result': exist_result.get('result') + }) + + def stat(self): + total = 0 + pass_count = 0 + for res in self.result: + total += 1 + pass_count += 1 if res.get('result') == 'pass' else 0 + data = { + 'total': total, + 'pass': pass_count, + 'fail': total - pass_count + } + # logger.info(data) + return data + + def export(self, timestamp=None, path=None): + # pprint.pprint(self.result) + data = { + 'handler': 'fs_checker', + 'result': self.result + } + path = path or 'Outputs' + if not timestamp: + result_file = path + '/fs_' + time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + '.json' + else: + result_file = path + '/fs_' + timestamp + '.json' + with open(result_file, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=1) + logger.info(f'FSChecker 测试完成,测试结果见 {path}') + return path + + +class FSChecker: + """ + fs的checker 类. + """ + def __init__(self, cmd_json_path=None): + logger.info('FSChecker 执行开始。。。') + fs_json = cmd_json_path or os.path.abspath('Jsons/fs_list.json') + self.standard = Standard(fs_json).get_list() + self.result = Result() + + @staticmethod + def _get_file_permissions(file): + if os.path.exists(file): + return oct(os.lstat(file).st_mode)[-4:] + else: + return "not found" + + def check(self): + """ + fs的测试方法,遍历标准中的fs进行存在性检测 + :return: + """ + # tmp = [] + for stand in self.standard: + logger.info(f'fs checking...{stand}...') + exist_result = { + 'result': 'pass' if os.path.isdir(stand.get('FS_name')) else 'fail' + } + file_permissions = self._get_file_permissions(stand.get('FS_name')) + self.result.add(stand=stand, exist_result=exist_result, file_permissions=file_permissions) + logger.info(f"\ncmd: {stand.get('FS_name')},\n" + f"exist_check: {exist_result}\n" + f"file_permissions: {file_permissions}\n") + + # fs权限暂时不做处理 + # permission = oct(os.stat(stand.get('FS_name')).st_mode)[-4:] + # tmp.append({ + # "FS_name": stand.get('FS_name'), + # "type": 'directory', + # 'permission': str(permission) + # }) + # path = 'FsChecker/report/fs_result_tmp.json' + # with open(path, 'w', encoding='utf-8') as f: + # json.dump({'result': tmp}, f) + + def export(self, timestamp): + """ + 输出文件报告 + :return: + """ + return self.result.export(timestamp) + + def stat(self): + """ + 对检查结果进行统计 + :return: + """ + data = self.result.stat() + logger.info(f'FSChecker 测试结果:{data}') + return data + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="操作系统标准工具SIG FsChecker") + parser.add_argument('-V', '--version', action='version', version='version 1.0 操作系统标准工具SIG FS Checker') + parser.add_argument('-L', '--list', default=None, metavar='fs_list.json', help='fs_list的json文件') + parser.add_argument('-T', '--timestamp', default=None, action='store', type=str) + args = parser.parse_args() + if args.list and not os.path.isfile(args.list): + print('fs_list.json 文件不正确 !!!') + sys.exit(1) + + # main(args.list, args.path) + checker = FSChecker() + checker.check() + checker.export(args.timestamp) + checker.stat() + diff --git a/FsChecker/logs/.file b/FsChecker/logs/.file new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/FsChecker/logs/log_fs_checker.txt b/FsChecker/logs/log_fs_checker.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/GenReport/NotoSansSCRegular.ttf b/GenReport/NotoSansSCRegular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6599a2be043a5573a9048b1b9ccda1c868ad409d Binary files /dev/null and b/GenReport/NotoSansSCRegular.ttf differ diff --git a/GenReport/README.md b/GenReport/README.md new file mode 100644 index 0000000000000000000000000000000000000000..906c9de55c9ad23373f2ee756d0dd670c1abdb12 --- /dev/null +++ b/GenReport/README.md @@ -0,0 +1,28 @@ +# OSAPIChecker + +#### 介绍 +json结果转pdf工具 + +#### 依赖安装 + +1. pip3 install reportlab==3.6.12 + +#### 使用说明 +1. 基本用法,直接执行使用默认路径生成pdf + ```shell + cd Pdf + ./pdf.py + ``` + +2. 使用参数指定文件路径 + - -r : 指定pdf生成结果路径 + - -e : 指定环境检测结果路径 + - -l : 指定运行库检查结果文件路径 + - -f : 指定文件系统层次结构检查结果文件路径 + - -c : 指定常用命令检查结果文件路径 + - -s : 指定服务检查结果文件路径 + + ```shell + cd Pdf + ./pdf.py -r ./result.pdf -l ../Outputs/libchecker-output.json -f ../Outputs/fs.json -c ../Outputs/cmd.json -s ../Outputs/service_result.json + ``` diff --git a/GenReport/pdf.py b/GenReport/pdf.py new file mode 100755 index 0000000000000000000000000000000000000000..5cecf48be7539731ffa4c6ebdddec169902f06b3 --- /dev/null +++ b/GenReport/pdf.py @@ -0,0 +1,726 @@ +#!/usr/bin/python3 + +from pdfmaker import PdfMaker +from reportlab.platypus import PageBreak +from reportlab.lib import colors # 颜色模块 +from reportlab.platypus import Spacer +from reportlab.lib.styles import getSampleStyleSheet # 样式 +from reportlab.platypus import Paragraph +import json +import argparse +import os + +total_width = 700 +table_background_color = '#d5dae6' + +g_env = "../Outputs/environments-info.json" +g_lib = "../Outputs/libchecker-output.json" +g_fs = "../Outputs/fs.json" +g_cmd = "../Outputs/cmd.json" +g_server = "../Outputs/service_result.json" +g_result = "./操作系统应用编程接口要求标准符合性测试报告.pdf" +g_isConform = "符合" + +# 表格样式 +# table_background_color = '#87CEEB' +default_table_style = [ + ['ALIGN', (0, 0), (-1, -1), 'CENTER'], # 水平居中 + ['VALIGN', (0, 0), (-1, -1), 'MIDDLE'], # 垂直居中对齐 + # ['ALIGN', (0, 1), (-1, -1), 'CENTER'], # 第二行到最后一行左右左对齐 + ['VALIGN', (0, 0), (-1, -1), 'MIDDLE'], # 所有表格上下居中对齐 + ['GRID', (0, 0), (-1, -1), 0.5, colors.black], # 设置表格框线为grey色,线宽为0.5 +] +default_para_style = getSampleStyleSheet()['Normal'] +default_para_style.fontName = 'SimSun' +default_para_style.wordWrap = 'CJK' # 设置自动换行 +default_para_style.fontSize = 10 +default_para_style.textColor = colors.darkslategray # 设置表格内文字颜色 +default_para_style.alignment = 1 # 居中对齐 + +# 首页样式 +home_table_style = [ + ['ALIGN', (0, 0), (-1, -1), 'CENTER'], # 第一行水平居中 + ['VALIGN', (0, 0), (-1, -1), 'MIDDLE'], # 所有表格上下居中对齐 + ['ALIGN', (0, 0), (0, -1), 'RIGHT'], + ['ALIGN', (1, 0), (1, -1), 'CENTER'], +] +home_para_style = getSampleStyleSheet()['Normal'] +home_para_style.fontName = 'SimSun' +home_para_style.fontSize = 20 +home_para_style.wordWrap = 'CJK' # 设置自动换行 +home_para_style.alignment = 1 # 居中对齐 + + +def make_pdf_cover(content): + # 添加标题 + content.append(Spacer(1, 30)) + content.append(PdfMaker.draw_title('《操作系统应用编程接口要求》\n标准符合性测试报告', 30)) + + # 添加日期等内容 + content.append(Spacer(1, 50)) + + if not os.path.exists(g_env): + print("未发现测试环境结果文件") + content.append( + PdfMaker.draw_little_title( + '未发现测试环境结果文件', 12, colors.red)) + return + + with open(g_env, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + data = [ + ['产品名称:', json_data["测试对象"]["系统名称"]], + ['产品版本:', json_data["测试对象"]["版本"]], + ['测试日期:', json_data["测试时间"]] + ] + + for i, row in enumerate(data): + for j, cell in enumerate(row): + data[i][j] = Paragraph(str(cell), home_para_style) + + content.append( + PdfMaker.draw_table( + home_table_style, + data, + totalWidth=550, + rates=[2, 7],)) + + # 添加检测机构 + content.append(Spacer(1, 100)) + + unit = json_data["送测单位"] + content.append(PdfMaker.draw_title(unit, 20)) + + +def make_pdf_test_env(content): + # 添加小标题 + content.append(PdfMaker.draw_little_title('一、测试环境')) + + if not os.path.exists(g_env): + print("未发现测试环境结果文件") + content.append( + PdfMaker.draw_little_title( + '未发现测试环境结果文件', 12, colors.red)) + return + + data = [] + with open(g_env, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + data = [ + ['测试对象', '系统名称', json_data["测试对象"]["系统名称"]], + ['测试对象', '版本', json_data["测试对象"]["版本"]], + ['送测单位', '送测单位', json_data["送测单位"]], + ['系统环境', '内核版本', json_data["系统环境"]["内核版本"]], + ['系统环境', '编译器版本', json_data["系统环境"]["编译器版本"]], + ['系统环境', 'Python版本', json_data["系统环境"]["Python版本"]], + ['环境配置', '机器型号', json_data["环境配置"]["CPU型号"]], + ['环境配置', 'CPU指令集', json_data["环境配置"]["CPU指令集"]], + ['环境配置', 'CPU型号', json_data["环境配置"]["CPU型号"]], + ['环境配置', '内存', json_data["环境配置"]["内存"]], + ['环境配置', '硬盘', json_data["环境配置"]["硬盘"]], + ['环境配置', '固件', json_data["环境配置"]["固件"]], + ['测试工具', '名称', json_data["测试工具"]["名称"]], + ['测试工具', '版本', json_data["测试工具"]["版本"]], + ['测试时间', '测试时间', json_data["测试时间"]], + ] + + for i, row in enumerate(data): + for j, cell in enumerate(row): + data[i][j] = Paragraph(str(cell), default_para_style) + + extra_style = default_table_style + [ + ['SPAN', (0, 0), (0, 1)], + ['SPAN', (0, 2), (1, 2)], + ['SPAN', (0, 3), (0, 5)], + ['SPAN', (0, 6), (0, 11)], + ['SPAN', (0, 12), (0, 13)], + ] + + content.append( + PdfMaker.draw_table( + extra_style, + data, + totalWidth=total_width, + rowHeight=27, + rates=[1, 1, 3])) + + +def make_pdf_lib(content): + content.append(Spacer(1, 10)) + # 1.运行库 + content.append(PdfMaker.draw_little_title('1.运行库', 15)) + content.append(Spacer(1, 10)) + + if not os.path.exists(g_lib): + print("未发现运行库检查结果文件") + content.append( + PdfMaker.draw_little_title( + '未发现运行库检查结果文件', 12, colors.red)) + return + + # (1)库包检查 + content.append(PdfMaker.draw_little_title('(1)库包检查', 12)) + # 添加表格 + data = [ + ['包名', '检测信息', '--', '--', '--'], + ['包名', '检测信息', '--', '--', '--'], + ] + + with open(g_lib, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + row = 2 + for r in json_data: + + require_version = json_data[r]["Required version"] + level = json_data[r]["Level"] + data.append([r, '版本要求', '级别', '--', '--']) + data.append([r, require_version, level, '--', '--']) + data.append([r, '二进制包名', '当前版本', '--', '测试结果']) + + # local_version = "-" + # status = "" + for pack in json_data[r]["Binary package"]: + if isinstance(json_data[r]["Binary package"][pack], dict): + for lib in json_data[r]["Binary package"][pack]: + local_version = json_data[r]["Binary package"][pack][lib]["version"] + status = json_data[r]["Binary package"][pack][lib]["status"] + + if status == "compatible": + status = "通过" + elif status == "not installed": + continue + else: + status = "不通过" + data.append([r, lib, local_version, '--', status]) + + data.append([r, '共享对象名', '存储路径', '归属包名', '测试结果']) + if isinstance(json_data[r]["Shared library"], dict): + for shared in json_data[r]["Shared library"]: + result = json_data[r]["Shared library"][shared]["status"] + if result == "compatible": + result = "通过" + else: + result = "不通过" + + belongs = "-" + + if json_data[r]["Shared library"][shared]["belongs"] != "None": + belongs = json_data[r]["Shared library"][shared]["belongs"] + path = json_data[r]["Shared library"][shared]["path"] + if len(path) > 65: + path_list = list(path) + path_list.insert(60, '\n') + path = ''.join(path_list) + data.append([r, shared, path, belongs, result]) + + lib_table_style = default_table_style + [ + ['BACKGROUND', (0, 0), (-1, 0), table_background_color], # 设置第一行背景颜色 + ['BACKGROUND', (0, 1), (-1, 1), table_background_color], # 设置第二行背景颜色 + ['SPAN', (0, 0), (0, 1)], # 合并第一列一二行 + ['SPAN', (1, 0), (-1, 1)], # 合并第四列一二行 + ] + + is_merge = False + + for i, r in enumerate(data): + if data[i][1] == "版本要求": + lib_table_style.append( + ['BACKGROUND', (1, i), (-1, i), table_background_color]) + lib_table_style.append(['SPAN', (2, i), (-1, i)]) + lib_table_style.append(['SPAN', (2, i + 1), (-1, i + 1)]) + if data[i][1] == "二进制包名": + lib_table_style.append( + ['BACKGROUND', (1, i), (-1, i), table_background_color]) + is_merge = True + + if data[i][1] == "共享对象名": + lib_table_style.append( + ['BACKGROUND', (1, i), (-1, i), table_background_color]) + is_merge = False + + if is_merge: + lib_table_style.append(['SPAN', (2, i), (3, i)]) + + if data[i][-1] == "不通过": + c = default_para_style.textColor + default_para_style.textColor = colors.red + data[i][-1] = Paragraph(str(data[i][-1]), + default_para_style) + default_para_style.textColor = c + + for j, cell in enumerate(r): + if not isinstance(data[i][j], Paragraph): + s = default_para_style.fontSize + if i == 0: + default_para_style.fontSize = 12 + data[i][j] = Paragraph(str(cell), default_para_style) + default_para_style.fontSize = s + + content.append( + PdfMaker.draw_mul_table( + lib_table_style, + data, + totalWidth=total_width, + rates=[2, 3, 7, 2, 1.2])) + content.append(PageBreak()) + + # (2)小计 + content.append(PdfMaker.draw_little_title('(2)小计', 12)) + + with open(g_lib, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + result_map = {} + for r in json_data: + level = json_data[r]["Level"] + + if level not in result_map: + level_map = {} + level_map["pack_require_num"] = 0 + level_map["pack_no_pass_num"] = 0 + level_map["shard_require_num"] = 0 + level_map["shard_pass_num"] = 0 + result_map[level] = level_map + + result_map[level]["pack_require_num"] += 1 + status = "" + + for pack in json_data[r]["Binary package"]: + if isinstance(json_data[r]["Binary package"][pack], dict): + pack_passed = True + for lib in json_data[r]["Binary package"][pack]: + status = json_data[r]["Binary package"][pack][lib]["status"] + if status == "incompatible": + pack_passed = False + if not pack_passed: + result_map[level]["pack_no_pass_num"] += 1 + + if isinstance(json_data[r]["Shared library"], dict): + for lib in json_data[r]["Shared library"]: + if json_data[r]["Shared library"][lib]["status"] == "compatible": + result_map[level]["shard_pass_num"] += 1 + result_map[level]["shard_require_num"] += 1 + + # 添加表格 + data = [ + ['级别', '类型', '要求数量', '符合数量', '比率'], + ] + i = 1 + result_style = default_table_style + [ + ['BACKGROUND', (0, 0), (-1, 0), table_background_color], # 设置第一行背景颜色 + ] + for level in result_map: + pack_pass_num = result_map[level]["pack_require_num"] - \ + result_map[level]["pack_no_pass_num"] + if result_map[level]["pack_require_num"] != 0: + + pack_rate = '{:.2f}%'.format( + pack_pass_num / result_map[level]["pack_require_num"] * 100) + else: + pack_rate = 0 + + # print(result_map[level]["shard_require_num"]) + if result_map[level]["shard_require_num"] != 0: + shard_rate = '{:.2f}%'.format( + result_map[level]["shard_pass_num"] / + result_map[level]["shard_require_num"] * + 100) + else: + shard_rate = 0 + + table_content = [ + level, + "包", + result_map[level]["pack_require_num"], + pack_pass_num, + pack_rate] + data.append(table_content) + + table_content = [ + level, + "共享对象", + result_map[level]["shard_require_num"], + result_map[level]["shard_pass_num"], + shard_rate] + data.append(table_content) + + result_style = result_style + [ + ('SPAN', (0, i), (0, i + 1)), # 合并第一列一二行 + ] + + if level == 'L1' or level == 'L2': + + if pack_rate != "100.00%" or shard_rate != "100.00%": + global g_isConform + g_isConform = "不符合" + + i += 2 + + for i, row in enumerate(data): + for j, cell in enumerate(row): + s = default_para_style.fontSize + if i == 0: + default_para_style.fontSize = 12 + data[i][j] = Paragraph(str(cell), default_para_style) + default_para_style.fontSize = s + + content.append( + PdfMaker.draw_table( + result_style, + data, + totalWidth=total_width, + rates=[1, 1, 1, 1, 1] + )) + + +def make_pdf_fs(content): + content.append(Spacer(1, 10)) + # 2.文件系统层次结构 + content.append(PdfMaker.draw_little_title('2.文件系统层次结构', 15)) + content.append(Spacer(1, 10)) + if not os.path.exists(g_fs): + print("未发现文件系统层次结构检查结果文件") + content.append( + PdfMaker.draw_little_title( + '未发现文件系统层次结构检查结果文件', + 12, + colors.red)) + return + + # (1)文件系统层次结构检查 + content.append(PdfMaker.draw_little_title('(1)文件系统层次结构检查', 12)) + # 添加表格 + data = [ + ['目录', '检查项', '', '测试结果'], + ['', '存在', '权限', ''], + ] + + require_num = 0 + pass_num = 0 + + fs_table_style = default_table_style + [ + ['BACKGROUND', (0, 0), (-1, 0), table_background_color], # 设置第一行背景颜色 + ['BACKGROUND', (0, 1), (-1, 1), table_background_color], # 设置第二行背景颜色 + ['SPAN', (0, 0), (0, 1)], # 合并第一列一二行 + ['SPAN', (1, 0), (2, 0)], # 合并第一行二三列 + ['SPAN', (3, 0), (3, 1)], # 合并第四列一二行 + ] + + with open(g_fs, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + json_result = json_data["result"] + + i = 2 + for r in json_result: + if r["exist_check"]["result"] == "pass": + exist = "通过" + else: + exist = "不通过" + + if r["result"] == "pass": + result = "符合" + pass_num += 1 + else: + result = "不符合" + + table_content = [ + r["FS_name"], + exist, + r["file_permissions"], + result] + data.append(table_content) + + i += 1 + require_num += 1 + + for i, row in enumerate(data): + for j, cell in enumerate(row): + s = default_para_style.fontSize + c = default_para_style.textColor + if i == 0: + default_para_style.fontSize = 12 + if j == len(row) - 1 and cell == "不符合": + default_para_style.textColor = colors.red + data[i][j] = Paragraph(str(cell), default_para_style) + default_para_style.fontSize = s + default_para_style.textColor = c + + content.append( + PdfMaker.draw_table( + fs_table_style, + data, + totalWidth=total_width, + rates=[1, 2, 2, 1])) + content.append(Spacer(1, 10)) + + # (2)小计 + content.append(PdfMaker.draw_little_title('(2)小计', 12)) + # 添加表格 + rate = '{:.2f}%'.format(pass_num / require_num * 100) + data = [ + ['要求数量', '符合数量', '比率'], + [require_num, pass_num, rate] + ] + result_table_style = default_table_style + [ + ['BACKGROUND', (0, 0), (-1, 0), table_background_color], # 设置第一行背景颜色 + ] + for i, row in enumerate(data): + for j, cell in enumerate(row): + s = default_para_style.fontSize + if i == 0: + default_para_style.fontSize = 12 + data[i][j] = Paragraph(str(cell), default_para_style) + default_para_style.fontSize = s + + content.append( + PdfMaker.draw_table( + result_table_style, + data, + totalWidth=total_width, + rates=[1, 1, 1])) + + +def make_pdf_cmd(content): + content.append(Spacer(1, 10)) + # 3.常用命令 + content.append(PdfMaker.draw_little_title('3.常用命令', 15)) + content.append(Spacer(1, 10)) + + if not os.path.exists(g_cmd): + print("未发现常用命令检查结果文件") + content.append( + PdfMaker.draw_little_title( + '未发现常用命令检查结果文件', 12, colors.red)) + return + + # (1)常用命令检查 + content.append(PdfMaker.draw_little_title('(1)常用命令检查', 12)) + # 添加表格 + data = [ + ['命令', '检查项', '', '', '测试结果'], + ['', '路径', '版本', '运行', ''], + ] + + require_num = 0 + pass_num = 0 + + cmd_table_style = default_table_style + [ + ['BACKGROUND', (0, 0), (-1, 0), table_background_color], # 设置第一行背景颜色 + ['BACKGROUND', (0, 1), (-1, 1), table_background_color], # 设置第二行背景颜色 + ['SPAN', (0, 0), (0, 1)], # 合并第一列一二行 + ['SPAN', (1, 0), (3, 0)], # 合并第一行二三四列 + ['SPAN', (4, 0), (4, 1)], # 合并第五列一二行 + ] + + with open(g_cmd, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + json_result = json_data["result"] + i = 2 + for r in json_result: + if r["exist_check"]["result"] == "pass": + exist = "通过" + else: + exist = "不通过" + if r["run_check"]["result"] == "pass": + check = "通过" + else: + check = "不通过" + + if r["result"] == "pass": + result = "符合" + pass_num += 1 + else: + result = "不符合" + + table_content = [r["name"], "-", r["cmd_version"], check, result] + data.append(table_content) + + i += 1 + require_num += 1 + + for i, row in enumerate(data): + for j, cell in enumerate(row): + s = default_para_style.fontSize + c = default_para_style.textColor + if i == 0: + default_para_style.fontSize = 12 + if j == len(row) - 1 and cell == "不符合": + default_para_style.textColor = colors.red + data[i][j] = Paragraph(str(cell), default_para_style) + default_para_style.fontSize = s + default_para_style.textColor = c + + content.append( + PdfMaker.draw_table( + cmd_table_style, + data, + totalWidth=total_width, + rates=[1, 4, 2, 2, 2])) + + # (2)小计 + content.append(PdfMaker.draw_little_title('(2)小计', 12)) + # 添加表格 + rate = '{:.2f}%'.format(pass_num / require_num * 100) + data = [ + ['要求数量', '符合数量', '比率'], + [require_num, pass_num, rate] + ] + result_table_style = default_table_style + [ + ['BACKGROUND', (0, 0), (-1, 0), table_background_color], # 设置第一行背景颜色 + ] + for i, row in enumerate(data): + for j, cell in enumerate(row): + s = default_para_style.fontSize + if i == 0: + default_para_style.fontSize = 12 + if j == len(row) - 1 and cell == "不符合": + default_para_style.textColor = colors.red + data[i][j] = Paragraph(str(cell), default_para_style) + default_para_style.fontSize = s + + content.append( + PdfMaker.draw_table( + result_table_style, + data, + totalWidth=total_width, + rates=[1, 1, 1])) + + +def make_pdf_service(content): + # 4.服务检查 + content.append(Spacer(1, 10)) + content.append(PdfMaker.draw_little_title('4.服务检查', 15)) + content.append(Spacer(1, 10)) + + if not os.path.exists(g_server): + print("未发现服务检查结果文件") + content.append( + PdfMaker.draw_little_title( + '未发现服务检查结果文件', 12, colors.red)) + return + + # (1)常用命令检查 + content.append(PdfMaker.draw_little_title('(1)常用服务检查', 12)) + # 添加表格 + data = [ + ['服务', '测试结果'], + ] + + service_style = default_table_style + [ + ['BACKGROUND', (0, 0), (-1, 0), table_background_color], # 设置第一行背景颜色 + ] + + with open(g_server, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + i = 1 + for r in json_data: + result = json_data[r]["Check result"] + if result == "pass": + result = "通过" + else: + result = "不通过" + service_style.append( + ['TEXTCOLOR', (0, i), (-1, i), colors.red]) + table_content = [r, result] + data.append(table_content) + i += 1 + + for i, row in enumerate(data): + for j, cell in enumerate(row): + s = default_para_style.fontSize + c = default_para_style.textColor + if i == 0: + default_para_style.fontSize = 12 + if j == len(row) - 1 and cell == "不符合": + default_para_style.textColor = colors.red + data[i][j] = Paragraph(str(cell), default_para_style) + default_para_style.fontSize = s + default_para_style.textColor = c + + content.append( + PdfMaker.draw_table( + service_style, + data, + totalWidth=total_width, + rates=[1, 1])) + + +def make_pdf_result(content): + # 添加小标题 + content.append(PdfMaker.draw_little_title('二、测试结果')) + make_pdf_lib(content) + content.append(PageBreak()) + make_pdf_fs(content) + content.append(PageBreak()) + make_pdf_cmd(content) + content.append(PageBreak()) + make_pdf_service(content) + + +def make_pdf_conclusion(content): + # 添加小标题 + content.append(PdfMaker.draw_little_title('三、测试结论')) + + if not os.path.exists(g_env): + content.append( + PdfMaker.draw_little_title( + '未发现测试环境结果文件', 12, colors.red)) + return + + with open(g_env, 'r', encoding='utf8') as fp: + json_data = json.load(fp) + print(g_isConform) + text = '经测试,{}送测的{}-{}({}){}《操作系统应用编程接口要求》。'.format( + json_data["送测单位"], + json_data["测试对象"]["系统名称"], + json_data["测试对象"]["版本"], + json_data["环境配置"]["CPU指令集"][0], + g_isConform) + content.append(PdfMaker.draw_text(text, 12)) + + +def make_api_pdf(pdfName): + # 创建内容对应的空列表 + content = list() + + make_pdf_cover(content) + content.append(PageBreak()) + make_pdf_test_env(content) + content.append(PageBreak()) + make_pdf_result(content) + content.append(PageBreak()) + make_pdf_conclusion(content) + + PdfMaker.create_pdf(pdfName, content) + print("pdf生成完成, 路径: {}".format(os.path.abspath(g_result))) + + +if __name__ == '__main__': + + parser = argparse.ArgumentParser() + parser.add_argument('-r', '--result', type=str) + parser.add_argument('-e', '--env', type=str) + parser.add_argument('-l', '--lib', type=str) + parser.add_argument('-f', '--fs', type=str) + parser.add_argument('-c', '--cmd', type=str) + parser.add_argument('-s', '--server', type=str) + args = parser.parse_args() + + if args.result is not None: + g_result = args.result + + if args.env is not None: + g_env = args.env + + if args.lib is not None: + g_lib = args.lib + + if args.fs is not None: + g_fs = args.fs + + if args.cmd is not None: + g_cmd = args.cmd + + if args.server is not None: + g_server = args.server + + make_api_pdf(g_result) diff --git a/GenReport/pdfmaker.py b/GenReport/pdfmaker.py new file mode 100644 index 0000000000000000000000000000000000000000..74ecde6d77f01e3906a3295c12c769befcce5186 --- /dev/null +++ b/GenReport/pdfmaker.py @@ -0,0 +1,192 @@ +#!/usr/bin/python3 + +import os +from reportlab.pdfbase import pdfmetrics # 注册字体 +from reportlab.pdfbase.ttfonts import TTFont # 字体类 +from reportlab.platypus import Table, LongTable, SimpleDocTemplate, Paragraph, Image # 报告内容相关类 +# 页面的标志尺寸(8.5*inch, 11*inch) +from reportlab.lib.pagesizes import letter, landscape +from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle # 文本样式 +from reportlab.lib.enums import TA_CENTER, TA_LEFT +from reportlab.lib import colors # 颜色模块 +from reportlab.graphics.charts.barcharts import VerticalBarChart # 图表类 +from reportlab.graphics.charts.legends import Legend # 图例类 +from reportlab.graphics.shapes import Drawing # 绘图工具 +from reportlab.lib.units import cm # 单位:cm + +# 注册字体(提前准备好字体文件, 如果同一个文件需要多种字体可以注册多个) +fonts = [ + ["SimSun", "./NotoSansSCRegular.ttf"], +] +for f in fonts: + font_path = os.path.join(os.path.dirname(__file__), f[1]) + pdfmetrics.registerFont(TTFont(f[0], font_path)) + + +class Custom_tab(Table): + # hack的table类,用于多页的单元格合并,当前仅在reportlab=3.6.12下测试 + @staticmethod + def _getRowImpossible(impossible, cells, ranges): + impossible = {} + + +class PdfMaker: + # 绘制标题 + content_style = ParagraphStyle( + name="ContentStyle", + fontName="ping", + fontSize=18, + leading=25, + spaceAfter=20, + underlineWidth=1, + alignment=TA_LEFT, + ) + + @staticmethod + def draw_title(title, size=20): + # 获取所有样式表 + style = getSampleStyleSheet() + # 拿到标题样式 + ct = style['Normal'] + # 单独设置样式相关属性 + ct.fontName = 'SimSun' # 字体名 + ct.fontSize = size # 字体大小 + ct.leading = 50 # 行间距 + ct.textColor = colors.black # 字体颜色 + ct.alignment = 1 # 居中 + ct.bold = True + # 创建标题对应的段落,并且返回 + return Paragraph(title, ct) + + # 绘制小标题 + @staticmethod + def draw_little_title(title, size=20, color=colors.black): + # 获取所有样式表 + style = getSampleStyleSheet() + # 拿到标题样式 + ct = style['Normal'] + # 单独设置样式相关属性 + ct.fontName = 'SimSun' # 字体名 + ct.fontSize = size # 字体大小 + ct.leading = 30 # 行间距 + ct.textColor = color # 字体颜色 + ct.bold = True + # 创建标题对应的段落,并且返回 + return Paragraph(title, ct) + + # 绘制普通段落内容 + @staticmethod + def draw_text(text, size): + # 获取所有样式表 + style = getSampleStyleSheet() + # 获取普通样式 + ct = style['Normal'] + ct.fontName = 'SimSun' + ct.fontSize = size + ct.wordWrap = 'CJK' # 设置自动换行 + ct.alignment = 0 # 左对齐 + ct.firstLineIndent = 32 # 第一行开头空格 + ct.leading = 25 + return Paragraph(text, ct) + + # 绘制表格 + @staticmethod + def draw_table(style, tab_dict, totalWidth, rates, rowHeight=30): + total_rate = 0 + for rate in rates: + total_rate += rate + + col_rate = [] + for rate in rates: + col_rate.append((rate / total_rate) * totalWidth) + table = LongTable( + tab_dict, + colWidths=col_rate, + style=style, + rowHeights=rowHeight) + return table + + # 跨页合并需求 + @staticmethod + def draw_mul_table(style, tab_dict, totalWidth, rates): + total_rate = 0 + for rate in rates: + total_rate += rate + + col_rate = [] + for rate in rates: + col_rate.append((rate / total_rate) * totalWidth) + + i = 0 + begin = 0 + end = 0 + while i < len(tab_dict) - 1: + if tab_dict[i + + 1][0].getPlainText() == tab_dict[i][0].getPlainText(): + if i + 1 == len(tab_dict) - 1: + end = len(tab_dict) - 1 + style = style + [ + ('SPAN', (0, begin), (0, end)) + ] + else: + end = i + style = style + [ + ('SPAN', (0, begin), (0, end)) + ] + + begin = end + 1 + i += 1 + + table = Custom_tab( + tab_dict, + colWidths=col_rate, + style=style) + + return table + + # 创建图表 + @staticmethod + def draw_bar(bar_data: list, ax: list, items: list): + drawing = Drawing(500, 250) + bc = VerticalBarChart() + bc.x = 45 # 整个图表的x坐标 + bc.y = 45 # 整个图表的y坐标 + bc.height = 200 # 图表的高度 + bc.width = 350 # 图表的宽度 + bc.data = bar_data + bc.strokeColor = colors.black # 顶部和右边轴线的颜色 + bc.valueAxis.valueMin = 5000 # 设置y坐标的最小值 + bc.valueAxis.valueMax = 26000 # 设置y坐标的最大值 + bc.valueAxis.valueStep = 2000 # 设置y坐标的步长 + bc.categoryAxis.labels.dx = 2 + bc.categoryAxis.labels.dy = -8 + bc.categoryAxis.labels.angle = 20 + bc.categoryAxis.categoryNames = ax + + # 图示 + leg = Legend() + leg.fontName = 'SimSun' + leg.alignment = 'right' + leg.boxAnchor = 'ne' + leg.x = 475 # 图例的x坐标 + leg.y = 240 + leg.dxTextSpace = 10 + leg.columnMaximum = 3 + leg.colorNamePairs = items + drawing.add(leg) + drawing.add(bc) + return drawing + + # 绘制图片 + @staticmethod + def draw_img(path): + img = Image(path) # 读取指定路径下的图片 + img.drawWidth = 5 * cm # 设置图片的宽度 + img.drawHeight = 8 * cm # 设置图片的高度 + return img + + @staticmethod + def create_pdf(filename, content): + # 生成pdf文件 + doc = SimpleDocTemplate(filename, pagesize=landscape(letter)) + doc.build(content) diff --git a/Jsons/cmd_list.json b/Jsons/cmd_list.json new file mode 100755 index 0000000000000000000000000000000000000000..34a551ed4ffe88a0b870b426cd6c4b6ffa21cfba --- /dev/null +++ b/Jsons/cmd_list.json @@ -0,0 +1,323 @@ +{ + "std_name": "信息技术应用创新 操作系统应用编程接口要求", + "system_cmds": [ + { + "name": "ar" + }, + { + "name": "awk" + }, + { + "name": "basename" + }, + { + "name": "batch" + }, + { + "name": "cat" + }, + { + "name": "chattr" + }, + { + "name": "chgrp" + }, + { + "name": "chmod" + }, + { + "name": "chown" + }, + { + "name": "chsh" + }, + { + "name": "cksum" + }, + { + "name": "cmp" + }, + { + "name": "comm" + }, + { + "name": "cp" + }, + { + "name": "cpio" + }, + { + "name": "crontab" + }, + { + "name": "cut" + }, + { + "name": "date" + }, + { + "name": "dd" + }, + { + "name": "df" + }, + { + "name": "diff" + }, + { + "name": "dmesg" + }, + { + "name": "du" + }, + { + "name": "dumpe2fs" + }, + { + "name": "e2fsck" + }, + { + "name": "echo" + }, + { + "name": "egrep" + }, + { + "name": "env" + }, + { + "name": "file" + }, + { + "name": "find" + }, + { + "name": "fgrep" + }, + { + "name": "getconf" + }, + { + "name": "grep" + }, + { + "name": "groupadd" + }, + { + "name": "groupdel" + }, + { + "name": "groupmod" + }, + { + "name": "groups" + }, + { + "name": "gunzip" + }, + { + "name": "gzip" + }, + { + "name": "head" + }, + { + "name": "hostname" + }, + { + "name": "id" + }, + { + "name": "install" + }, + { + "name": "ipcrm" + }, + { + "name": "ipcs" + }, + { + "name": "kill" + }, + { + "name": "killall" + }, + { + "name": "less" + }, + { + "name": "ln" + }, + { + "name": "locale" + }, + { + "name": "localedef" + }, + { + "name": "logger" + }, + { + "name": "logname" + }, + { + "name": "ls" + }, + { + "name": "lsattr" + }, + { + "name": "make" + }, + { + "name": "man" + }, + { + "name": "md5sum" + }, + { + "name": "mkdir" + }, + { + "name": "mke2fs" + }, + { + "name": "mkfifo" + }, + { + "name": "mknod" + }, + { + "name": "more" + }, + { + "name": "mount" + }, + { + "name": "mv" + }, + { + "name": "newgrp" + }, + { + "name": "nice" + }, + { + "name": "nohup" + }, + { + "name": "passwd" + }, + { + "name": "patch" + }, + { + "name": "pidof" + }, + { + "name": "ping" + }, + { + "name": "printf" + }, + { + "name": "ps" + }, + { + "name": "pwd" + }, + { + "name": "renice" + }, + { + "name": "rm" + }, + { + "name": "rmdir" + }, + { + "name": "scp" + }, + { + "name": "sed" + }, + { + "name": "sh" + }, + { + "name": "shutdown" + }, + { + "name": "sleep" + }, + { + "name": "sort" + }, + { + "name": "split" + }, + { + "name": "ssh" + }, + { + "name": "ssh-keygen" + }, + { + "name": "stty" + }, + { + "name": "su" + }, + { + "name": "sync" + }, + { + "name": "tail" + }, + { + "name": "tar" + }, + { + "name": "tee" + }, + { + "name": "time" + }, + { + "name": "touch" + }, + { + "name": "tr" + }, + { + "name": "tsort" + }, + { + "name": "tune2fs" + }, + { + "name": "umount" + }, + { + "name": "uname" + }, + { + "name": "useradd" + }, + { + "name": "userdel" + }, + { + "name": "usermod" + }, + { + "name": "which" + }, + { + "name": "xargs" + }, + { + "name": "[" + } + ] +} \ No newline at end of file diff --git a/Jsons/fs_list.json b/Jsons/fs_list.json new file mode 100755 index 0000000000000000000000000000000000000000..450b1625a746f040bbd520953a0213a9effcfe65 --- /dev/null +++ b/Jsons/fs_list.json @@ -0,0 +1,225 @@ +{ + "std_name": "信息技术应用创新 操作系统应用编程接口要求", + "FS": [ + { + "FS_name": "/", + "type": "directory", + "permission": "0775" + }, + { + "FS_name": "/bin/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/boot/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/dev/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/dev/shm", + "type": "directory", + "permission": "1777" + }, + { + "FS_name": "/etc/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/etc/X11/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/home/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/lib/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/media/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/mnt/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/opt/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/proc/", + "type": "directory", + "permission": "0555" + }, + { + "FS_name": "/proc/sys", + "type": "directory", + "permission": "0555" + }, + { + "FS_name": "/root/", + "type": "directory", + "permission": "0700" + }, + { + "FS_name": "/run", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/run/log", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/sbin/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/srv/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/tmp/", + "type": "directory", + "permission": "1777" + }, + { + "FS_name": "/usr/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/bin/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/include/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/local", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/lib", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/sbin/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/share", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/share/applications/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/share/doc", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/share/fonts/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/share/locale", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/src/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/usr/local/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/var/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/var/cache/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/var/lib/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/var/lock/", + "type": "directory", + "permission": "1777" + }, + { + "FS_name": "/var/log/", + "type": "directory", + "permission": "0775" + }, + { + "FS_name": "/var/mail/", + "type": "directory", + "permission": "2775" + }, + { + "FS_name": "/var/run/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/var/spool/", + "type": "directory", + "permission": "0755" + }, + { + "FS_name": "/var/spool/mail/", + "type": "directory", + "permission": "2775" + }, + { + "FS_name": "/var/tmp/", + "type": "directory", + "permission": "1777" + }, + { + "FS_name": "/var/run", + "type": "directory", + "permission": "0755" + } + ] +} \ No newline at end of file diff --git a/Jsons/lib_list.json b/Jsons/lib_list.json new file mode 100644 index 0000000000000000000000000000000000000000..0dc86e1705f1d8c29345f955bc8d801d510aea76 --- /dev/null +++ b/Jsons/lib_list.json @@ -0,0 +1,5122 @@ +{ + "std_description": { + "std_name": "操作系统应用编程接口", + "std_number": "T/CESA-XXXX-2022", + "##std_version": "标准的版本标识,仅供作为本json描述文件的标识使用,由标准版本号+类别组成,标准第一版为1.0,勘误增加小版本号如1.1,标准修订增加大版本号2.0;", + "##std_version": "标准类别用1位大写字母,I表示团标,S电子信息行标,G表示国标", + "std_version": "1.0I", + "etc": "这是《操作系统应用编程接口》标准运行库描述文件,是《操作系统应用编程接口》标准符合性测试工具的组成部分;" + }, + "CopyRight": { + "License": "本文件遵循木兰协议xxxxxx", + "comment": "", + "Author": "贡献者:XXX@cesi,xxx@uitech,xxx@huawei,xxx@kylinos" + }, + "##libs": "标准规定动库包", + "libs": { + "##libs_location": "查询共享对象库的路径,与标准规定了文件系统层次结构保持一致", + "lib_location": [ + "/lib", + "/lib64", + "/usr/lib" + ], + "category": { + + "##章节名": "7 基础库", + "base": { + "description": { + "##chapters_number": "库对应标准章号,做完日志或错误等输出记录标识,可用于反查标准", + "chapters_number": "7", + "chapters_Name": "基础" + }, + "packages": { + "##glibc": "包名,考虑到编译后名称二进制安装包可能会存在差异,一般以源码包去命名,做完匹配符,用以检查安装的运行库是否存在,同aliasname。后面不在赘述", + "glibc": { + "##lib_name": "包名,一般与外部名称应该一致", + "lib_name": "glibc", + "##sections_number": "库包对应标准节号,当符合性检查出现错误或警告时,可用于标准反查", + "sections_number": "7.1", + "##lib_description": "库的介绍,可能会被删除,仅作为识读使用,不参与符合性检查,值可以置空", + "lib_description": "该软件包包括标准C库的共享版本以及标准数学库,以及其他许多库。", + "##version": "最低版本要求,'desktop_version':桌面OS,'server_version',服务器OS", + "##version": "版本位次检查规则:如果版号有n位,则前n-1位不可变,第n位版本号比低于版本要求;如果版号中含有字母或特殊字符另行扩充判定规则", + "version": { + "desktop": "2.28", + "server": "2.28" + }, + "##aliasname": "包的别名,考虑由于来源差异,部分包命及版本规则与包的根社区不一致,标准特对少部分包增加别名及特点版本要求,标准名和别名应遍历查找", + "##aliaversion": "别名对应版本,如果没有特殊要求,应与标准版一致;如果别名有多个,那么版本号也应该是多个,保持一一对应,多个别名对一个版本", + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "libc6", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "libnsl", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "nss_modules", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "nss_nis-3.0", + "version": { + "desktop": "2.28", + "server": "2.28" + } + } + ], + "##necessity": "必要性", + "##necessity": "第一位:L0表示对应平台不作要求,L1长期兼容库,L2兼容库,L3试用版本;如果是L0,则第二项可以置空'';L1与L2在符合性检查没有明显区别,主要是为了区别标准的长期性承诺", + "##necessity": "第二位:basic表示基本,基本ISO安装应提供该库,expansion表示扩展,该库可以通过扩展光盘或仓库提供,当兼容性级别为'L0'时,本项可置空,不再做检查,也不再做共享对象的检查", + "##necessity": "第三位:Deprecated表示不推荐,即不推荐应用调用,为兼容历史应用要求操作系统提供的库,操作性系统符合性检查时忽略该项,应用如果依赖该类库应给出告警", + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "##share_objs": "库所要求的共享对象名清单;当'share_objs'存在时表示桌面与服务器的要求一致(或对其中一类操作系统无要求);如果不存在则表示,按操作系统类别分别比较", + "##share_objs": "只有标准要求的共享对象(或符号链接)都存在才符合标准。如果是个符号链接,应查询到对应的实体库,并查验对应其符号链是否与查询到的符号链接文件是否一致", + "share_objs": { + "desktop": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"], + "server": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"] + } + }, + "elfutils": { + "lib_name": "elfutils", + "sections_number": "7.2", + "lib_description": "用于处理 ELF 文件和 DWARF 数据的应用程序集合", + "version": { + "desktop": "0.176", + "server": "0.176" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"], + "server": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"] + } + }, + "pam": { + "lib_name": "pam", + "sections_number": "7.3", + "lib_description": "Linux身份验证模块", + "version": { + "desktop": "1.3.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"], + "server": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"] + } + }, + "zlib": { + "lib_name": "zlib", + "sections_number": "7.4", + "lib_description": "无损数据压缩库", + "version": { + "desktop": "1.2.11", + "server": "1.2.11" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libz.so.1"], + "server": ["libz.so.1"] + } + }, + "gcc": { + "lib_name": "gcc", + "sections_number": "7.5", + "lib_description": "GNU 的编译器集合 包括对 ,C、C++、Fortran、Object-C、Object-C++、Go、D、等的支持。当前是 GCC 8 的实现版本。", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + }, + "alias": [ + { + "name": "gcc-7", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-8", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-9", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-10", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libstdc++", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libatomic", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libubsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libtsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libitm", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "liblsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatomic.so.1", + "libcc1.so", + "libcc1plugin.so", + "libcp1plugin.so", + "libgcc_s_x32.so", + "libgcc_s.so.1", + "libgdruntime.so.76", + "libgnarl-8.so.1", + "libgnarl.so", + "libgnat-8.so.1", + "libgnat.so", + "libgo.so.13", + "libgomp.so.1", + "libgphobos.so.76", + "libhsail-rt.so.0", + "libitm.so.1", + "liblsan.so.0", + "liblto_plugin.so.0", + "libmpx.so.2", + "libstdc++.so.6", + "libubsan.so.1"], + "server": ["libatomic.so.1", + "libgcc_s.so.1", + "libgomp.so.1", + "libstdc++.so.6"] + } + }, + "krb5": { + "lib_name": "krb5", + "sections_number": "7.6", + "lib_description": "Kerberos 网络身份验证协议", + "version": { + "desktop": "1.17", + "server": "1.17" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"], + "server": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"] + } + }, + "libxcrypt": { + "lib_name": "libxcrypt", + "sections_number": "7.7", + "lib_description": "实现加密和解密的库", + "version": { + "desktop": "4.4.10", + "server": "4.4.4" + }, + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "4.4.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypt.so.1"], + "server": ["libcrypt.so.1"] + } + }, + "audit": { + "lib_name": "audit", + "sections_number": "7.8", + "lib_description": "用于内核审计的用户空间工具", + "version": { + "desktop": "2.8.4", + "server": "2.8.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaudit.so.1", + "libauparse.so.0"], + "server": ["libaudit.so.1", + "libauparse.so.0"] + } + }, + "bzip2": { + "lib_name": "bzip2", + "sections_number": "7.9", + "lib_description": "高质量的数据压缩器", + "version": { + "desktop": "1.0.6", + "server": "1.0.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbz2.so.1"], + "server": ["libbz2.so.1"] + } + }, + "dbus": { + "lib_name": "dbus", + "sections_number": "7.10", + "lib_description": "消息总线系统,用于应用间通信。提供系统留守进程和用户登录留守进程", + "version": { + "desktop": "1.12.16", + "server": "1.12.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-1.so.3"], + "server": ["libdbus-1.so.3"] + } + }, + "expat": { + "lib_name": "expat", + "sections_number": "7.11", + "lib_description": "expat 是一个用 C 语言编写的面向流的 XML 解析器库", + "version": { + "desktop": "2.2.6", + "server": "2.2.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libexpat.so.1"], + "server": ["libexpat.so.1"] + } + }, + "glib2": { + "lib_name": "glib2", + "sections_number": "7.12", + "lib_description": "构成 GTK+ 和 GNOME 等项目基础的核心库", + "version": { + "desktop": "2.58", + "server": "2.56" + }, + "alias": [ + { + "name": "glib2.0", + "version": { + "desktop": "2.58", + "server": "2.56" + } + }, + { + "name": "glib2", + "version": { + "desktop": "2.58", + "server": "2.56" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"], + "server": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"] + } + }, + "gmp": { + "lib_name": "gmp", + "sections_number": "7.13", + "lib_description": "一个 GNU 多精度算术库", + "version": { + "desktop": "6.1.2", + "server": "6.1.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgmp.so.10"], + "server": ["libgmp.so.10"] + } + }, + "libidn2": { + "lib_name": "libidn2", + "sections_number": "7.14", + "lib_description": "GNU libidn2是GNU libidn的后继者。standalone lib。包含IDNA2008,Punycode 和 Unicode TR46 的实现。通过IETF国际域名(IDN)实施字符串预处理、Punycode和IDNA规格定义的包", + "version": { + "desktop": "2.0.5", + "server": "2.0.5" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libidn2.so.0"], + "server": ["libidn2.so.0"] + } + }, + "ncurses": { + "lib_name": "ncurses", + "sections_number": "7.15", + "lib_description": "终端控制库", + "version": { + "desktop": "6.1.1", + "server": "6.1" + }, + "alias": [ + { + "name": "ncurses", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + }, + { + "name": "ncurses-libs", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"], + "server": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"] + } + }, + "xz": { + "lib_name": "xz", + "sections_number": "7.16", + "lib_description": "一款免费的通用数据压缩软件,采用 LZMA2 算法", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + }, + "alias": [ + { + "name": "xz-utils", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + }, + { + "name": "xz", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liblzma.so.5"], + "server": ["liblzma.so.5"] + } + }, + "libcap": { + "lib_name": "libcap", + "sections_number": "7.17", + "lib_description": "这是一个用于获取和设置 POSIX.1e(以前的 POSIX 6)草案 15 功能的库。", + "version": { + "desktop": "2.25", + "server": "2.26" + }, + "alias": [ + { + "name": "libcap", + "version": { + "desktop": "2.25", + "server": "2.26" + } + }, + { + "name": "libcap2", + "version": { + "desktop": "2.25", + "server": "2.26" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcap.so.2"], + "server": ["libcap.so.2"] + } + }, + "popt": { + "lib_name": "popt", + "sections_number": "7.18", + "lib_description": "解析命令行选项的库。它不使用全局变量,因此可以在解析argv时进行多次传递;它可以解析任意argv样式元素的数组,允许解析来自任何源的命令行字符串;它提供了选项别名的标准方法;它可以执行外部选项过滤器;它可以自动为应用程序生成帮助和使用信息。", + "version": { + "desktop": "1.16", + "server": "1.16" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpopt.so.0"], + "server": ["libpopt.so.0"] + } + }, + "libnl3": { + "lib_name": "libnl3", + "sections_number": "7.19", + "lib_description": "libnl 套件是一组库,为基于 netlink 协议的 Linux 内核接口提供 API。", + "version": { + "desktop": "3.4.0", + "server": "3.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"], + "server": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"] + } + }, + "libsecret": { + "lib_name": "libsecret", + "sections_number": "7.20", + "lib_description": "libsecret 是一个用于存储和检索密码和其他机密的库。它使用 D-Bus 与“Secret Service”通信。gnome-keyring 和 ksecretservice 都是 Secret Service 的实现。", + "version": { + "desktop": "0.18.7", + "server": "0.18.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsecret-1.so.0"], + "server": ["libsecret-1.so.0"] + } + }, + "libIDL": { + "lib_name": "libIDL", + "sections_number": "7.21", + "lib_description": "libIDL是一个包含接口定义语言文件的库 。这是定义可移植接口的规范。", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + }, + "alias": [ + { + "name": "libIDL", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + } + }, + { + "name": "libidl", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libIDL-2.so.0"], + "server": ["libIDL-2.so.0"] + } + }, + "libtalloc": { + "lib_name": "libtalloc", + "sections_number": "7.22", + "lib_description": "libtalloc 包提供了一个使用析构函数实现分层内存分配器的库。", + "version": { + "desktop": "2.1.14", + "server": "2.2.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtalloc.so.2"], + "server": ["libtalloc.so.2"] + } + }, + "libtevent": { + "lib_name": "libtevent", + "sections_number": "7.23", + "lib_description": "libtevent 包提供 Tevent,一个基于talloc 内存管理库的事件系统。Tevent 支持多种事件类型,包括定时器、信号和经典的文件描述符事件。Tevent 还提供帮助器来处理提供 tevent_req(Tevent 请求)函数的异步代码。", + "version": { + "desktop": "0.9.37", + "server": "0.10.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtevent.so.0"], + "server": ["libtevent.so.0"] + } + }, + "dbus-glib": { + "lib_name": "dbus-glib", + "sections_number": "7.24", + "lib_description": "对DBus的GNOME GLib接口工具及函数库", + "version": { + "desktop": "0.110", + "server": "0.110" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-glib-1.so.2"], + "server": [] + } + }, + "attr": { + "lib_name": "attr", + "sections_number": "7.25", + "lib_description": "文件系统及文件扩展属性管理功能库", + "version": { + "desktop": "2.4.48", + "server": "2.4.48" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libattr.so.1"], + "server": [] + } + }, + "libevent": { + "lib_name": "libevent", + "sections_number": "7.26", + "lib_description": "当文件描述符上发生特定事件或达到超时后, libevent API 提供了一种执行回调函数的机制。此外,libevent还支持由于信号或常规超时而引起的回调。libevent旨在替换事件驱动网络服务器中的事件循环。", + "version": { + "desktop": "2.1.8", + "server": "2.1.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"], + "server": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"] + } + }, + "accountsservice": { + "lib_name": "accountsservice", + "sections_number": "7.27", + "lib_description": "用户管理(账户维护)", + "version": { + "desktop": "0.6.45", + "server": "0.6.50" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaccountsservice.so.0"], + "server": ["libaccountsservice.so.0"] + } + }, + "libmpc": { + "lib_name": "libmpc", + "sections_number": "7.28", + "lib_description": "用于多精度复杂算术的 C 库", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + }, + "alias": [ + { + "name": "libmpc3", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + }, + { + "name": "libmpc", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpc.so.3"], + "server": ["libmpc.so.3"] + } + }, + "mpfr": { + "lib_name": "mpfr", + "sections_number": "7.29", + "lib_description": "多精度浮点计算 C 库", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + }, + "alias": [ + { + "name": "mpfr4", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + }, + { + "name": "mpfr", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpfr.so.6"], + "server": ["libmpfr.so.4"] + } + }, + "ndctl": { + "lib_name": "ndctl", + "sections_number": "7.30", + "lib_description": "DAX(直接访问)协议支持工具", + "version": { + "desktop": "63", + "server": "63" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdaxctl.so.1"], + "server": ["libdaxctl.so.1"] + } + }, + "file": { + "lib_name": "file", + "sections_number": "7.31", + "lib_description": "识别特定文件类型的工具", + "version": { + "desktop": "5.35", + "server": "5.33" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmagic.so.1"], + "server": ["libmagic.so.1"] + } + }, + "gdbm": { + "lib_name": "gdbm", + "sections_number": "7.32", + "lib_description": "一个使用可扩展散列的数据库函数库", + "version": { + "desktop": "1.18", + "server": "1.18" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdbm.so.6", + "libgdbm_compat.so.4"], + "server": ["libgdbm.so.6", + "libgdbm_compat.so.4"] + } + }, + "keyutils": { + "lib_name": "keyutils", + "sections_number": "7.33", + "lib_description": "Linux 密钥管理程序", + "version": { + "desktop": "1.6", + "server": "1.5.10" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libkeyutils.so.1"], + "server": ["libkeyutils.so.1"] + } + }, + "libedit": { + "lib_name": "libedit", + "sections_number": "7.34", + "lib_description": "提供通用行编辑、历史记录和标记功能", + "version": { + "desktop": "3.1", + "server": "3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libedit.so.2"], + "server": ["libedit.so.0"] + } + }, + "kcodecs": { + "lib_name": "kcodecs", + "sections_number": "7.35", + "lib_description": "操作字符串的方法的集合KCodecs提供了一组操作字符串的方法使用不同的编码。", + "version": { + "desktop": "5.54.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libKF5Codecs.so.5"], + "server": [] + } + }, + "fcitx": { + "lib_name": "fcitx", + "sections_number": "7.36", + "lib_description": "fcitx输入法的核心功能库", + "version": { + "desktop": "4.2.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfcitx-core.so.0", + "libfcitx-gclient.so.1", + "libfcitx-utils.so.0"], + "server": [] + } + }, + "libsdl-ttf2.0": { + "lib_name": "libsdl-ttf2.0", + "sections_number": "7.37", + "lib_description": "允许SDL应用程序中使用TrueType字体", + "version": { + "desktop": "2.0.11", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL_ttf-2.0.so.0"], + "server": [] + } + } + } + }, + "##章节名": "8 系统安全库", + "security": { + "description": { + "chapters_number": "8", + "chapters_Name": "系统安全" + }, + "packages": { + "acl": { + "lib_name": "acl", + "sections_number": "8.1", + "lib_description": "管理访问控制列表。", + "version": { + "desktop": "2.2.53", + "server": "2.2.53" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libacl.so.1"], + "server": ["libacl.so.1"] + } + }, + "cyrus-sasl": { + "lib_name": "cyrus-sasl", + "sections_number": "8.2", + "lib_description": "SASL是简单的权限验证和安全层,可添加基于连接的协议的验证支持。", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + }, + "alias": [ + { + "name": "cyrus-sasl2", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + }, + { + "name": "cyrus-sasl", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsasl2.so.2", + "libanonymous.so.2", + "libsasldb.so.2", + "libcrammd5.so.2", + "libdigestmd5.so.2", + "libgs2.so.2", + "libgssapiv2.so.2", + "libldapdb.so.2", + "liblogin.so.2", + "libntlm.so.2", + "libplain.so.2", + "libscram.so.2"], + "server": ["libsasl2.so.3", + "libanonymous.so.3", + "libsasldb.so.3", + "libcrammd5.so.3", + "libdigestmd5.so.3", + "libgs2.so.3", + "libgssapiv2.so.3", + "libldapdb.so.3", + "liblogin.so.3", + "libntlm.so.3", + "libplain.so.3", + "libscram.so.3"] + } + }, + "libgcrypt": { + "lib_name": "libgcrypt", + "sections_number": "8.3", + "lib_description": "通用加密库。", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + }, + "alias": [ + { + "name": "libgcrypt20", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + }, + { + "name": "libgcrypt", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgcrypt.so.20"], + "server": ["libgcrypt.so.20"] + } + }, + "liboauth": { + "lib_name": "liboauth", + "sections_number": "8.4", + "lib_description": "oauth是一种关于授权方式的协议标准。", + "version": { + "desktop": "1.0.3", + "server": "1.0.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liboauth.so.0"], + "server": ["liboauth.so.0"] + } + }, + "gnutls": { + "lib_name": "gnutls", + "sections_number": "8.5", + "lib_description": "gnutls全称 GNU TransportLayerSecurity Library,即基于GNU版权协议的传输层安全协议,是wget支持https中的ssl协议的基础库。", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + }, + "alias": [ + { + "name": "gnutls28", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + }, + { + "name": "gnutls", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"], + "server": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"] + } + }, + "libssh": { + "lib_name": "libssh", + "sections_number": "8.6", + "lib_description": "libssh 是一个用以访问SSH服务的C语言开发包,通过它可以执行远程命令、文件传输,同时为远程的程序提供安全的传输通道。", + "version": { + "desktop": "0.8.7", + "server": "0.8.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh.so.4"], + "server": ["libssh.so.4", + "libssh_threads.so.4"] + } + }, + "libssh2": { + "lib_name": "libssh2", + "sections_number": "8.7", + "lib_description": "libssh2是一个C 函数库,用来实现SSH2协议。主要功能:Key Exchange Methods,Hostkey Type,Ciphers,Compression Schemes,MAC hashes等", + "version": { + "desktop": "1.8.0", + "server": "1.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh2.so.1"], + "server": ["libssh2.so.1"] + } + }, + "cracklib": { + "lib_name": "cracklib", + "sections_number": "8.8", + "lib_description": "密码安全测试工具。", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + }, + "alias": [ + { + "name": "cracklib2", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + } + }, + { + "name": "cracklib", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrack.so.2"], + "server": ["libcrack.so.2"] + } + }, + "nspr": { + "lib_name": "nspr", + "sections_number": "8.9", + "lib_description": "包含线程、文件和网络I/O、内存管理等的运行时库。", + "version": { + "desktop": "4.20.1", + "server": "4.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnspr4.so", + "libplc4.so", + "libplds4.so"], + "server": ["libnspr4.so", + "libplc4.so", + "libplds4.so"] + } + }, + "openssl": { + "lib_name": "openssl", + "sections_number": "8.10", + "lib_description": "具有 TLS 实现的通用加密库中的实用程序,添加国密算法SM2 SM3 SMS4", + "version": { + "desktop": "1.1.1d", + "server": "1.1.1c" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypto.so.1.1", + "libssl.so.1.1"], + "server": ["libcrypto.so.1.1", + "libssl.so.1.1"] + } + } + } + }, + "##章节名": "9 网络服务库", + "network": { + "description": { + "chapters_number": "9", + "chapters_Name": "网络服务" + }, + "packages": { + "Networkmanager": { + "lib_name": "Networkmanager", + "sections_number": "9.1", + "lib_description": "网络链接管理器和用户应用程序。", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + }, + "alias": [ + { + "name": "network-manager", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + } + }, + { + "name": "Networkmanager", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm.so.0", + "libnm-wwan.so", + "nm-pppd-plugin.so"], + "server": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-ovs.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm-settings-plugin-ifcfg-rh.so", + "libnm.so.0", + "libnm-wwan.so"] + } + }, + "sssd": { + "lib_name": "sssd", + "sections_number": "9.2", + "lib_description": "管理对远程目录的访问和权限验证", + "version": { + "desktop": "1.16.3", + "server": "1.16.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"], + "server": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"] + } + }, + "libtirpc": { + "lib_name": "libtirpc", + "sections_number": "9.3", + "lib_description": "libtirpc包包含支持使用远程过程调用 (RPC) API 的程序的库 。", + "version": { + "desktop": "1.1.4", + "server": "1.1.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtirpc.so.3"], + "server": ["libtirpc.so.3"] + } + }, + "nss": { + "lib_name": "nss", + "sections_number": "9.4", + "lib_description": "网络安全服务。", + "version": { + "desktop": "3.42.1", + "server": "3.40.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnss3.so", + "libsmime3.so", + "libssl3.so"], + "server": ["libnss3.so", + "libnsssysinit.so", + "libsmime3.so", + "libssl3.so"] + } + }, + "libpcap": { + "lib_name": "libpcap", + "sections_number": "9.5", + "lib_description": "libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。著名的软件TCPDUMP就是在libpcap的的基础上开发而成的", + "version": { + "desktop": "1.8.1", + "server": "1.9.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpcap.so.1"], + "server": ["libpcap.so.1"] + } + }, + "curl": { + "lib_name": "curl", + "sections_number": "9.6", + "lib_description": "命令行或脚本数据传输工具", + "version": { + "desktop": "7.64.1", + "server": "7.61.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcurl.so.4"], + "server": ["libcurl.so.4"] + } + }, + "iptables": { + "lib_name": "iptables", + "sections_number": "9.7", + "lib_description": "IP包过滤管理工具", + "version": { + "desktop": "1.8.2", + "server": "1.8.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.2", + "libip6tc.so.2", + "libxtables.so.12"], + "server": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.0", + "libip6tc.so.0", + "libiptc.so.0", + "libxtables.so.12"] + } + }, + "bind": { + "lib_name": "bind", + "sections_number": "9.8", + "lib_description": "包括操作 DNS 服务器的组件", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + }, + "alias": [ + { + "name": "bind9", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + }, + { + "name": "bind", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbind9.so.161", + "libisccc.so.161", + "liblwres.so.161"], + "server": ["libbind9.so.160", + "libisccc.so.160", + "liblwres.so.160"] + } + }, + "cifs-utils": { + "lib_name": "cifs-utils", + "sections_number": "9.9", + "lib_description": "通用网络文件系统。", + "version": { + "desktop": "6.8", + "server": "6.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["idmapwb.so", + "pam_cifscreds.so"], + "server": ["idmapwb.so", + "pam_cifscreds.so"] + } + }, + "atkmm": { + "lib_name": "atkmm", + "sections_number": "9.10", + "lib_description": "atk库的C++绑定。", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + }, + "alias": [ + { + "name": "atkmm1.6", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + }, + { + "name": "atkmm", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatkmm-1.6.so.11"], + "server": ["libatkmm-1.6.so.11"] + } + }, + "avahi": { + "lib_name": "avahi", + "sections_number": "9.11", + "lib_description": "通过mDNS/DNS-SD协议发现本地网络上的服务。", + "version": { + "desktop": ".7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavahi-core.so.7", + "libavahi-glib.so.1", + "libavahi-client.so.3", + "libavahi-common.so.3", + "libavahi-gobject.so.0", + "libavahi-ui-gtk3.so.0"], + "server": [] + } + }, + "dhcp": { + "lib_name": "dhcp", + "sections_number": "9.12", + "lib_description": "动态分配DHCP", + "version": { + "desktop": "", + "server": "4.3.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libdhcpctl.so", + "libomapi.so"] + } + }, + "iproute": { + "lib_name": "iproute", + "sections_number": "9.13", + "lib_description": "命令行网络工具", + "version": { + "desktop": " 4.20.0", + "server": "" + }, + "alias": [ + { + "name": "iproute2", + "version": { + "desktop": " 4.20.0", + "server": "" + } + }, + { + "name": "iproute", + "version": { + "desktop": " 4.20.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["m_ipt.so"], + "server": [] + } + } + } + }, + "##章节名": "10 图形库", + "graphic": { + "description": { + "chapters_number": "10", + "chapters_Name": "图形" + }, + "packages": { + "atk": { + "lib_name": "atk", + "sections_number": "10.1", + "lib_description": "提供给应用程序的可访问性的编程接口。", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + }, + "alias": [ + { + "name": "atk1.0", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + }, + { + "name": "atk", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-1.0.so.0"], + "server": ["libatk-1.0.so.0"] + } + }, + "gtk2": { + "lib_name": "gtk2", + "sections_number": "10.2", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + }, + "alias": [ + { + "name": "gtk+2.0", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + }, + { + "name": "gtk2", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"], + "server": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"] + } + }, + "gtk3": { + "lib_name": "gtk3", + "sections_number": "10.3", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + }, + "alias": [ + { + "name": "gtk+3.0", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + } + }, + { + "name": "gtk3", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"], + "server": ["libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"] + } + }, + "libICE": { + "lib_name": "libICE", + "sections_number": "10.4", + "lib_description": "X.Org X11 ICE 运行时库", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + }, + "alias": [ + { + "name": "libice", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + }, + { + "name": "libICE", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libICE.so.6"], + "server": ["libICE.so.6"] + } + }, + "libxext": { + "lib_name": "libxext", + "sections_number": "10.5", + "lib_description": "X.Org 项目提供了 X Window System.X.Org X11 libXext 的开源实现,包含运行时库。", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + }, + "alias": [ + { + "name": "libxext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + }, + { + "name": "libXext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXext.so.6"], + "server": ["libXext.so.6"] + } + }, + "libpng1.6": { + "lib_name": "libpng1.6", + "sections_number": "10.6", + "lib_description": "libpng 包包含其他程序用于读取和写入 PNG 格式文件的库。", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + }, + "alias": [ + { + "name": "libpng1.6", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + } + }, + { + "name": "libpng", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng16.so.16"], + "server": ["libpng16.so.16"] + } + }, + "libx11": { + "lib_name": "libx11", + "sections_number": "10.7", + "lib_description": "Core X11 协议客户端库", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + }, + "alias": [ + { + "name": "libx11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + }, + { + "name": "libX11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libX11-xcb.so.1", + "libX11.so.6"], + "server": ["libX11-xcb.so.1", + "libX11.so.6"] + } + }, + "libsdl2": { + "lib_name": "libsdl2", + "sections_number": "10.8", + "lib_description": "SDL的重构版", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + }, + "alias": [ + { + "name": "libsdl2", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + } + }, + { + "name": "SDL2", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL2-2.0.so.0"], + "server": [] + } + }, + "libxau": { + "lib_name": "libxau", + "sections_number": "10.9", + "lib_description": "用于提供对 X Window 的单独访问系统显示。", + "version": { + "desktop": "1.0.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXau.so.6"], + "server": [] + } + }, + "libxaw": { + "lib_name": "libxaw", + "sections_number": "10.10", + "lib_description": "Xaw 是一个基于 X Toolkit Intrinsics (Xt) 库的小部件集。", + "version": { + "desktop": "1.0.13", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXaw.so.7"], + "server": [] + } + }, + "fontconfig": { + "lib_name": "fontconfig", + "sections_number": "10.11", + "lib_description": "Fontconfig 根据应用程序指定的要求提供不同的字体。", + "version": { + "desktop": "2.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontconfig.so.1"], + "server": [] + } + }, + "freetype": { + "lib_name": "freetype", + "sections_number": "10.12", + "lib_description": "字体渲染软件库。", + "version": { + "desktop": "2.9.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfreetype.so.6"], + "server": [] + } + }, + "tiff": { + "lib_name": "tiff", + "sections_number": "10.13", + "lib_description": "支持标记图像文件格式。", + "version": { + "desktop": "4.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtiff.so.5", + "libtiffxx.so.5"], + "server": [] + } + }, + "libxpm": { + "lib_name": "libxpm", + "sections_number": "10.14", + "lib_description": "X.Org X11 libXpm 运行时库", + "version": { + "desktop": "3.5.12", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXpm.so.4"], + "server": [] + } + }, + "libxdmcp": { + "lib_name": "libxdmcp", + "sections_number": "10.15", + "lib_description": "X 显示管理器控制协议 (XDMCP) 提供了一个统一的自主显示器向远程主机请求登录服务的机制。", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdmcp.so.6"], + "server": [] + } + }, + "libxrandr": { + "lib_name": "libxrandr", + "sections_number": "10.16", + "lib_description": "X.Org X11 libXrandr 运行时库", + "version": { + "desktop": "1.5.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrandr.so.2"], + "server": [] + } + }, + "libglu": { + "lib_name": "libglu", + "sections_number": "10.17", + "lib_description": "OpenGL 实用程序库 (GLU) ,它提供了许多函数,这些函数使用基本 OpenGL 库从 OpenGL 提供的更原始的例程中提供更高级别的绘图例程。", + "version": { + "desktop": "9.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libGLU.so.1"], + "server": [] + } + }, + "libdmx": { + "lib_name": "libdmx", + "sections_number": "10.18", + "lib_description": "X.Org 项目提供了 X Window 系统的开源实现。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdmx.so.1"], + "server": ["libdmx.so.1"] + } + }, + "libdrm": { + "lib_name": "libdrm", + "sections_number": "10.19", + "lib_description": "libdrm 提供了一个用户空间库,用于在支持 ioctl 接口的操作系统上访问 DRM(直接渲染管理器)。", + "version": { + "desktop": "2.4.99", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdrm.so.2", + "libdrm_amdgpu.so.1", + "libdrm_nouveau.so.2", + "libdrm_radeon.so.1"], + "server": [] + } + }, + "libxmu": { + "lib_name": "libxmu", + "sections_number": "10.20", + "lib_description": "X.Org X11 libXmu/libXmuu 运行时库", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXmu.so.6", + "libXmuu.so.1"], + "server": [] + } + }, + "libxcb": { + "lib_name": "libxcb", + "sections_number": "10.21", + "lib_description": "X协议C语言绑定 (XCB) ,是 Xlib 的替代品。", + "version": { + "desktop": "1.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-composite.so.0", + "libxcb-damage.so.0", + "libxcb-dpms.so.0", + "libxcb-dri2.so.0", + "libxcb-dri3.so.0", + "libxcb-glx.so.0", + "libxcb-present.so.0", + "libxcb-randr.so.0", + "libxcb-record.so.0", + "libxcb-render.so.0", + "libxcb-res.so.0", + "libxcb-screensaver.so.0", + "libxcb-shape.so.0", + "libxcb-shm.so.0", + "libxcb-sync.so.1", + "libxcb-xf86dri.so.0", + "libxcb-xfixes.so.0", + "libxcb-xinerama.so.0", + "libxcb-xinput.so.0", + "libxcb-xkb.so.1", + "libxcb-xtest.so.0", + "libxcb-xv.so.0", + "libxcb-xvmc.so.0", + "libxcb.so.1"], + "server": [] + } + }, + "libxrender": { + "lib_name": "libxrender", + "sections_number": "10.22", + "lib_description": "X.Org X11 libXrender 运行时库", + "version": { + "desktop": "0.9.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrender.so.1"], + "server": [] + } + }, + "xft": { + "lib_name": "xft", + "sections_number": "10.23", + "lib_description": "Xft 是一个将 X 应用程序与 FreeType 字体连接起来的光栅化库。", + "version": { + "desktop": "2.3.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXft.so.2"], + "server": [] + } + }, + "gdk-pixbuf": { + "lib_name": "gdk-pixbuf", + "sections_number": "10.24", + "lib_description": "创建图形用户界面的多平台工具包", + "version": { + "desktop": "2.38.1", + "server": "" + }, + "alias": [ + { + "name": "gdk-pixbuf2", + "version": { + "desktop": "2.38.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdk_pixbuf-2.0.so.0", + "libgdk_pixbuf_xlib-2.0.so.0", + "libpixbufloader-ani.so", + "libpixbufloader-bmp.so", + "libpixbufloader-gif.so", + "libpixbufloader-icns.so", + "libpixbufloader-ico.so", + "libpixbufloader-jpeg.so", + "libpixbufloader-pnm.so", + "libpixbufloader-qtif.so", + "libpixbufloader-tga.so", + "libpixbufloader-tiff.so", + "libpixbufloader-xbm.so", + "libpixbufloader-xpm.so"], + "server": [] + } + }, + "libfontenc": { + "lib_name": "libfontenc", + "sections_number": "10.25", + "lib_description": "X.Org X11 libfontenc 运行时库。", + "version": { + "desktop": "1.1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontenc.so.1"], + "server": ["libfontenc.so.1"] + } + }, + "libglvnd": { + "lib_name": "libglvnd", + "sections_number": "10.26", + "lib_description": "libglvnd 是一个供应商中立的调度层,用于仲裁多个供应商之间的 OpenGL API 调用。", + "version": { + "desktop": "1.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"], + "server": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"] + } + }, + "libjpeg-turbo": { + "lib_name": "libjpeg-turbo", + "sections_number": "10.27", + "lib_description": "libjpeg-turbo 是一个 JPEG 图像编解码器。", + "version": { + "desktop": "1.5.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libjpeg.so.62", + "libturbojpeg.so.0"], + "server": [] + } + }, + "libpciaccess": { + "lib_name": "libpciaccess", + "sections_number": "10.28", + "lib_description": "为 X 提供访问 PCI 总线和设备的功能平台无关的方式。", + "version": { + "desktop": ".14", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpciaccess.so.0"], + "server": [] + } + }, + "libpng12": { + "lib_name": "libpng12", + "sections_number": "10.29", + "lib_description": "便携式网络图形格式库", + "version": { + "desktop": "1.2.54", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng12.so"], + "server": [] + } + }, + "libraw": { + "lib_name": "libraw", + "sections_number": "10.30", + "lib_description": "LibRaw 是一个用于从数码相机读取 RAW 文件的库。", + "version": { + "desktop": "0.19.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libraw.so.19"], + "server": [] + } + }, + "libSM": { + "lib_name": "libSM", + "sections_number": "10.31", + "lib_description": "libSM 软件包中包含 X.Org X11 SM 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSM.so.6"], + "server": [] + } + }, + "libwebp": { + "lib_name": "libwebp", + "sections_number": "10.32", + "lib_description": "这是一种对数码照片图像进行有损压缩的图像格式。", + "version": { + "desktop": "0.6.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libwebp.so.6", + "libwebpdemux.so.2", + "libwebpmux.so.3"], + "server": [] + } + }, + "libxres": { + "lib_name": "libxres", + "sections_number": "10.33", + "lib_description": "X-Resource 是一个扩展,它允许客户端向 X 服务器查询各种资源的使用情况。", + "version": { + "desktop": "1.2.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXRes.so.1"], + "server": [] + } + }, + "libxcomposite": { + "lib_name": "libxcomposite", + "sections_number": "10.34", + "lib_description": "X 复合扩展库", + "version": { + "desktop": "0.4.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXcomposite.so.1"], + "server": [] + } + }, + "libxcursor": { + "lib_name": "libxcursor", + "sections_number": "10.35", + "lib_description": "libXcursor 是一个旨在帮助定位和加载游标的库。游标可以从文件或内存中加载。", + "version": { + "desktop": "1.1.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["ibXcursor.so.1"], + "server": [] + } + }, + "libxdamage": { + "lib_name": "libxdamage", + "sections_number": "10.36", + "lib_description": "X Damage Extension 允许应用程序跟踪可绘制对象的修改区域。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdamage.so.1"], + "server": [] + } + }, + "libxfixes": { + "lib_name": "libxfixes", + "sections_number": "10.37", + "lib_description": "X Fixes 扩展为应用程序提供了针对核心协议中各种限制的变通方法。", + "version": { + "desktop": "5.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfixes.so.3"], + "server": [] + } + }, + "libxfont": { + "lib_name": "libxfont", + "sections_number": "10.38", + "lib_description": "libXfont 提供了遗留 X11 字体系统的核心。", + "version": { + "desktop": "2.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfont2.so.2"], + "server": [] + } + }, + "libxi": { + "lib_name": "libxi", + "sections_number": "10.39", + "lib_description": "libXi 是 X 输入扩展的客户端库。", + "version": { + "desktop": "1.7.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXi.so.6"], + "server": [] + } + }, + "libxinerama": { + "lib_name": "libxinerama", + "sections_number": "10.40", + "lib_description": "Xinerama 是 X Window System 的扩展。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXinerama.so.1"], + "server": [] + } + }, + "libxkbcommon": { + "lib_name": "libxkbcommon", + "sections_number": "10.41", + "lib_description": "xkbcommon 是一个用于处理键盘描述的库。", + "version": { + "desktop": "0.8.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbcommon-x11.so.0"], + "server": [] + } + }, + "libxkbfile": { + "lib_name": "libxkbfile", + "sections_number": "10.42", + "lib_description": "X 服务器和实用程序使用 Libxkbfile 来解析 XKB 配置数据文件。", + "version": { + "desktop": "1.0.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbfile.so.1"], + "server": [] + } + }, + "libxklavier": { + "lib_name": "libxklavier", + "sections_number": "10.43", + "lib_description": "这个包是一个为 X 键盘扩展提供高级 API 的库,称为 XKB。", + "version": { + "desktop": "5.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxklavier.so.16"], + "server": [] + } + }, + "cairo": { + "lib_name": "cairo", + "sections_number": "10.44", + "lib_description": "Cairo 是一个支持多种输出设备的 2D 图形库。", + "version": { + "desktop": "1.16.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcairo-gobject.so.2", + "libcairo-script-interpreter.so.2", + "libcairo.so.2"], + "server": [] + } + }, + "fltk1.3": { + "lib_name": "fltk1.3", + "sections_number": "10.45", + "lib_description": "FLTK是一个跨平台的 C++ GUI 工具包。", + "version": { + "desktop": "1.1.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfltk.so.1.3", + "libfltk_forms.so.1.3", + "libfltk_gl.so.1.3", + "libfltk_images.so.1.3"], + "server": [] + } + }, + "libxss": { + "lib_name": "libxss", + "sections_number": "10.46", + "lib_description": "此包包含 X.Org X11 libXss 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXss.so.1"], + "server": [] + } + }, + "libxshmfence": { + "lib_name": "libxshmfence", + "sections_number": "10.47", + "lib_description": "X11 的共享内存栅栏,在 DRI3 中使用。", + "version": { + "desktop": "1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxshmfence.so.1"], + "server": [] + } + }, + "libxt": { + "lib_name": "libxt", + "sections_number": "10.48", + "lib_description": "X.Org X11 libXt 运行时库", + "version": { + "desktop": "1.1.5", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXt.so.6"], + "server": [] + } + }, + "libxtst": { + "lib_name": "libxtst", + "sections_number": "10.49", + "lib_description": "X.Org X11 libXtst 运行时库", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXtst.so.6"], + "server": [] + } + }, + "libxvmc": { + "lib_name": "libxvmc", + "sections_number": "10.50", + "lib_description": "XvMC 是 X 窗口系统的 X 视频扩展 (Xv) 的扩展。", + "version": { + "desktop": "1.0.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXvMC.so.1", + "libXvMCW.so.1"], + "server": [] + } + }, + "libxxf86dga": { + "lib_name": "libxxf86dga", + "sections_number": "10.51", + "lib_description": "XFree86-DGA 扩展的客户端库", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86dga.so.1"], + "server": [] + } + }, + "libxxf86vm": { + "lib_name": "libxxf86vm", + "sections_number": "10.52", + "lib_description": "为 XFree86-VidModeExtension 提供一个扩展库。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86vm.so.1"], + "server": [] + } + }, + "pango1.0": { + "lib_name": "pango1.0", + "sections_number": "10.53", + "lib_description": "Pango 是一个用于布局和渲染文本的库,重点是关于国际化。", + "version": { + "desktop": "1.42.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpango-1.0.so.0", + "libpangocairo-1.0.so.0", + "libpangoft2-1.0.so.0", + "libpangoxft-1.0.so.0"], + "server": [] + } + }, + "pixman": { + "lib_name": "pixman", + "sections_number": "10.54", + "lib_description": "Pixman 是一个用于像素操作的低级软件库,提供图像合成和梯形光栅化等功能。", + "version": { + "desktop": "0.36.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixman-1.so.0"], + "server": [] + } + }, + "qt4-x11": { + "lib_name": "qt4-x11", + "sections_number": "10.55", + "lib_description": "开发应用程序的软件工具包", + "version": { + "desktop": "4.8.7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQtCLucene.so.4", + "libQtCore.so.4", + "libQtDBus.so.4", + "libQtDeclarative.so.4", + "libQtGui.so.4", + "libQtNetwork.so.4", + "libQtScript.so.4", + "libQtSql.so.4", + "libQtXmlPatterns.so.4", + "libQtXml.so.4"], + "server": [] + } + }, + "qtbase-opensource-src": { + "lib_name": "qtbase-opensource-src", + "sections_number": "10.56", + "lib_description": "Qt工具包的核心组件", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5Concurrent.so.5", + "libQt5Core.so.5", + "libQt5DBus.so.5", + "libQt5Network.so.5", + "libQt5Sql.so.5", + "libQt5Test.so.5", + "libQt5Xml.so.5", + "libqconnmanbearer.so", + "libqgenericbearer.so", + "libqnmbearer.so", + "libqsqlite.so"], + "server": [] + } + }, + "qtx11extras-opensource-src": { + "lib_name": "qtx11extras-opensource-src", + "sections_number": "10.57", + "lib_description": "Qt 5 X11额外功能Qt是一个跨平台的c++应用程序框架。Qt的主要特性是它丰富的widget集,提供标准的GUI功能。这个包包含了从Qt 5中访问X11内容的库。", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5X11Extras.so.5"], + "server": [] + } + }, + "xcb-util": { + "lib_name": "xcb-util", + "sections_number": "10.58", + "lib_description": "XCB 工具模块", + "version": { + "desktop": "0.3.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-util.so.1"], + "server": [] + } + }, + "xcb-util-image": { + "lib_name": "xcb-util-image", + "sections_number": "10.59", + "lib_description": "提供XImage和XShmImage功能端口", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-image.so.0"], + "server": [] + } + }, + "xcb-util-keysyms": { + "lib_name": "xcb-util-keysyms", + "sections_number": "10.60", + "lib_description": "标准X键值对转换工具", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-keysyms.so.1"], + "server": [] + } + }, + "xcb-util-renderutil": { + "lib_name": "xcb-util-renderutil", + "sections_number": "10.61", + "lib_description": "渲染扩展工具", + "version": { + "desktop": "0.3.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-render-util.so.0"], + "server": [] + } + }, + "xcb-util-wm": { + "lib_name": "xcb-util-wm", + "sections_number": "10.62", + "lib_description": "窗口管理器", + "version": { + "desktop": "0.4.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-ewmh.so.2", + "libxcb-icccm.so.4"], + "server": [] + } + }, + "xorg-x11-server": { + "lib_name": "xorg-x11-server", + "sections_number": "10.63", + "lib_description": "X.Org X11 X 服务器", + "version": { + "desktop": "1.20.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["modesetting_drv.so", + "libglx.so", + "libexa.so", + "libfbdevhw.so", + "libfb.so", + "libglamoregl.so", + "libint10.so", + "libshadowfb.so", + "libshadow.so", + "libvbe.so", + "libvgahw.so", + "libwfb.so"], + "server": [] + } + }, + "libsdl1.2": { + "lib_name": "libsdl1.2", + "sections_number": "10.64", + "lib_description": "跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、 MPEG播放器和其他应用软件", + "version": { + "desktop": "1.2.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL-1.2.so.0"], + "server": ["libSDL-1.2.so.0"] + } + } + } + }, + "##章节名": "11 多媒体库", + "multimedia": { + "description": { + "chapters_number": "11", + "chapters_Name": "多媒体" + }, + "packages": { + "alsa-lib": { + "lib_name": "alsa-lib", + "sections_number": "11.1", + "lib_description": "编译 ALSA 应用程序的用户空间库", + "version": { + "desktop": "1.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasound.so.2"], + "server": [] + } + }, + "ffmpeg": { + "lib_name": "ffmpeg", + "sections_number": "11.2", + "lib_description": "Linux音视频播放解决方案", + "version": { + "desktop": "4.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavcodec.so.58", + "libavfilter.so.7", + "libavformat.so.58", + "libavresample.so.4", + "libavutil.so.56", + "libpostproc.so.55", + "libswresample.so.3", + "libswscale.so.5"], + "server": [] + } + }, + "gstreamer1.0": { + "lib_name": "gstreamer1.0", + "sections_number": "11.3", + "lib_description": "GStreamer 流媒体框架运行时", + "version": { + "desktop": "1.14.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgstbase-1.0.so.0", + "libgstcheck-1.0.so.0", + "libgstcontroller-1.0.so.0", + "libgstcoreelements.so", + "libgstcoretracers.so", + "libgstnet-1.0.so.0", + "libgstreamer-1.0.so.0"], + "server": [] + } + }, + "libdvdnav": { + "lib_name": "libdvdnav", + "sections_number": "11.4", + "lib_description": "显示 DVD 视频菜单功能库", + "version": { + "desktop": "6.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdnav.so.4"], + "server": [] + } + }, + "libdvdread": { + "lib_name": "libdvdread", + "sections_number": "11.5", + "lib_description": "用于访问 DVD 磁盘的库", + "version": { + "desktop": "6.0.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdread.so.4", "libdvdread.so.7"], + "server": [] + } + }, + "pulseaudio": { + "lib_name": "pulseaudio", + "sections_number": "11.6", + "lib_description": "Linux声音服务器", + "version": { + "desktop": "12.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libalsa-util.so", + "libavahi-wrap.so", + "libbluez5-util.so", + "libcli.so", + "libprotocol-cli.so", + "libprotocol-esound.so", + "libprotocol-http.so", + "libprotocol-native.so", + "libprotocol-simple.so", + "libpulsedsp.so", + "libpulse-mainloop-glib.so.0", + "libpulse-simple.so.0", + "libpulse.so.0", + "libraop.so", + "librtp.so", + "libwebrtc-util.so"], + "server": [] + } + } + } + }, + "##章节名": "12 打印扫描库", + "print_scan": { + "description": { + "chapters_number": "12", + "chapters_Name": "打印扫描" + }, + "packages": { + "cups-filters": { + "lib_name": "cups-filters", + "sections_number": "12.1", + "lib_description": "CUPS 是苹果公司为 Mac OS X 和其他类 UNIX操作系统开发的基于标准的开源打印系统。CUPS 使用 Internet 打印协议 (“IPP”) 并提供 System V 和 Berkeley 命令行界面、Web 界面和 C API 来管理打印机和打印作业。该项目提供后端、过滤器和其他软件,cups-filters是过滤器。", + "version": { + "desktop": "1.21.6", + "server": "1.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontembed.so.1", + "libcupsfilters.so.1"], + "server": ["libfontembed.so.1", + "libcupsfilters.so.1"] + } + }, + "sane-backends": { + "lib_name": "sane-backends", + "sections_number": "12.2", + "lib_description": "SANE 应用程序编程接口 (API) ,提供对任何光栅图像扫描仪硬件(平板扫描仪、手持式扫描仪、视频和照相机、图像采集卡等)的标准化访问。", + "version": { + "desktop": "1.0.27", + "server": "1.0.27" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsane.so.1"], + "server": [] + } + } + } + }, + "##章节名": "13 运行时语言库", + "runtime_language": { + "description": { + "chapters_number": "13", + "chapters_Name": "运行时语言" + }, + "packages": { + "openjdk": { + "lib_name": "openjdk", + "sections_number": "13.1", + "lib_description": "OpenJDK 是 Java 标准版 (Java SE) 和 Java 开发工具包 (JDK) 的开源实现。OpenJDK 源代码是这些商业 Java 产品的基础。它包含了Java 运行时环境,用以运行 Java 程序,也包含了 Java 虚拟机和一些别的组成。", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + }, + "alias": [ + { + "name": "openjdk-lts", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "openjdk-11", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-11-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-1.8.0-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-wrapper.so.6", + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjawt.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"], + "server": [ + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"] + } + }, + "perl": { + "lib_name": "perl", + "sections_number": "13.2", + "lib_description": "Perl库:开发文件用于开发嵌入Perl解释器的应用程序的文件。", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + }, + "alias": [ + { + "name": "perl", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + }, + { + "name": "perl-libs", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libperl.so.5.30"], + "server": ["libperl.so.5.28"] + } + } + } + }, + "##章节名": "14 编程开发库", + "development": { + "description": { + "chapters_number": "14", + "chapters_Name": "编程开发" + }, + "packages": { + "libxml2": { + "lib_name": "libxml2", + "sections_number": "14.1", + "lib_description": "Libxml2 是一个xml的c语言版的解析器", + "version": { + "desktop": "2.9.4", + "server": "2.9.7" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxml2.so.2"], + "server": ["libxml2.so.2"] + } + }, + "libunwind": { + "lib_name": "libunwind", + "sections_number": "14.2", + "lib_description": "可移植且高效的 C 编程接口 (API),用于确定程序的调用链。", + "version": { + "desktop": "1.2.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libunwind.so.8", + "libunwind-coredump.so.0"], + "server": ["libunwind.so.8", + "libunwind-coredump.so.0"] + } + } + } + }, + "##章节名": "15 基础计算库", + "basic_calculation": { + "description": { + "chapters_number": "15", + "chapters_Name": "基础计算" + }, + "packages": { + "orbit2": { + "lib_name": "orbit2", + "sections_number": "15.1", + "lib_description": "高性能CORBA实现CORBA:一种使程序对象能够在不同的应用程序之间通信、发送请求和接收回复的体系结构,而不管它们的编程语言、操作系统或网络位置如何。", + "version": { + "desktop": "", + "server": "2.14.19" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libORBit-2.so", + "libORBitCosNaming-2.so.0", + "libORBit-imodule-2.so"] + } + }, + "atlas": { + "lib_name": "atlas", + "sections_number": "15.2", + "lib_description": "自动调整线性代数软件:是一种自动生成和优化数值软件的方法。目前,ATLAS为被称为基本线性代数子程序(BLAS)的完整线性代数内核集和LAPACK库中的线性代数例程子集提供了优化版本。", + "version": { + "desktop": "", + "server": "3.10.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libsatlas.so.3", + "libtatlas.so.3"] + } + }, + "lapack": { + "lib_name": "lapack", + "sections_number": "15.3", + "lib_description": "基本线性代数参考实现BLAS(基本线性代数子程序)是一组用于大多数基本向量和矩阵运算的高效例程。它们被广泛用作其他高质量线性代数软件的基础", + "version": { + "desktop": "", + "server": "3.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libblas.so.3", + "liblapack.so.3", + "liblapacke.so.3"] + } + } + } + }, + "##章节名": "16 存储库", + "storage": { + "description": { + "chapters_number": "16", + "chapters_Name": "存储" + }, + "packages": { + "ceph": { + "lib_name": "ceph", + "sections_number": "16.1", + "lib_description": "Ceph是一个开源软件定义的存储平台,它在单个分布式计算机集群上实现对象存储,并提供用于对象,块和文件级存储的3合1接口。Ceph的主要目标是实现无单点故障的完全分布式操作,可扩展到艾字节级别,并且可以免费使用。", + "version": { + "desktop": "", + "server": "12.2.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcls_cephfs.so.1", + "libcls_hello.so.1", + "libcls_journal.so.1", + "libcls_kvs.so.1", + "libcls_lock.so.1", + "libcls_log.so.1", + "libcls_lua.so.1", + "libcls_numops.so.1", + "libcls_rbd.so.1", + "libcls_refcount.so.1", + "libcls_rgw.so.1", + "libcls_sdk.so.1", + "libcls_timeindex.so.1", + "libcls_user.so.1", + "libcls_version.so.1", + "libceph_snappy.so.2", + "libceph_zlib.so", + "libceph_zstd.so", + "libec_jerasure.so", + "libec_jerasure_generic.so", + "libec_lrc.so", + "libec_shec.so", + "libec_shec_generic.so", + "libosd_tp.so", + "libos_tp.so"] + } + } + } + }, + "##章节名": "17 虚拟化库", + "virtualization": { + "description": { + "chapters_number": "17", + "chapters_Name": "虚拟化" + }, + "packages": { + "libvirt": { + "lib_name": "libvirt", + "sections_number": "17.1", + "lib_description": "用于管理虚拟化平台的开源的API,后台程序和管理工具。", + "version": { + "desktop": "", + "server": "5.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libvirt-admin.so.0", + "libvirt-lxc.so.0", + "libvirt-qemu.so.0", + "libvirt.so.0", + "libvirt_driver_interface.so", + "libvirt_driver_network.so", + "libvirt_driver_nodedev.so", + "libvirt_driver_nwfilter.so", + "libvirt_driver_qemu.so", + "libvirt_driver_secret.so", + "libvirt_driver_storage.so", + "lockd.so", + "libvirt_storage_backend_disk.so", + "libvirt_storage_backend_fs.so", + "libvirt_storage_backend_iscsi.so", + "libvirt_storage_backend_iscsi-direct.so", + "libvirt_storage_backend_logical.so", + "libvirt_storage_backend_mpath.so", + "libvirt_storage_backend_rbd.so", + "libvirt_storage_backend_scsi.so", + "libvirt_storage_backend_gluster.so", + "libvirt_storage_file_gluster.so", + "libvirt_storage_file_fs.so"] + } + } + } + }, + "##章节名": "18 集群高可用库", + "high_availability": { + "description": { + "chapters_number": "18", + "chapters_Name": "集群高可用" + }, + "packages": { + "pacemaker": { + "lib_name": "pacemaker", + "sections_number": "18.1", + "lib_description": "Pacemaker是一种先进的、可扩展的高可用性集群资源管理器", + "version": { + "desktop": "", + "server": "2.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcib.so.27", + "libcrmcommon.so.34", + "libcrmservice.so.28", + "liblrmd.so.28", + "libpacemaker.so.1", + "libstonithd.so.26", + "libpe_rules.so.26", + "libpe_status.so.28"] + } + }, + "corosync": { + "lib_name": "corosync", + "sections_number": "18.2", + "lib_description": "Corosync 集群引擎和应用程序编程接口", + "version": { + "desktop": "", + "server": "3.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcfg.so.7", + "libcmap.so.4", + "libcorosync_common.so.4", + "libcpg.so.4", + "libquorum.so.5", + "libsam.so.4", + "libvotequorum.so.8"] + } + } + } + } + } + } +} diff --git a/Jsons/lib_list_1.0I-20220914-uos.json b/Jsons/lib_list_1.0I-20220914-uos.json new file mode 100644 index 0000000000000000000000000000000000000000..0f95803d915b14156a8ee09b5d999687e9cf84d2 --- /dev/null +++ b/Jsons/lib_list_1.0I-20220914-uos.json @@ -0,0 +1,5918 @@ +{ + "std_description": { + "std_name": "操作系统应用编程接口", + "std_number": "T/CESA-XXXX-2022", + "##std_version": "标准的版本标识,仅供作为本json描述文件的标识使用,由标准版本号+类别组成,标准第一版为1.0,勘误增加小版本号如1.1,标准修订增加大版本号2.0;", + "##std_version": "标准类别用1位大写字母,I表示团标,S电子信息行标,G表示国标", + "std_version": "1.0I", + "etc": "这是《操作系统应用编程接口》标准运行库描述文件,是《操作系统应用编程接口》标准符合性测试工具的组成部分;" + }, + "CopyRight": { + "License": "本文件遵循木兰协议xxxxxx", + "comment": "", + "Author": "贡献者:XXX@cesi,xxx@uitech,xxx@huawei,xxx@kylinos" + }, + "##libs": "标准规定动库包", + "libs": { + "##libs_location": "查询共享对象库的路径,与标准规定了文件系统层次结构保持一致", + "lib_location": [ + "/lib", + "/lib64", + "/usr/lib" + ], + "category": { + "##章节名": "7 基础库", + "base": { + "description": { + "##chapters_number": "库对应标准章号,做完日志或错误等输出记录标识,可用于反查标准", + "chapters_number": "7", + "chapters_Name": "基础" + }, + "packages": { + "##glibc": "包名,考虑到编译后名称二进制安装包可能会存在差异,一般以源码包去命名,做完匹配符,用以检查安装的运行库是否存在,同aliasname。后面不在赘述", + "glibc": { + "##lib_name": "包名,一般与外部名称应该一致", + "lib_name": "glibc", + "##sections_number": "库包对应标准节号,当符合性检查出现错误或警告时,可用于标准反查", + "sections_number": "7.1", + "##lib_description": "库的介绍,可能会被删除,仅作为识读使用,不参与符合性检查,值可以置空", + "lib_description": "该软件包包括标准C库的共享版本以及标准数学库,以及其他许多库。", + "##version": "最低版本要求,'desktop_version':桌面OS,'server_version',服务器OS", + "##version": "版本位次检查规则:如果版号有n位,则前n-1位不可变,第n位版本号比低于版本要求;如果版号中含有字母或特殊字符另行扩充判定规则", + "version": { + "desktop": "2.28", + "server": "2.28" + }, + "##aliasname": "包的别名,考虑由于来源差异,部分包命及版本规则与包的根社区不一致,标准特对少部分包增加别名及特点版本要求,标准名和别名应遍历查找", + "##aliaversion": "别名对应版本,如果没有特殊要求,应与标准版一致;如果别名有多个,那么版本号也应该是多个,保持一一对应??多个别名对一个版本", + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "glibc2.0", + "version": { + "desktop": "2.28", + "server": "2.28" + } + } + ], + "##necessity": "必要性", + "##necessity": "第一位:L0表示对应平台不作要求,L1长期兼容库,L2兼容库,L3试用版本;如果是L0,则第二项可以置空'';L1与L2在符合性检查没有明显区别,主要是为了区别标准的长期性承诺", + "##necessity": "第二位:basic表示基本,基本ISO安装应提供该库,expansion表示扩展,该库可以通过扩展光盘或仓库提供,当兼容性级别为'L0'时,本项可置空,不再做检查,也不再做共享对象的检查", + "##necessity": "第三位:Deprecated表示不推荐,即不推荐应用调用,为兼容历史应用要求操作系统提供的库,操作性系统符合性检查时忽略该项,应用如果依赖该类库应给出告警", + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "##share_objs": "库所要求的共享对象名清单;当'share_objs'存在时表示桌面与服务器的要求一致(或对其中一类操作系统无要求);如果不存在则表示,按操作系统类别分别比较", + "##share_objs": "只有标准要求的共享对象(或符号链接)都存在才符合标准。如果是个符号链接,应查询到对应的实体库,并查验对应其符号链是否与查询到的符号链接文件是否一致", + "share_objs": { + "desktop": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libmvec.so.1", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libnss_nisplus.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"], + "server": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libmvec.so.1", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libnss_nisplus.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"] + } + }, + "krb5": { + "lib_name": "krb5", + "sections_number": "7.2", + "lib_description": "Kerberos 网络身份验证协议", + "version": { + "desktop": "1.17", + "server": "1.17" + }, + "alias": [ + { + "name": "krb5", + "version": { + "desktop": "1.17", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkdb5.so.9", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"], + "server": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkdb5.so.9", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"] + } + }, + "elfutils": { + "lib_name": "elfutils", + "sections_number": "7.3", + "lib_description": "用于处理 ELF 文件和 DWARF 数据的应用程序集合", + "version": { + "desktop": "0.176", + "server": "0.176" + }, + "alias": [ + { + "name": "elfutils", + "version": { + "desktop": "0.176", + "server": "0.176" + } + } + ], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"], + "server": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"] + } + }, + "pam": { + "lib_name": "pam", + "sections_number": "7.4", + "lib_description": "Linux身份验证模块", + "version": { + "desktop": "1.3.1", + "server": "1.3.1" + }, + "alias": [ + { + "name": "pam", + "version": { + "desktop": "1.3.1", + "server": "1.3.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"], + "server": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"] + } + }, + "zlib": { + "lib_name": "zlib", + "sections_number": "7.5", + "lib_description": "无损数据压缩库", + "version": { + "desktop": "1.2.11", + "server": "1.2.11" + }, + "alias": [ + { + "name": "zlib", + "version": { + "desktop": "1.2.11", + "server": "1.2.11" + } + } + ], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libz.so.1"], + "server": ["libz.so.1"] + } + }, + "gcc": { + "lib_name": "gcc", + "sections_number": "7.6", + "lib_description": "GNU 的编译器集合 包括对 ,C、C++、Fortran、Object-C、Object-C++、Go、D、等的支持。当前是 GCC 8 的实现版本。", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + }, + "alias": [ + { + "name": "gcc", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-8", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-9", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-11", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libquadmath", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libstdc++", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasan.so.5", + "libatomic.so.1", + "libcc1.so", + "libcc1plugin.so", + "libcp1plugin.so", + "libgcc_s_x32.so", + "libgcc_s.so.1", + "libgdruntime.so.76", + "libgfortran.so.5", + "libgnarl-8.so.1", + "libgnarl.so", + "libgnat-8.so.1", + "libgnat.so", + "libgo.so.13", + "libgomp.so.1", + "libgphobos.so.76", + "libhsail-rt.so.0", + "libitm.so.1", + "liblsan.so.0", + "liblto_plugin.so.0", + "libmpx.so.2", + "libobjc.so.4", + "libquadmath.so.0", + "libstdc++.so.6", + "libtsan.so.0", + "libubsan.so.1"], + "server": ["libasan.so.4", + "libatomic.so.1", + "libgcc_s.so.1", + "libgfortran.so.4", + "libgomp.so.1", + "libobjc.so.4", + "libquadmath.so.0", + "libstdc++.so.6", + "libtsan.so.0"] + } + }, + "libxcrypt": { + "lib_name": "libxcrypt", + "sections_number": "7.7", + "lib_description": "实现加密和解密的库", + "version": { + "desktop": "4.4.10", + "server": "4.4.4" + }, + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypt.so.1"], + "server": ["libcrypt.so.1"] + } + }, + "audit": { + "lib_name": "audit", + "sections_number": "7.8", + "lib_description": "用于内核审计的用户空间工具", + "version": { + "desktop": "2.8.4", + "server": "2.8.4" + }, + "alias": [ + { + "name": "audit", + "version": { + "desktop": "2.28", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaudit.so.1", + "libauparse.so.0"], + "server": ["libaudit.so.1", + "libauparse.so.0"] + } + }, + "bzip2": { + "lib_name": "bzip2", + "sections_number": "7.9", + "lib_description": "高质量的数据压缩器", + "version": { + "desktop": "1.0.6", + "server": "1.0.6" + }, + "alias": [ + { + "name": "bzip2", + "version": { + "desktop": "1.0.6", + "server": "1.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbz2.so.1"], + "server": ["libbz2.so.1"] + } + }, + "dbus": { + "lib_name": "dbus", + "sections_number": "7.10", + "lib_description": "消息总线系统,用于应用间通信。提供系统留守进程和用户登录留守进程", + "version": { + "desktop": "1.12.16", + "server": "1.12.8" + }, + "alias": [ + { + "name": "dbus", + "version": { + "desktop": "1.12.16", + "server": "1.12.16" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-1.so.3"], + "server": ["libdbus-1.so.3"] + } + }, + "expat": { + "lib_name": "expat", + "sections_number": "7.11", + "lib_description": "expat 是一个用 C 语言编写的面向流的 XML 解析器库", + "version": { + "desktop": "2.2.6", + "server": "2.2.6" + }, + "alias": [ + { + "name": "expat", + "version": { + "desktop": "2.2.6", + "server": "2.2.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libexpat.so.1"], + "server": ["libexpat.so.1"] + } + }, + "glib2": { + "lib_name": "glib2", + "sections_number": "7.12", + "lib_description": "构成 GTK+ 和 GNOME 等项目基础的核心库", + "version": { + "desktop": "2.58", + "server": "2.56" + }, + "alias": [ + { + "name": "glib2.0", + "version": { + "desktop": "2.58", + "server": "2.56" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"], + "server": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"] + } + }, + "gmp": { + "lib_name": "gmp", + "sections_number": "7.13", + "lib_description": "一个 GNU 多精度算术库", + "version": { + "desktop": "6.1.2", + "server": "6.1.2" + }, + "alias": [ + { + "name": "gmp", + "version": { + "desktop": "6.1.2", + "server": "6.1.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgmp.so.10"], + "server": ["libgmp.so.10"] + } + }, + "libidn2": { + "lib_name": "libidn2", + "sections_number": "7.14", + "lib_description": "GNU libidn2是GNU libidn的后继者。standalone lib。包含IDNA2008,Punycode 和 Unicode TR46 的实现。通过IETF国际域名(IDN)实施字符串预处理、Punycode和IDNA规格定义的包", + "version": { + "desktop": "2.0.5", + "server": "2.0.5" + }, + "alias": [ + { + "name": "libidn2", + "version": { + "desktop": "2.0.5", + "server": "2.0.5" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libidn2.so.0"], + "server": ["libidn2.so.0"] + } + }, + "ncurses": { + "lib_name": "ncurses", + "sections_number": "7.15", + "lib_description": "终端控制库", + "version": { + "desktop": "6.1.1", + "server": "6.1" + }, + "alias": [ + { + "name": "ncurses", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"], + "server": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"] + } + }, + "xz": { + "lib_name": "xz", + "sections_number": "7.16", + "lib_description": "一款免费的通用数据压缩软件,采用 LZMA2 算法", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + }, + "alias": [ + { + "name": "xz-utils", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liblzma.so.5"], + "server": ["liblzma.so.5"] + } + }, + "libcap": { + "lib_name": "libcap", + "sections_number": "7.17", + "lib_description": "这是一个用于获取和设置 POSIX.1e(以前的 POSIX 6)草案 15 功能的库。", + "version": { + "desktop": "2.25", + "server": "2.26" + }, + "alias": [ + { + "name": "libcap2", + "version": { + "desktop": "2.25", + "server": "2.26" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcap.so.2"], + "server": ["libcap.so.2"] + } + }, + "popt": { + "lib_name": "popt", + "sections_number": "7.18", + "lib_description": "解析命令行选项的库。它不使用全局变量,因此可以在解析argv时进行多次传递;它可以解析任意argv样式元素的数组,允许解析来自任何源的命令行字符串;它提供了选项别名的标准方法;它可以执行外部选项过滤器;它可以自动为应用程序生成帮助和使用信息。", + "version": { + "desktop": "1.16", + "server": "1.16" + }, + "alias": [ + { + "name": "popt", + "version": { + "desktop": "1.16", + "server": "1.16" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpopt.so.0"], + "server": ["libpopt.so.0"] + } + }, + "libnl3": { + "lib_name": "libnl3", + "sections_number": "7.19", + "lib_description": "libnl 套件是一组库,为基于 netlink 协议的 Linux 内核接口提供 API。", + "version": { + "desktop": "3.4.0", + "server": "3.5.0" + }, + "alias": [ + { + "name": "libnl3", + "version": { + "desktop": "3.4.0", + "server": "3.5.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"], + "server": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"] + } + }, + "libsecret": { + "lib_name": "libsecret", + "sections_number": "7.20", + "lib_description": "libsecret 是一个用于存储和检索密码和其他机密的库。它使用 D-Bus 与“Secret Service”通信。gnome-keyring 和 ksecretservice 都是 Secret Service 的实现。", + "version": { + "desktop": "0.18.7", + "server": "0.18.6" + }, + "alias": [ + { + "name": "libsecret", + "version": { + "desktop": "0.18.7", + "server": "0.18.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsecret-1.so.0"], + "server": ["libsecret-1.so.0"] + } + }, + "libIDL": { + "lib_name": "libIDL", + "sections_number": "7.21", + "lib_description": "libIDL是一个包含接口定义语言文件的库 。这是定义可移植接口的规范。", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + }, + "alias": [ + { + "name": "libidl", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libIDL-2.so.0"], + "server": ["libIDL-2.so.0"] + } + }, + "libtalloc": { + "lib_name": "libtalloc", + "sections_number": "7.22", + "lib_description": "libtalloc 包提供了一个使用析构函数实现分层内存分配器的库。", + "version": { + "desktop": "2.1.14", + "server": "2.2.0" + }, + "alias": [ + { + "name": "talloc", + "version": { + "desktop": "2.1.14", + "server": "2.2.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtalloc.so.2"], + "server": ["libtalloc.so.2"] + } + }, + "libtevent": { + "lib_name": "libtevent", + "sections_number": "7.23", + "lib_description": "libtevent 包提供 Tevent,一个基于talloc 内存管理库的事件系统。Tevent 支持多种事件类型,包括定时器、信号和经典的文件描述符事件。Tevent 还提供帮助器来处理提供 tevent_req(Tevent 请求)函数的异步代码。", + "version": { + "desktop": "0.9.37", + "server": "0.10.0" + }, + "alias": [ + { + "name": "tevent", + "version": { + "desktop": "0.9.37", + "server": "0.10.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtevent.so.0"], + "server": ["libtevent.so.0"] + } + }, + "readline": { + "lib_name": "readline", + "sections_number": "7.24", + "lib_description": "包括GNU readline库 和历史库。GNU readline 库有助于在需要提供命令行界面的离散程序之间保持用户界面的一致性。 GNU 历史库提供了一个一致的用户界面,用于调用以前键入的输入行。", + "version": { + "desktop": "7.0", + "server": "7.0" + }, + "alias": [ + { + "name": "readline", + "version": { + "desktop": "7.0", + "server": "7.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libhistory.so.8", + "libreadline.so.8"], + "server": ["libhistory.so.7", + "libreadline.so.7"] + } + }, + "libmodulemd": { + "lib_name": "libmodulemd", + "sections_number": "7.25", + "lib_description": "用于操作模块元数据文件的C函数库", + "version": { + "desktop": "", + "server": "1.6.4" + }, + "alias": [ + { + "name": "", + "version": { + "desktop": "uos-11", + "server": "1.6.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libmodulemd.so.1"] + } + }, + "dbus-glib": { + "lib_name": "dbus-glib", + "sections_number": "7.26", + "lib_description": "对DBus的GNOME GLib接口工具及函数库", + "version": { + "desktop": "0.110", + "server": "0.110" + }, + "alias": [ + { + "name": "dbus-glib", + "version": { + "desktop": "0.110", + "server": "0.110" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-glib-1.so.2"], + "server": [] + } + }, + "attr": { + "lib_name": "attr", + "sections_number": "7.27", + "lib_description": "文件系统及文件扩展属性管理功能库", + "version": { + "desktop": "2.4.48", + "server": "2.4.48" + }, + "alias": [ + { + "name": "attr", + "version": { + "desktop": "2.4.48", + "server": "2.4.48" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libattr.so.1"], + "server": [] + } + }, + "libevent": { + "lib_name": "libevent", + "sections_number": "7.28", + "lib_description": "当文件描述符上发生特定事件或达到超时后, libevent API 提供了一种执行回调函数的机制。此外,libevent还支持由于信号或常规超时而引起的回调。libevent旨在替换事件驱动网络服务器中的事件循环。", + "version": { + "desktop": "2.1.8", + "server": "2.1.8" + }, + "alias": [ + { + "name": "libevent", + "version": { + "desktop": "2.1.8", + "server": "2.1.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"], + "server": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"] + } + }, + "accountsservice": { + "lib_name": "accountsservice", + "sections_number": "7.29", + "lib_description": "用户管理(账户维护)", + "version": { + "desktop": "0.6.45", + "server": "0.6.45" + }, + "alias": [ + { + "name": "accountsservice", + "version": { + "desktop": "0.6.45", + "server": "0.6.45" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaccountsservice.so.0"], + "server": ["libaccountsservice.so.0"] + } + }, + "libmpc": { + "lib_name": "libmpc", + "sections_number": "7.30", + "lib_description": "用于多精度复杂算术的 C 库", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + }, + "alias": [ + { + "name": "libmpc", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpc.so.3"], + "server": ["libmpc.so.3"] + } + }, + "mpfr": { + "lib_name": "mpfr", + "sections_number": "7.31", + "lib_description": "多精度浮点计算 C 库", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + }, + "alias": [ + { + "name": "mpfr4", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpfr.so.6"], + "server": ["libmpfr.so.4"] + } + }, + "ndctl": { + "lib_name": "ndctl", + "sections_number": "7.32", + "lib_description": "DAX(直接访问)协议支持工具", + "version": { + "desktop": "63", + "server": "63" + }, + "alias": [ + { + "name": "ndctl", + "version": { + "desktop": "63", + "server": "63" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdaxctl.so.1"], + "server": ["libdaxctl.so.1"] + } + }, + "file": { + "lib_name": "file", + "sections_number": "7.33", + "lib_description": "识别特定文件类型的工具", + "version": { + "desktop": "5.35", + "server": "5.33" + }, + "alias": [ + { + "name": "file", + "version": { + "desktop": "5.35", + "server": "5.33" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmagic.so.1"], + "server": ["libmagic.so.1"] + } + }, + "gdbm": { + "lib_name": "gdbm", + "sections_number": "7.34", + "lib_description": "一个使用可扩展散列的数据库函数库", + "version": { + "desktop": "1.18", + "server": "1.18" + }, + "alias": [ + { + "name": "gdbm", + "version": { + "desktop": "1.18", + "server": "1.18" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdbm.so.6", + "libgdbm_compat.so.4"], + "server": ["libgdbm.so.6", + "libgdbm_compat.so.4"] + } + }, + "keyutils": { + "lib_name": "keyutils", + "sections_number": "7.35", + "lib_description": "Linux 密钥管理程序", + "version": { + "desktop": "1.6", + "server": "1.5.10" + }, + "alias": [ + { + "name": "keyutils", + "version": { + "desktop": "1.6", + "server": "1.5.10" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libkeyutils.so.1"], + "server": ["libkeyutils.so.1"] + } + }, + "libedit": { + "lib_name": "libedit", + "sections_number": "7.36", + "lib_description": "提供通用行编辑、历史记录和标记功能", + "version": { + "desktop": "3.1", + "server": "3.1" + }, + "alias": [ + { + "name": "libedit", + "version": { + "desktop": "3.1", + "server": "3.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libedit.so.2"], + "server": ["libedit.so.0"] + } + }, + "kcodecs": { + "lib_name": "kcodecs", + "sections_number": "7.37", + "lib_description": "操作字符串的方法的集合KCodecs提供了一组操作字符串的方法使用不同的编码。", + "version": { + "desktop": "5.54.0", + "server": "" + }, + "alias": [ + { + "name": "kcodecs", + "version": { + "desktop": "5.54.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libKF5Codecs.so.5"], + "server": [] + } + }, + "fcitx": { + "lib_name": "fcitx", + "sections_number": "7.38", + "lib_description": "fcitx输入法的核心功能库", + "version": { + "desktop": "4.2.9", + "server": "" + }, + "alias": [ + { + "name": "fcitx", + "version": { + "desktop": "4.2.9", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfcitx-core.so.0", + "libfcitx-gclient.so.1", + "libfcitx-utils.so.0"], + "server": [] + } + }, + "libsdl-ttf2.0": { + "lib_name": "libsdl-ttf2.0", + "sections_number": "7.39", + "lib_description": "允许SDL应用程序中使用TrueType字体", + "version": { + "desktop": "2.0.11", + "server": "" + }, + "alias": [ + { + "name": "sdl-ttf2.0", + "version": { + "desktop": "2.0.11", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL_ttf-2.0.so.0"], + "server": [] + } + } + } + }, + "##章节名": "8 系统安全库", + "security": { + "description": { + "chapters_number": "8", + "chapters_Name": "系统安全" + }, + "packages": { + "acl": { + "lib_name": "acl", + "sections_number": "8.1", + "lib_description": "管理访问控制列表。", + "version": { + "desktop": "2.2.53", + "server": "2.2.53" + }, + "alias": [ + { + "name": "acl", + "version": { + "desktop": "2.2.53", + "server": "2.2.53" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libacl.so.1"], + "server": ["libacl.so.1"] + } + }, + "cyrus-sasl": { + "lib_name": "cyrus-sasl", + "sections_number": "8.2", + "lib_description": "SASL是简单的权限验证和安全层,可添加基于连接的协议的验证支持。", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + }, + "alias": [ + { + "name": "cyrus-sasl2", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsasl2.so.2", + "libanonymous.so.2", + "libsasldb.so.2", + "libcrammd5.so.2", + "ibdigestmd5.so.2", + "libgs2.so.2", + "libgssapov2.so.2", + "libldapdb.so.2", + "liblogin.so.2", + "libntlm.so.2", + "libplain.so.2", + "libscram.so.2"], + "server": ["libsasl2.so.3", + "libanonymous.so.3", + "libsasldb.so.3", + "libcrammd5.so.3", + "ibdigestmd5.so.3", + "libgs2.so.3", + "libgssapov2.so.3", + "libldapdb.so.3", + "liblogin.so.3", + "libntlm.so.3", + "libplain.so.3", + "libscram.so.3"] + } + }, + "libgcrypt": { + "lib_name": "libgcrypt", + "sections_number": "8.3", + "lib_description": "通用加密库。", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + }, + "alias": [ + { + "name": "libgcrypt20", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgcrypt.so.20"], + "server": ["libgcrypt.so.20"] + } + }, + "liboauth": { + "lib_name": "liboauth", + "sections_number": "8.4", + "lib_description": "oauth是一种关于授权方式的协议标准。", + "version": { + "desktop": "1.0.3", + "server": "1.0.3" + }, + "alias": [ + { + "name": "liboauth", + "version": { + "desktop": "1.0.3", + "server": "1.0.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liboauth.so.0"], + "server": ["liboauth.so.0"] + } + }, + "gnutls": { + "lib_name": "gnutls", + "sections_number": "8.5", + "lib_description": "gnutls全称 GNU TransportLayerSecurity Library,即基于GNU版权协议的传输层安全协议,是wget支持https中的ssl协议的基础库。", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + }, + "alias": [ + { + "name": "gnutls28", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"], + "server": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"] + } + }, + "libssh": { + "lib_name": "libssh", + "sections_number": "8.6", + "lib_description": "libssh 是一个用以访问SSH服务的C语言开发包,通过它可以执行远程命令、文件传输,同时为远程的程序提供安全的传输通道。", + "version": { + "desktop": "0.8.7", + "server": "0.8.3" + }, + "alias": [ + { + "name": "libssh", + "version": { + "desktop": "0.8.7", + "server": "0.8.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh.so.4"], + "server": ["libssh.so.4", + "libssh_threads.so.4"] + } + }, + "libssh2": { + "lib_name": "libssh2", + "sections_number": "8.7", + "lib_description": "libssh2是一个C 函数库,用来实现SSH2协议。主要功能:Key Exchange Methods,Hostkey Type,Ciphers,Compression Schemes,MAC hashes等", + "version": { + "desktop": "1.8.0", + "server": "1.8.0" + }, + "alias": [ + { + "name": "libssh2", + "version": { + "desktop": "1.8.0", + "server": "1.8.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh2.so.1"], + "server": ["libssh2.so.1"] + } + }, + "cracklib": { + "lib_name": "cracklib", + "sections_number": "8.8", + "lib_description": "密码安全测试工具。", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + }, + "alias": [ + { + "name": "cracklib2", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrack.so.2"], + "server": ["libcrack.so.2"] + } + }, + "nspr": { + "lib_name": "nspr", + "sections_number": "8.9", + "lib_description": "包含线程、文件和网络I/O、内存管理等的运行时库。", + "version": { + "desktop": "4.20.1", + "server": "4.20.0" + }, + "alias": [ + { + "name": "nspr", + "version": { + "desktop": "4.20.0", + "server": "4.20.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnspr4.so", + "libplc4.so", + "libplds4.so"], + "server": ["libnspr4.so", + "libplc4.so", + "libplds4.so"] + } + }, + "openssl": { + "lib_name": "openssl", + "sections_number": "8.10", + "lib_description": "具有 TLS 实现的通用加密库中的实用程序,添加国密算法SM2 SM3 SMS4", + "version": { + "desktop": "1.1.1d", + "server": "1.0.2k" + }, + "alias": [ + { + "name": "openssl", + "version": { + "desktop": "1.1.1d", + "server": "1.0.2k" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypto.so.1.1", + "libssl.so.1.1"], + "server": ["libcrypto.so.1.1", + "libssl.so.1.1"] + } + } + } + }, + "##章节名": "9 网络服务库", + "network": { + "description": { + "chapters_number": "9", + "chapters_Name": "网络服务" + }, + "packages": { + "Networkmanager": { + "lib_name": "networkmanager", + "sections_number": "9.1", + "lib_description": "网络链接管理器和用户应用程序。", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + }, + "alias": [ + { + "name": "network-manager", + "version": { + "desktop": "1.14,6", + "server": "1.16.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm.so.0", + "libnm-wwan.so", + "nm-pppd-plugin.so"], + "server": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-ovs.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm-settings-plugin-ifcfg-rh.so", + "libnm.so.0", + "libnm-wwan.so"] + } + }, + "sssd": { + "lib_name": "sssd", + "sections_number": "9.2", + "lib_description": "管理对远程目录的访问和权限验证", + "version": { + "desktop": "1.16.3", + "server": "1.16.3" + }, + "alias": [ + { + "name": "sssd", + "version": { + "desktop": "1.16.3", + "server": "1.16.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"], + "server": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"] + } + }, + "libtirpc": { + "lib_name": "libtirpc", + "sections_number": "9.3", + "lib_description": "libtirpc包包含支持使用远程过程调用 (RPC) API 的程序的库 。", + "version": { + "desktop": "1.1.4", + "server": "1.1.4" + }, + "alias": [ + { + "name": "libtirpc", + "version": { + "desktop": "1.1.4", + "server": "1.1.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtirpc.so.3"], + "server": ["libtirpc.so.3"] + } + }, + "nss": { + "lib_name": "nss", + "sections_number": "9.4", + "lib_description": "网络安全服务。", + "version": { + "desktop": "3.42.1", + "server": "3.40.1" + }, + "alias": [ + { + "name": "nss", + "version": { + "desktop": "3.42.1", + "server": "3.40.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnss3.so", + "libsmime3.so", + "libssl3.so"], + "server": ["libnss3.so", + "libnsssysinit.so", + "libsmime3.so", + "libssl3.so"] + } + }, + "libpcap": { + "lib_name": "libpcap", + "sections_number": "9.5", + "lib_description": "libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。著名的软件TCPDUMP就是在libpcap的的基础上开发而成的", + "version": { + "desktop": "1.8.1", + "server": "1.9.0" + }, + "alias": [ + { + "name": "libpcap", + "version": { + "desktop": "1.8.1", + "server": "1.9.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpcap.so.1", "libpcap.so.0.8"], + "server": ["libpcap.so.1"] + } + }, + "curl": { + "lib_name": "curl", + "sections_number": "9.6", + "lib_description": "命令行或脚本数据传输工具", + "version": { + "desktop": "7.64.1", + "server": "7.61.1" + }, + "alias": [ + { + "name": "curl", + "version": { + "desktop": "7.064.1", + "server": "7.61.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcurl.so.4"], + "server": ["libcurl.so.4"] + } + }, + "iptables": { + "lib_name": "iptables", + "sections_number": "9.7", + "lib_description": "IP包过滤管理工具", + "version": { + "desktop": "1.8.2", + "server": "1.8.1" + }, + "alias": [ + { + "name": "iptables", + "version": { + "desktop": "1.8.2", + "server": "1.8.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.2", + "libip6tc.so.2", + "libxtables.so.12"], + "server": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.0", + "libip6tc.so.0", + "libiptc.so.0", + "libxtables.so.12"] + } + }, + "bind": { + "lib_name": "bind", + "sections_number": "9.8", + "lib_description": "包括操作 DNS 服务器的组件", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + }, + "alias": [ + { + "name": "bind9", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbind9.so.161", + "libisccc.so.161", + "liblwres.so.161"], + "server": ["libbind9.so.160", + "libisccc.so.160", + "liblwres.so.160"] + } + }, + "cifs-utils": { + "lib_name": "cifs-utils", + "sections_number": "9.9", + "lib_description": "通用网络文件系统。", + "version": { + "desktop": "6.8", + "server": "6.8" + }, + "alias": [ + { + "name": "cifs-utils", + "version": { + "desktop": "2:6.8.1-1+security", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["idmapwb.so", + "pam_cifscreds.so"], + "server": ["idmapwb.so", + "pam_cifscreds.so"] + } + }, + "atkmm": { + "lib_name": "atkmm", + "sections_number": "9.10", + "lib_description": "atk库的C++绑定。", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + }, + "alias": [ + { + "name": "atkmm1.6", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatkmm-1.6.so.11"], + "server": ["libatkmm-1.6.so.11"] + } + }, + "avahi": { + "lib_name": "avahi", + "sections_number": "9.11", + "lib_description": "通过mDNS/DNS-SD协议发现本地网络上的服务。", + "version": { + "desktop": "0.7", + "server": "" + }, + "alias": [ + { + "name": "avahi", + "version": { + "desktop": "0.7", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavahi-core.so.7", + "libavahi-glib.so.1", + "libavahi-client.so.3", + "libavahi-common.so.3", + "libavahi-gobject.so.0", + "libavahi-ui-gtk3.so.0"], + "server": [] + } + }, + "dhcp": { + "lib_name": "dhcp", + "sections_number": "9.12", + "lib_description": "动态分配DHCP", + "version": { + "desktop": "", + "server": "4.3.6" + }, + "alias": [ + { + "name": "dhcp", + "version": { + "desktop": "", + "server": "4.3.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libdhcpctl.so", + "libomapi.so"] + } + }, + "iproute": { + "lib_name": "iproute", + "sections_number": "9.13", + "lib_description": "命令行网络工具", + "version": { + "desktop": "4.20.0", + "server": "" + }, + "alias": [ + { + "name": "iproute2", + "version": { + "desktop": "4.20.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["m_ipt.so"], + "server": [] + } + } + } + }, + "##章节名": "10 图形库", + "graphic": { + "description": { + "chapters_number": "10", + "chapters_Name": "图形" + }, + "packages": { + "atk": { + "lib_name": "atk", + "sections_number": "10.1", + "lib_description": "提供给应用程序的可访问性的编程接口。", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + }, + "alias": [ + { + "name": "atk1.0", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-1.0.so.0"], + "server": ["libatk-1.0.so.0"] + } + }, + "gtk3": { + "lib_name": "gtk3", + "sections_number": "10.2", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": "3.24.5", + "server": "3.22.30" + }, + "alias": [ + { + "name": "gtk+3.0", + "version": { + "desktop": "3.24.5", + "server": "3.22.30" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libprintbackend-cloudprint.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"], + "server": ["libprintbackend-cloudprint.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"] + } + }, + "gtk2": { + "lib_name": "gtk2", + "sections_number": "10.3", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + }, + "alias": [ + { + "name": "gtk+2.0", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"], + "server": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"] + } + }, + "libICE": { + "lib_name": "libICE", + "sections_number": "10.4", + "lib_description": "X.Org X11 ICE 运行时库", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + }, + "alias": [ + { + "name": "libice", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libICE.so.6"], + "server": ["libICE.so.6"] + } + }, + "libxext": { + "lib_name": "libxext", + "sections_number": "10.5", + "lib_description": "X.Org 项目提供了 X Window System.X.Org X11 libXext 的开源实现,包含运行时库。", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + }, + "alias": [ + { + "name": "libxext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXext.so.6"], + "server": ["libXext.so.6"] + } + }, + "libpng1.6": { + "lib_name": "libpng1.6", + "sections_number": "10.6", + "lib_description": "libpng 包包含其他程序用于读取和写入 PNG 格式文件的库。", + "version": { + "desktop": "1.6.36", + "server": "" + }, + "alias": [ + { + "name": "libpng1.6", + "version": { + "desktop": "1.6.36", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng16.so.16"], + "server": ["libpng16.so.16"] + } + }, + "libx11": { + "lib_name": "libx11", + "sections_number": "10.7", + "lib_description": "Core X11 协议客户端库", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + }, + "alias": [ + { + "name": "libx11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libX11-xcb.so.1", + "libX11.so.6"], + "server": ["libX11-xcb.so.1", + "libX11.so.6"] + } + }, + "libsdl2": { + "lib_name": "libsdl2", + "sections_number": "10.8", + "lib_description": "SDL的重构版", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + }, + "alias": [ + { + "name": "libsdl2", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL2-2.0.so.0"], + "server": ["libSDL2-2.0.so.0"] + } + }, + "libxau": { + "lib_name": "libxau", + "sections_number": "10.9", + "lib_description": "用于提供对 X Window 的单独访问系统显示。", + "version": { + "desktop": "1.0.8", + "server": "" + }, + "alias": [ + { + "name": "libxau", + "version": { + "desktop": "1.0.8", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXau.so.6"], + "server": [] + } + }, + "libxaw": { + "lib_name": "libxaw", + "sections_number": "10.10", + "lib_description": "Xaw 是一个基于 X Toolkit Intrinsics (Xt) 库的小部件集。", + "version": { + "desktop": "1.0.13", + "server": "" + }, + "alias": [ + { + "name": "libxaw", + "version": { + "desktop": "1.0.13", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXaw.so.7"], + "server": [] + } + }, + "fontconfig": { + "lib_name": "fontconfig", + "sections_number": "10.11", + "lib_description": "Fontconfig 根据应用程序指定的要求提供不同的字体。", + "version": { + "desktop": "2.13.1", + "server": "" + }, + "alias": [ + { + "name": "fontconfig", + "version": { + "desktop": "2.13.1", + "server": "" + } + } + + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontconfig.so.1"], + "server": [] + } + }, + "freetype": { + "lib_name": "freetype", + "sections_number": "10.12", + "lib_description": "字体渲染软件库。", + "version": { + "desktop": "2.9.1", + "server": "" + }, + "alias": [ + { + "name": "freetype", + "version": { + "desktop": "2.9.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfreetype.so.6"], + "server": [] + } + }, + "tiff": { + "lib_name": "tiff", + "sections_number": "10.13", + "lib_description": "支持标记图像文件格式。", + "version": { + "desktop": "4.1.0", + "server": "" + }, + "alias": [ + { + "name": "tiff", + "version": { + "desktop": "4.1.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtiff.so.5", + "libtiffxx.so.5"], + "server": [] + } + }, + "libxpm": { + "lib_name": "libxpm", + "sections_number": "10.14", + "lib_description": "X.Org X11 libXpm 运行时库", + "version": { + "desktop": "3.5.12", + "server": "" + }, + "alias": [ + { + "name": "libxpm", + "version": { + "desktop": "3.5.12", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXpm.so.4"], + "server": [] + } + }, + "libxdmcp": { + "lib_name": "libxdmcp", + "sections_number": "10.15", + "lib_description": "X 显示管理器控制协议 (XDMCP) 提供了一个统一的自主显示器向远程主机请求登录服务的机制。", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [ + { + "name": "libxdmcp", + "version": { + "desktop": "1.1.2", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdmcp.so.6"], + "server": [] + } + }, + "libxrandr": { + "lib_name": "libxrandr", + "sections_number": "10.16", + "lib_description": "X.Org X11 libXrandr 运行时库", + "version": { + "desktop": "1.5.1", + "server": "" + }, + "alias": [ + { + "name": "libxrandr", + "version": { + "desktop": "1.5.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrandr.so.2"], + "server": [] + } + }, + "libglu": { + "lib_name": "libglu", + "sections_number": "10.17", + "lib_description": "OpenGL 实用程序库 (GLU) ,它提供了许多函数,这些函数使用基本 OpenGL 库从 OpenGL 提供的更原始的例程中提供更高级别的绘图例程。", + "version": { + "desktop": "9.0.0", + "server": "" + }, + "alias": [ + { + "name": "libglu", + "version": { + "desktop": "9.0.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libGLU.so.1"], + "server": [] + } + }, + "libdmx": { + "lib_name": "libdmx", + "sections_number": "10.18", + "lib_description": "X.Org 项目提供了 X Window 系统的开源实现。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [ + { + "name": "libdmx", + "version": { + "desktop": "1.1.4", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdmx.so.1"], + "server": ["libdmx.so.1"] + } + }, + "libdrm": { + "lib_name": "libdrm", + "sections_number": "10.19", + "lib_description": "libdrm 提供了一个用户空间库,用于在支持 ioctl 接口的操作系统上访问 DRM(直接渲染管理器)。", + "version": { + "desktop": "2.4.99", + "server": "" + }, + "alias": [ + { + "name": "libdrm", + "version": { + "desktop": "2.4.99", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdrm.so.2", + "libdrm_amdgpu.so.1", + "libdrm_intel.so.1", + "libdrm_nouveau.so.2", + "libdrm_radeon.so.1"], + "server": [] + } + }, + "libxmu": { + "lib_name": "libxmu", + "sections_number": "10.20", + "lib_description": "X.Org X11 libXmu/libXmuu 运行时库", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [ + { + "name": "libxmu", + "version": { + "desktop": "1.1.2", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXmu.so.6", + "libXmuu.so.1"], + "server": [] + } + }, + "libxcb": { + "lib_name": "libxcb", + "sections_number": "10.21", + "lib_description": "X协议C语言绑定 (XCB) ,是 Xlib 的替代品。", + "version": { + "desktop": "1.13.1", + "server": "" + }, + "alias": [ + { + "name": "libxcb", + "version": { + "desktop": "1.13.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-composite.so.0", + "libxcb-damage.so.0", + "libxcb-dpms.so.0", + "libxcb-dri2.so.0", + "libxcb-dri3.so.0", + "libxcb-glx.so.0", + "libxcb-present.so.0", + "libxcb-randr.so.0", + "libxcb-record.so.0", + "libxcb-render.so.0", + "libxcb-res.so.0", + "libxcb-screensaver.so.0", + "libxcb-shape.so.0", + "libxcb-shm.so.0", + "libxcb-sync.so.1", + "libxcb-xf86dri.so.0", + "libxcb-xfixes.so.0", + "libxcb-xinerama.so.0", + "libxcb-xinput.so.0", + "libxcb-xkb.so.1", + "libxcb-xtest.so.0", + "libxcb-xv.so.0", + "libxcb-xvmc.so.0", + "libxcb.so.1"], + "server": [] + } + }, + "libxrender": { + "lib_name": "libxrender", + "sections_number": "10.22", + "lib_description": "X.Org X11 libXrender 运行时库", + "version": { + "desktop": "0.9.10", + "server": "" + }, + "alias": [ + { + "name": "libxrender", + "version": { + "desktop": "0.9.10", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrender.so.1"], + "server": [] + } + }, + "xft": { + "lib_name": "xft", + "sections_number": "10.23", + "lib_description": "Xft 是一个将 X 应用程序与 FreeType 字体连接起来的光栅化库。", + "version": { + "desktop": "2.3.2", + "server": "" + }, + "alias": [ + { + "name": "xft", + "version": { + "desktop": "2.3.2", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXft.so.2"], + "server": [] + } + }, + "gdk-pixbuf": { + "lib_name": "gdk-pixbuf", + "sections_number": "10.24", + "lib_description": "创建图形用户界面的多平台工具包", + "version": { + "desktop": "2.38.1", + "server": "" + }, + "alias": [ + { + "name": "gdk-pixbuf", + "version": { + "desktop": "2.38.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdk_pixbuf-2.0.so.0", + "libgdk_pixbuf_xlib-2.0.so.0", + "libpixbufloader-ani.so", + "libpixbufloader-bmp.so", + "libpixbufloader-gif.so", + "libpixbufloader-icns.so", + "libpixbufloader-ico.so", + "libpixbufloader-jpeg.so", + "libpixbufloader-pnm.so", + "libpixbufloader-qtif.so", + "libpixbufloader-tga.so", + "libpixbufloader-tiff.so", + "libpixbufloader-xbm.so", + "libpixbufloader-xpm.so"], + "server": [] + } + }, + "libfontenc": { + "lib_name": "libfontenc", + "sections_number": "10.25", + "lib_description": "X.Org X11 libfontenc 运行时库。", + "version": { + "desktop": "1.1.3", + "server": "" + }, + "alias": [ + { + "name": "libfontenc", + "version": { + "desktop": "1.1.3", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontenc.so.1"], + "server": ["libfontenc.so.1"] + } + }, + "libglvnd": { + "lib_name": "libglvnd", + "sections_number": "10.26", + "lib_description": "libglvnd 是一个供应商中立的调度层,用于仲裁多个供应商之间的 OpenGL API 调用。", + "version": { + "desktop": "1.1.0", + "server": "" + }, + "alias": [ + { + "name": "libglvnd", + "version": { + "desktop": "1.1.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"], + "server": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"] + } + }, + "libjpeg-turbo": { + "lib_name": "libjpeg-turbo", + "sections_number": "10.27", + "lib_description": "libjpeg-turbo 是一个 JPEG 图像编解码器。", + "version": { + "desktop": "1.5.2", + "server": "" + }, + "alias": [ + { + "name": "libjpeg-turbo", + "version": { + "desktop": "1.5.2", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libjpeg.so.62", + "libturbojpeg.so.0"], + "server": [] + } + }, + "libpciaccess": { + "lib_name": "libpciaccess", + "sections_number": "10.28", + "lib_description": "为 X 提供访问 PCI 总线和设备的功能平台无关的方式。", + "version": { + "desktop": ".14", + "server": "" + }, + "alias": [ + { + "name": "libpciaccess", + "version": { + "desktop": "0.14-1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpciaccess.so.0"], + "server": [] + } + }, + "libpng12": { + "lib_name": "libpng12", + "sections_number": "10.29", + "lib_description": "便携式网络图形格式库", + "version": { + "desktop": "1.2.54", + "server": "" + }, + "alias": [ + { + "name": "libpng12-0", + "version": { + "desktop": "1.2.54", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng12.so"], + "server": [] + } + }, + "libraw": { + "lib_name": "libraw", + "sections_number": "10.30", + "lib_description": "LibRaw 是一个用于从数码相机读取 RAW 文件的库。", + "version": { + "desktop": "0.19.2", + "server": "" + }, + "alias": [ + { + "name": "libraw", + "version": { + "desktop": "0.19.2", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libraw.so.19"], + "server": [] + } + }, + "libSM": { + "lib_name": "libSM", + "sections_number": "10.31", + "lib_description": "libSM 软件包中包含 X.Org X11 SM 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [ + { + "name": "libsm", + "version": { + "desktop": "1.2.3-1", + "server": "7.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSM.so.6"], + "server": [] + } + }, + "libwebp": { + "lib_name": "libwebp", + "sections_number": "10.32", + "lib_description": "这是一种对数码照片图像进行有损压缩的图像格式。", + "version": { + "desktop": "0.6.1", + "server": "" + }, + "alias": [ + { + "name": "libwebp", + "version": { + "desktop": "0.6.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libwebp.so.6", + "libwebpdemux.so.2", + "libwebpmux.so.3"], + "server": [] + } + }, + "libxres": { + "lib_name": "libxres", + "sections_number": "10.33", + "lib_description": "X-Resource 是一个扩展,它允许客户端向 X 服务器查询各种资源的使用情况。", + "version": { + "desktop": "1.2.0", + "server": "" + }, + "alias": [ + { + "name": "libxres", + "version": { + "desktop": "1.2.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXRes.so.1"], + "server": [] + } + }, + "libxcomposite": { + "lib_name": "libxcomposite", + "sections_number": "10.34", + "lib_description": "X 复合扩展库", + "version": { + "desktop": "0.4.4", + "server": "" + }, + "alias": [ + { + "name": "libxcomposite", + "version": { + "desktop": "0.4.4", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXcomposite.so.1"], + "server": [] + } + }, + "libxcursor": { + "lib_name": "libxcursor", + "sections_number": "10.35", + "lib_description": "libXcursor 是一个旨在帮助定位和加载游标的库。游标可以从文件或内存中加载。", + "version": { + "desktop": "1.1.15", + "server": "" + }, + "alias": [ + { + "name": "libxcursor", + "version": { + "desktop": "1.1.15", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["ibXcursor.so.1"], + "server": [] + } + }, + "libxdamage": { + "lib_name": "libxdamage", + "sections_number": "10.36", + "lib_description": "X Damage Extension 允许应用程序跟踪可绘制对象的修改区域。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [ + { + "name": "libxdamage", + "version": { + "desktop": "1.1.4", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdamage.so.1"], + "server": [] + } + }, + "libxfixes": { + "lib_name": "libxfixes", + "sections_number": "10.37", + "lib_description": "X Fixes 扩展为应用程序提供了针对核心协议中各种限制的变通方法。", + "version": { + "desktop": "5.0.3", + "server": "" + }, + "alias": [ + { + "name": "libxfixes", + "version": { + "desktop": "5.0.3", + "server": "7.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfixes.so.3"], + "server": [] + } + }, + "libxfont": { + "lib_name": "libxfont", + "sections_number": "10.38", + "lib_description": "libXfont 提供了遗留 X11 字体系统的核心。", + "version": { + "desktop": "2.0.3", + "server": "" + }, + "alias": [ + { + "name": "libxfont", + "version": { + "desktop": "2.0.3", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfont2.so.2"], + "server": [] + } + }, + "libxi": { + "lib_name": "libxi", + "sections_number": "10.39", + "lib_description": "libXi 是 X 输入扩展的客户端库。", + "version": { + "desktop": "1.7.9", + "server": "" + }, + "alias": [ + { + "name": "libxi", + "version": { + "desktop": "1.7.9", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXi.so.6"], + "server": [] + } + }, + "libxinerama": { + "lib_name": "libxinerama", + "sections_number": "10.40", + "lib_description": "Xinerama 是 X Window System 的扩展。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [ + { + "name": "libxinerama", + "version": { + "desktop": "1.1.4", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXinerama.so.1"], + "server": [] + } + }, + "libxkbcommon": { + "lib_name": "libxkbcommon", + "sections_number": "10.41", + "lib_description": "xkbcommon 是一个用于处理键盘描述的库。", + "version": { + "desktop": "0.8.2", + "server": "" + }, + "alias": [ + { + "name": "libxkbcommon", + "version": { + "desktop": "0.8.2", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbcommon-x11.so.0"], + "server": [] + } + }, + "libxkbfile": { + "lib_name": "libxkbfile", + "sections_number": "10.42", + "lib_description": "X 服务器和实用程序使用 Libxkbfile 来解析 XKB 配置数据文件。", + "version": { + "desktop": "1.0.9", + "server": "" + }, + "alias": [ + { + "name": "libxkbfile", + "version": { + "desktop": "1.0.9", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbfile.so.1"], + "server": [] + } + }, + "libxklavier": { + "lib_name": "libxklavier", + "sections_number": "10.43", + "lib_description": "这个包是一个为 X 键盘扩展提供高级 API 的库,称为 XKB。", + "version": { + "desktop": "5.4", + "server": "" + }, + "alias": [ + { + "name": "libxklavier", + "version": { + "desktop": "5.4", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxklavier.so.16"], + "server": [] + } + }, + "cairo": { + "lib_name": "cairo", + "sections_number": "10.44", + "lib_description": "Cairo 是一个支持多种输出设备的 2D 图形库。", + "version": { + "desktop": "1.16.0", + "server": "" + }, + "alias": [ + { + "name": "cairo", + "version": { + "desktop": "1.16.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcairo-gobject.so.2", + "libcairo-script-interpreter.so.2", + "libcairo.so.2"], + "server": [] + } + }, + "fltk1.3": { + "lib_name": "fltk1.3", + "sections_number": "10.45", + "lib_description": "FLTK是一个跨平台的 C++ GUI 工具包。", + "version": { + "desktop": "1.1.10", + "server": "" + }, + "alias": [ + { + "name": "fltk1.3", + "version": { + "desktop": "1.1.10", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfltk.so.1.3", + "libfltk_forms.so.1.3", + "libfltk_gl.so.1.3", + "libfltk_images.so.1.3"], + "server": [] + } + }, + "libxss": { + "lib_name": "libxss", + "sections_number": "10.46", + "lib_description": "此包包含 X.Org X11 libXss 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [ + { + "name": "libxss", + "version": { + "desktop": "1.2.3", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXss.so.1"], + "server": [] + } + }, + "libxshmfence": { + "lib_name": "libxshmfence", + "sections_number": "10.47", + "lib_description": "X11 的共享内存栅栏,在 DRI3 中使用。", + "version": { + "desktop": "1.3", + "server": "" + }, + "alias": [ + { + "name": "libxshmfence", + "version": { + "desktop": "1.3", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxshmfence.so.1"], + "server": [] + } + }, + "libxt": { + "lib_name": "libxt", + "sections_number": "10.48", + "lib_description": "X.Org X11 libXt 运行时库", + "version": { + "desktop": "1.1.5", + "server": "" + }, + "alias": [ + { + "name": "libxt", + "version": { + "desktop": "1.1.5", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXt.so.6"], + "server": [] + } + }, + "libxtst": { + "lib_name": "libxtst", + "sections_number": "10.49", + "lib_description": "X.Org X11 libXtst 运行时库", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [ + { + "name": "libxtst", + "version": { + "desktop": "1.2.3", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXtst.so.6"], + "server": [] + } + }, + "libxvmc": { + "lib_name": "libxvmc", + "sections_number": "10.50", + "lib_description": "XvMC 是 X 窗口系统的 X 视频扩展 (Xv) 的扩展。", + "version": { + "desktop": "1.0.10", + "server": "" + }, + "alias": [ + { + "name": "libxvmc", + "version": { + "desktop": "1.0.10", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXvMC.so.1", + "libXvMCW.so.1"], + "server": [] + } + }, + "libxxf86dga": { + "lib_name": "libxxf86dga", + "sections_number": "10.51", + "lib_description": "XFree86-DGA 扩展的客户端库", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [ + { + "name": "libxxf86dga", + "version": { + "desktop": "1.1.4", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86dga.so.1"], + "server": [] + } + }, + "libxxf86vm": { + "lib_name": "libxxf86vm", + "sections_number": "10.52", + "lib_description": "为 XFree86-VidModeExtension 提供一个扩展库。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [ + { + "name": "libxxf86vm", + "version": { + "desktop": "1.1.4", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86vm.so.1"], + "server": [] + } + }, + "pango1.0": { + "lib_name": "pango1.0", + "sections_number": "10.53", + "lib_description": "Pango 是一个用于布局和渲染文本的库,重点是关于国际化。", + "version": { + "desktop": "1.42.4", + "server": "" + }, + "alias": [ + { + "name": "pango1.0", + "version": { + "desktop": "1.42.4", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpango-1.0.so.0", + "libpangocairo-1.0.so.0", + "libpangoft2-1.0.so.0", + "libpangoxft-1.0.so.0"], + "server": [] + } + }, + "pixman": { + "lib_name": "pixman", + "sections_number": "10.54", + "lib_description": "Pixman 是一个用于像素操作的低级软件库,提供图像合成和梯形光栅化等功能。", + "version": { + "desktop": "0.36.0", + "server": "" + }, + "alias": [ + { + "name": "pixman", + "version": { + "desktop": "0.36.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixman-1.so.0"], + "server": [] + } + }, + "qt4-x11": { + "lib_name": "qt4-x11", + "sections_number": "10.55", + "lib_description": "开发应用程序的软件工具包", + "version": { + "desktop": "4.8.7", + "server": "" + }, + "alias": [ + { + "name": "qt4-x11", + "version": { + "desktop": "4.8.7", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQtCLucene.so.4", + "libQtCore.so.4", + "libQtDBus.so.4", + "libQtDeclarative.so.4", + "libQtGui.so.4", + "libQtNetwork.so.4", + "libQtScript.so.4", + "libQtSql.so.4", + "libQtXmlPatterns.so.4", + "libQtXml.so.4"], + "server": [] + } + }, + "qtbase-opensource-src": { + "lib_name": "qtbase-opensource-src", + "sections_number": "10.56", + "lib_description": "Qt工具包的核心组件", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [ + { + "name": "qtbase-opensource-src", + "version": { + "desktop": "5.11.7", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5Concurrent.so.5", + "libQt5Core.so.5", + "libQt5DBus.so.5", + "libQt5Network.so.5", + "libQt5Sql.so.5", + "libQt5Test.so.5", + "libQt5Xml.so.5", + "libqconnmanbearer.so", + "libqgenericbearer.so", + "libqnmbearer.so", + "libqsqlite.so"], + "server": [] + } + }, + "qtx11extras-opensource-src": { + "lib_name": "qtx11extras-opensource-src", + "sections_number": "10.57", + "lib_description": "Qt 5 X11额外功能Qt是一个跨平台的c++应用程序框架。Qt的主要特性是它丰富的widget集,提供标准的GUI功能。这个包包含了从Qt 5中访问X11内容的库。", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [ + { + "name": "qtx11extras-opensource-src", + "version": { + "desktop": "5.11.3", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5X11Extras.so.5"], + "server": [] + } + }, + "xcb-util": { + "lib_name": "xcb-util", + "sections_number": "10.58", + "lib_description": "XCB 工具模块", + "version": { + "desktop": "0.3.8", + "server": "" + }, + "alias": [ + { + "name": "xcb-util", + "version": { + "desktop": "0.3.8", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-util.so.1"], + "server": [] + } + }, + "xcb-util-image": { + "lib_name": "xcb-util-image", + "sections_number": "10.59", + "lib_description": "提供XImage和XShmImage功能端口", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [ + { + "name": "xcb-util-image", + "version": { + "desktop": "0.4.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-image.so.0"], + "server": [] + } + }, + "xcb-util-keysyms": { + "lib_name": "xcb-util-keysyms", + "sections_number": "10.60", + "lib_description": "标准X键值对转换工具", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [ + { + "name": "xcb-util-keysyms", + "version": { + "desktop": "0.4.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-keysyms.so.1"], + "server": [] + } + }, + "xcb-util-renderutil": { + "lib_name": "xcb-util-renderutil", + "sections_number": "10.61", + "lib_description": "渲染扩展工具", + "version": { + "desktop": "0.3.9", + "server": "" + }, + "alias": [ + { + "name": "xcb-util-renderutil", + "version": { + "desktop": "0.3.9", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-render-util.so.0"], + "server": [] + } + }, + "xcb-util-wm": { + "lib_name": "xcb-util-wm", + "sections_number": "10.62", + "lib_description": "窗口管理器", + "version": { + "desktop": "0.4.1", + "server": "" + }, + "alias": [ + { + "name": "xcb-util-wm", + "version": { + "desktop": "0.4.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-ewmh.so.2", + "libxcb-icccm.so.4"], + "server": [] + } + }, + "xorg-x11-server": { + "lib_name": "xorg-x11-server", + "sections_number": "10.63", + "lib_description": "X.Org X11 X 服务器", + "version": { + "desktop": "1.20.4", + "server": "" + }, + "alias": [ + { + "name": "xorg-server", + "version": { + "desktop": "0.3.8", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["modesetting_drv.so", + "libglx.so", + "libexa.so", + "libfbdevhw.so", + "libfb.so", + "libglamoregl.so", + "libint10.so", + "libshadowfb.so", + "libshadow.so", + "libvbe.so", + "libvgahw.so", + "libwfb.so"], + "server": [] + } + }, + "libsdl1.2": { + "lib_name": "libsdl1.2", + "sections_number": "10.64", + "lib_description": "跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、 MPEG播放器和其他应用软件", + "version": { + "desktop": "1.2.15", + "server": "" + }, + "alias": [ + { + "name": "libsdl1.2", + "version": { + "desktop": "1.2.15", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL-1.2.so.0"], + "server": ["libSDL-1.2.so.0"] + } + } + } + }, + "##章节名": "11 多媒体库", + "multimedia": { + "description": { + "chapters_number": "11", + "chapters_Name": "多媒体" + }, + "packages": { + "alsa-lib": { + "lib_name": "alsa-lib", + "sections_number": "11.1", + "lib_description": "编译 ALSA 应用程序的用户空间库", + "version": { + "desktop": "1.1.8", + "server": "" + }, + "alias": [ + { + "name": "alsa-lib", + "version": { + "desktop": "1.1.8", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasound.so.2"], + "server": [] + } + }, + "ffmpeg": { + "lib_name": "ffmpeg", + "sections_number": "11.2", + "lib_description": "Linux音视频播放解决方案", + "version": { + "desktop": "4.1.8", + "server": "" + }, + "alias": [ + { + "name": "ffmpeg", + "version": { + "desktop": "4.1.8", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavcodec.so.58", + "libavfilter.so.7", + "libavformat.so.58", + "libavresample.so.4", + "libavutil.so.56", + "libpostproc.so.55", + "libswresample.so.3", + "libswscale.so.5"], + "server": [] + } + }, + "gstreamer1.0": { + "lib_name": "gstreamer1.0", + "sections_number": "11.3", + "lib_description": "GStreamer 流媒体框架运行时", + "version": { + "desktop": "1.14.4", + "server": "" + }, + "alias": [ + { + "name": "gstreamer1.0", + "version": { + "desktop": "1.14.4", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgstbase-1.0.so.0", + "libgstcheck-1.0.so.0", + "libgstcontroller-1.0.so.0", + "libgstcoreelements.so", + "libgstcoretracers.so", + "libgstnet-1.0.so.0", + "libgstreamer-1.0.so.0"], + "server": [] + } + }, + "libdvdnav": { + "lib_name": "libdvdnav", + "sections_number": "11.4", + "lib_description": "显示 DVD 视频菜单功能库", + "version": { + "desktop": "6.0.0", + "server": "" + }, + "alias": [ + { + "name": "libdvdnav", + "version": { + "desktop": "6.0.0", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdnav.so.4"], + "server": [] + } + }, + "libdvdread": { + "lib_name": "libdvdread", + "sections_number": "11.5", + "lib_description": "用于访问 DVD 磁盘的库", + "version": { + "desktop": "6.0.1", + "server": "" + }, + "alias": [ + { + "name": "libdvdread", + "version": { + "desktop": "6.0.1", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdread.so.4", "libdvdread.so.7"], + "server": [] + } + }, + "pulseaudio": { + "lib_name": "pulseaudio", + "sections_number": "11.6", + "lib_description": "Linux声音服务器", + "version": { + "desktop": "12.2", + "server": "" + }, + "alias": [ + { + "name": "pulseaudio", + "version": { + "desktop": "12.2", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libalsa-util.so", + "libavahi-wrap.so", + "libbluez5-util.so", + "libcli.so", + "libprotocol-cli.so", + "libprotocol-esound.so", + "libprotocol-http.so", + "libprotocol-native.so", + "libprotocol-simple.so", + "libpulsedsp.so", + "libpulse-mainloop-glib.so.0", + "libpulse-simple.so.0", + "libpulse.so.0", + "libraop.so", + "librtp.so", + "libwebrtc-util.so"], + "server": [] + } + } + } + }, + "##章节名": "12 打印扫描库", + "print_scan": { + "description": { + "chapters_number": "12", + "chapters_Name": "打印扫描" + }, + "packages": { + "cups-filters": { + "lib_name": "cups-filters", + "sections_number": "12.1", + "lib_description": "CUPS 是苹果公司为 Mac OS® X 和其他类 UNIX® 操作系统开发的基于标准的开源打印系统。CUPS 使用 Internet 打印协议 (“IPP”) 并提供 System V 和 Berkeley 命令行界面、Web 界面和 C API 来管理打印机和打印作业。该项目提供后端、过滤器和其他软件,cups-filters是过滤器。", + "version": { + "desktop": "1.21.6", + "server": "1.20.0" + }, + "alias": [ + { + "name": "cups-filters", + "version": { + "desktop": "1.21.6", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontembed.so.1", + "libcupsfilters.so.1"], + "server": ["libfontembed.so.1", + "libcupsfilters.so.1"] + } + }, + "sane-backends": { + "lib_name": "sane-backends", + "sections_number": "12.2", + "lib_description": "SANE 应用程序编程接口 (API) ,提供对任何光栅图像扫描仪硬件(平板扫描仪、手持式扫描仪、视频和照相机、图像采集卡等)的标准化访问。", + "version": { + "desktop": "1.0.27", + "server": "1.0.27" + }, + "alias": [ + { + "name": "sane-backends", + "version": { + "desktop": "1.0.27", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsane.so.1"], + "server": [] + } + } + } + }, + "##章节名": "13 运行时语言库", + "runtime_language": { + "description": { + "chapters_number": "13", + "chapters_Name": "运行时语言" + }, + "packages": { + "python2": { + "lib_name": "python2", + "sections_number": "13.1", + "lib_description": "", + "version": { + "desktop": "2.7.16", + "server": "2.7.16" + }, + "alias": [ + { + "name": "python2", + "version": { + "desktop": "2.7.16", + "server": "2.7.16" + } + }, + { + "name": "python2.7/python2", + "version": { + "desktop": "2.7.16", + "server": "2.7.16" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpython2.7.so.1"], + "server": ["libpython2.7.so.2"] + } + }, + "openjdk": { + "lib_name": "openjdk", + "sections_number": "13.2", + "lib_description": "OpenJDK 是 Java 标准版 (Java SE) 和 Java 开发工具包 (JDK) 的开源实现。OpenJDK 源代码是这些商业 Java 产品的基础。它包含了Java 运行时环境,用以运行 Java 程序,也包含了 Java 虚拟机和一些别的组成。", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + }, + "alias": [ + { + "name": "openjdk-11", + "version": { + "desktop": "11.0.9", + "server": "2.7.16" + } + }, + { + "name": "openjdk-11/", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-11-openjdk/", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-1.8.0-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-wrapper.so.6", + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjawt.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"], + "server": [ + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"] + } + }, + "perl": { + "lib_name": "perl", + "sections_number": "13.3", + "lib_description": "Perl库:开发文件用于开发嵌入Perl解释器的应用程序的文件。", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + }, + "alias": [ + { + "name": "perl", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + }, + { + "name": "perl-libs", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libperl.so.5.30"], + "server": ["libperl.so.5.28"] + } + } + } + }, + "##章节名": "14 编程开发库", + "development": { + "description": { + "chapters_number": "14", + "chapters_Name": "编程开发" + }, + "packages": { + "libxml2": { + "lib_name": "libxml2", + "sections_number": "14.1", + "lib_description": "Libxml2 是一个xml的c语言版的解析器", + "version": { + "desktop": "2.9.4", + "server": "2.9.7" + }, + "alias": [ + { + "name": "libxml2", + "version": { + "desktop": "2.9.4", + "server": "2.7.16" + } + } + ], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxml2.so.2"], + "server": ["libxml2.so.2"] + } + }, + "libunwindb": { + "lib_name": "libunwindb", + "sections_number": "14.2", + "lib_description": "可移植且高效的 C 编程接口 (API),用于确定程序的调用链。", + "version": { + "desktop": "1.2.1", + "server": "1.3.1" + }, + "alias": [ + { + "name": "libunwind", + "version": { + "desktop": "1.2.1", + "server": "1.3.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libunwind.so.8", + "libunwind-coredump.so.0"], + "server": ["libunwind.so.8", + "libunwind-coredump.so.0"] + } + } + } + }, + "##章节名": "15 基础计算库", + "basic_calculation": { + "description": { + "chapters_number": "15", + "chapters_Name": "基础计算" + }, + "packages": { + "orbit2": { + "lib_name": "orbit2", + "sections_number": "15.1", + "lib_description": "高性能CORBA实现CORBA:一种使程序对象能够在不同的应用程序之间通信、发送请求和接收回复的体系结构,而不管它们的编程语言、操作系统或网络位置如何。", + "version": { + "desktop": "", + "server": "2.14.19" + }, + "alias": [ + { + "name": "orbit2", + "version": { + "desktop": "", + "server": "11.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libORBit-2.so", + "libORBitCosNaming-2.so.0", + "libORBit-imodule-2.so"] + } + }, + "atlas": { + "lib_name": "atlas", + "sections_number": "15.2", + "lib_description": "自动调整线性代数软件:是一种自动生成和优化数值软件的方法。目前,ATLAS为被称为基本线性代数子程序(BLAS)的完整线性代数内核集和LAPACK库中的线性代数例程子集提供了优化版本。", + "version": { + "desktop": "", + "server": "3.10.3" + }, + "alias": [ + { + "name": "atlas", + "version": { + "desktop": "", + "server": "3.10.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libsatlas.so.3", + "libtatlas.so.3"] + } + }, + "lapack": { + "lib_name": "lapack", + "sections_number": "15.3", + "lib_description": "基本线性代数参考实现BLAS(基本线性代数子程序)是一组用于大多数基本向量和矩阵运算的高效例程。它们被广泛用作其他高质量线性代数软件的基础", + "version": { + "desktop": "", + "server": "3.8.0" + }, + "alias": [ + { + "name": "lapack", + "version": { + "desktop": "", + "server": "3.8.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libblas.so.3", + "liblapack.so.3", + "liblapacke.so.3"] + } + } + } + }, + "##章节名": "16 存储库", + "storage": { + "description": { + "chapters_number": "16", + "chapters_Name": "存储" + }, + "packages": { + "ceph": { + "lib_name": "ceph", + "sections_number": "16.1", + "lib_description": "Ceph是一个开源软件定义的存储平台,它在单个分布式计算机集群上实现对象存储,并提供用于对象,块和文件级存储的3合1接口。Ceph的主要目标是实现无单点故障的完全分布式操作,可扩展到艾字节级别,并且可以免费使用。", + "version": { + "desktop": "", + "server": "2012/2/8" + }, + "alias": [ + { + "name": "ceph", + "version": { + "desktop": "", + "server": "2012/2/8" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcls_cephfs.so.1", + "libcls_hello.so.1", + "libcls_journal.so.1", + "libcls_kvs.so.1", + "libcls_lock.so.1", + "libcls_log.so.1", + "libcls_lua.so.1", + "libcls_numops.so.1", + "libcls_rbd.so.1", + "libcls_refcount.so.1", + "libcls_replica_log.so.1", + "libcls_rgw.so.1", + "libcls_sdk.so.1", + "libcls_statelog.so.1", + "libcls_timeindex.so.1", + "libcls_user.so.1", + "libcls_version.so.1", + "libceph_snappy.so.1", + "libceph_zlib.so", + "libceph_zstd.so", + "libec_jerasure.so", + "libec_jerasure_generic.so", + "libec_jerasure_neon.so", + "libec_lrc.so", + "libec_shec.so", + "libec_shec_generic.so", + "libec_shec_neon.so", + "libosd_tp.so", + "libos_tp.so"] + } + } + } + }, + "##章节名": "17 虚拟化库", + "virtualization": { + "description": { + "chapters_number": "17", + "chapters_Name": "虚拟化" + }, + "packages": { + "libvirt": { + "lib_name": "libvirt", + "sections_number": "17.1", + "lib_description": "用于管理虚拟化平台的开源的API,后台程序和管理工具。", + "version": { + "desktop": "", + "server": "5.5.0" + }, + "alias": [ + { + "name": "libvirt", + "version": { + "desktop": "", + "server": "5.5.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libvirt-admin.so.0", + "libvirt-lxc.so.0", + "libvirt-qemu.so.0", + "libvirt.so.0", + "libvirt_driver_interface.so", + "libvirt_driver_network.so", + "libvirt_driver_nodedev.so", + "libvirt_driver_nwfilter.so", + "libvirt_driver_qemu.so", + "libvirt_driver_secret.so", + "libvirt_driver_storage.so", + "lockd.so", + "libvirt_storage_backend_disk.so", + "libvirt_storage_backend_fs.so", + "libvirt_storage_backend_iscsi.so", + "libvirt_storage_backend_iscsi-direct.so", + "libvirt_storage_backend_logical.so", + "libvirt_storage_backend_mpath.so", + "libvirt_storage_backend_rbd.so", + "libvirt_storage_backend_scsi.so", + "libvirt_storage_backend_gluster.so", + "libvirt_storage_file_gluster.so", + "libvirt_storage_file_fs.so"] + } + } + } + }, + "##章节名": "18 集群高可用库", + "high_availability": { + "description": { + "chapters_number": "18", + "chapters_Name": "集群高可用" + }, + "packages": { + "conntrack-tools": { + "lib_name": "conntrack-tools", + "sections_number": "18.1", + "lib_description": "conntrack-tools 是一套Linux用户空间连接跟踪工具,用于查看和监控系统当前的网络连接情况;Conntrackd 可以复制当前基于 Linux 防火墙处理的连接状态。 Conntrackd 也可以统计守护进程运行。", + "version": { + "desktop": "", + "server": "1.4.4" + }, + "alias": [ + { + "name": "conntrack-tools", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["ct_helper_amanda.so", + "ct_helper_dhcpv6.so", + "ct_helper_ftp.so", + "ct_helper_rpc.so", + "ct_helper_sane.so", + "ct_helper_ssdp.so", + "ct_helper_tftp.so", + "ct_helper_tns.so"] + } + } + } + } + } + } +} diff --git a/Jsons/lib_list_1.0I-20221114.json b/Jsons/lib_list_1.0I-20221114.json new file mode 100644 index 0000000000000000000000000000000000000000..1f8f55bf8e691735e1f21691362adeb12f5b1ab7 --- /dev/null +++ b/Jsons/lib_list_1.0I-20221114.json @@ -0,0 +1,4992 @@ +{ + "std_description": { + "std_name": "操作系统应用编程接口", + "std_number": "T/CESA-XXXX-2022", + "##std_version": "标准的版本标识,仅供作为本json描述文件的标识使用,由标准版本号+类别组成,标准第一版为1.0,勘误增加小版本号如1.1,标准修订增加大版本号2.0;", + "##std_version": "标准类别用1位大写字母,I表示团标,S电子信息行标,G表示国标", + "std_version": "1.0I", + "etc": "这是《操作系统应用编程接口》标准运行库描述文件,是《操作系统应用编程接口》标准符合性测试工具的组成部分;" + }, + "CopyRight": { + "License": "本文件遵循木兰协议xxxxxx", + "comment": "", + "Author": "贡献者:XXX@cesi,xxx@uitech,xxx@huawei,xxx@kylinos" + }, + "##libs": "标准规定动库包", + "libs": { + "##libs_location": "查询共享对象库的路径,与标准规定了文件系统层次结构保持一致", + "lib_location": [ + "/lib", + "/lib64", + "/usr/lib" + ], + "category": { + + "##章节名": "7 基础库", + "base": { + "description": { + "##chapters_number": "库对应标准章号,做完日志或错误等输出记录标识,可用于反查标准", + "chapters_number": "7", + "chapters_Name": "基础" + }, + "packages": { + "##glibc": "包名,考虑到编译后名称二进制安装包可能会存在差异,一般以源码包去命名,做完匹配符,用以检查安装的运行库是否存在,同aliasname。后面不在赘述", + "glibc": { + "##lib_name": "包名,一般与外部名称应该一致", + "lib_name": "glibc", + "##sections_number": "库包对应标准节号,当符合性检查出现错误或警告时,可用于标准反查", + "sections_number": "7.1", + "##lib_description": "库的介绍,可能会被删除,仅作为识读使用,不参与符合性检查,值可以置空", + "lib_description": "该软件包包括标准C库的共享版本以及标准数学库,以及其他许多库。", + "##version": "最低版本要求,'desktop_version':桌面OS,'server_version',服务器OS", + "##version": "版本位次检查规则:如果版号有n位,则前n-1位不可变,第n位版本号比低于版本要求;如果版号中含有字母或特殊字符另行扩充判定规则", + "version": { + "desktop": "2.28", + "server": "2.28" + }, + "##aliasname": "包的别名,考虑由于来源差异,部分包命及版本规则与包的根社区不一致,标准特对少部分包增加别名及特点版本要求,标准名和别名应遍历查找", + "##aliaversion": "别名对应版本,如果没有特殊要求,应与标准版一致;如果别名有多个,那么版本号也应该是多个,保持一一对应,多个别名对一个版本", + "alias": [ + { + "name": "libc6", + "version": { + "desktop": "2.28", + "server": "2.28" + } + } + ], + "##necessity": "必要性", + "##necessity": "第一位:L0表示对应平台不作要求,L1长期兼容库,L2兼容库,L3试用版本;如果是L0,则第二项可以置空'';L1与L2在符合性检查没有明显区别,主要是为了区别标准的长期性承诺", + "##necessity": "第二位:basic表示基本,基本ISO安装应提供该库,expansion表示扩展,该库可以通过扩展光盘或仓库提供,当兼容性级别为'L0'时,本项可置空,不再做检查,也不再做共享对象的检查", + "##necessity": "第三位:Deprecated表示不推荐,即不推荐应用调用,为兼容历史应用要求操作系统提供的库,操作性系统符合性检查时忽略该项,应用如果依赖该类库应给出告警", + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "##share_objs": "库所要求的共享对象名清单;当'share_objs'存在时表示桌面与服务器的要求一致(或对其中一类操作系统无要求);如果不存在则表示,按操作系统类别分别比较", + "##share_objs": "只有标准要求的共享对象(或符号链接)都存在才符合标准。如果是个符号链接,应查询到对应的实体库,并查验对应其符号链是否与查询到的符号链接文件是否一致", + "share_objs": { + "desktop": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libmvec.so.1", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libnss_nisplus.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"], + "server": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libmvec.so.1", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libnss_nisplus.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"] + } + }, + "krb5": { + "lib_name": "krb5", + "sections_number": "7.2", + "lib_description": "Kerberos 网络身份验证协议", + "version": { + "desktop": "1.17", + "server": "1.17" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkdb5.so.9", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"], + "server": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkdb5.so.9", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"] + } + }, + "elfutils": { + "lib_name": "elfutils", + "sections_number": "7.3", + "lib_description": "用于处理 ELF 文件和 DWARF 数据的应用程序集合", + "version": { + "desktop": "0.176", + "server": "0.176" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"], + "server": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"] + } + }, + "pam": { + "lib_name": "pam", + "sections_number": "7.4", + "lib_description": "Linux身份验证模块", + "version": { + "desktop": "1.3.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"], + "server": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"] + } + }, + "zlib": { + "lib_name": "zlib", + "sections_number": "7.5", + "lib_description": "无损数据压缩库", + "version": { + "desktop": "1.2.11", + "server": "1.2.11" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libz.so.1"], + "server": ["libz.so.1"] + } + }, + "gcc": { + "lib_name": "gcc", + "sections_number": "7.6", + "lib_description": "GNU 的编译器集合 包括对 ,C、C++、Fortran、Object-C、Object-C++、Go、D、等的支持。当前是 GCC 8 的实现版本。", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + }, + "alias": [ + { + "name": "gcc-7", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-8", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-9", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libquadmath", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libstdc++", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasan.so.5", + "libatomic.so.1", + "libcc1.so", + "libcc1plugin.so", + "libcp1plugin.so", + "libgcc_s_x32.so", + "libgcc_s.so.1", + "libgdruntime.so.76", + "libgfortran.so.5", + "libgnarl-8.so.1", + "libgnarl.so", + "libgnat-8.so.1", + "libgnat.so", + "libgo.so.13", + "libgomp.so.1", + "libgphobos.so.76", + "libhsail-rt.so.0", + "libitm.so.1", + "liblsan.so.0", + "liblto_plugin.so.0", + "libmpx.so.2", + "libobjc.so.4", + "libquadmath.so.0", + "libstdc++.so.6", + "libtsan.so.0", + "libubsan.so.1"], + "server": ["libasan.so.4", + "libatomic.so.1", + "libgcc_s.so.1", + "libgfortran.so.4", + "libgomp.so.1", + "libobjc.so.4", + "libquadmath.so.0", + "libstdc++.so.6", + "libtsan.so.0"] + } + }, + "libxcrypt": { + "lib_name": "libxcrypt", + "sections_number": "7.7", + "lib_description": "实现加密和解密的库", + "version": { + "desktop": "4.4.10", + "server": "4.4.4" + }, + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "4.4.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypt.so.1"], + "server": ["libcrypt.so.1"] + } + }, + "audit": { + "lib_name": "audit", + "sections_number": "7.8", + "lib_description": "用于内核审计的用户空间工具", + "version": { + "desktop": "2.8.4", + "server": "2.8.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaudit.so.1", + "libauparse.so.0"], + "server": ["libaudit.so.1", + "libauparse.so.0"] + } + }, + "bzip2": { + "lib_name": "bzip2", + "sections_number": "7.9", + "lib_description": "高质量的数据压缩器", + "version": { + "desktop": "1.0.6", + "server": "1.0.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbz2.so.1"], + "server": ["libbz2.so.1"] + } + }, + "dbus": { + "lib_name": "dbus", + "sections_number": "7.10", + "lib_description": "消息总线系统,用于应用间通信。提供系统留守进程和用户登录留守进程", + "version": { + "desktop": "1.12.16", + "server": "1.12.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-1.so.3"], + "server": ["libdbus-1.so.3"] + } + }, + "expat": { + "lib_name": "expat", + "sections_number": "7.11", + "lib_description": "expat 是一个用 C 语言编写的面向流的 XML 解析器库", + "version": { + "desktop": "2.2.6", + "server": "2.2.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libexpat.so.1"], + "server": ["libexpat.so.1"] + } + }, + "glib2": { + "lib_name": "glib2", + "sections_number": "7.12", + "lib_description": "构成 GTK+ 和 GNOME 等项目基础的核心库", + "version": { + "desktop": "2.58", + "server": "2.56" + }, + "alias": [ + { + "name": "glib2.0/glib2", + "version": { + "desktop": "2.58", + "server": "2.56" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"], + "server": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"] + } + }, + "gmp": { + "lib_name": "gmp", + "sections_number": "7.13", + "lib_description": "一个 GNU 多精度算术库", + "version": { + "desktop": "6.1.2", + "server": "6.1.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgmp.so.10"], + "server": ["libgmp.so.10"] + } + }, + "libidn2": { + "lib_name": "libidn2", + "sections_number": "7.14", + "lib_description": "GNU libidn2是GNU libidn的后继者。standalone lib。包含IDNA2008,Punycode 和 Unicode TR46 的实现。通过IETF国际域名(IDN)实施字符串预处理、Punycode和IDNA规格定义的包", + "version": { + "desktop": "2.0.5", + "server": "2.0.5" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libidn2.so.0"], + "server": ["libidn2.so.0"] + } + }, + "ncurses": { + "lib_name": "ncurses", + "sections_number": "7.15", + "lib_description": "终端控制库", + "version": { + "desktop": "6.1.1", + "server": "6.1" + }, + "alias": [ + { + "name": "ncurses/ncurses-libs", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"], + "server": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"] + } + }, + "xz": { + "lib_name": "xz", + "sections_number": "7.16", + "lib_description": "一款免费的通用数据压缩软件,采用 LZMA2 算法", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + }, + "alias": [ + { + "name": "xz-utils/xz", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liblzma.so.5"], + "server": ["liblzma.so.5"] + } + }, + "libcap": { + "lib_name": "libcap", + "sections_number": "7.17", + "lib_description": "这是一个用于获取和设置 POSIX.1e(以前的 POSIX 6)草案 15 功能的库。", + "version": { + "desktop": "2.25", + "server": "2.26" + }, + "alias": [ + { + "name": "libcap/libcap2", + "version": { + "desktop": "2.25", + "server": "2.26" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcap.so.2"], + "server": ["libcap.so.2"] + } + }, + "popt": { + "lib_name": "popt", + "sections_number": "7.18", + "lib_description": "解析命令行选项的库。它不使用全局变量,因此可以在解析argv时进行多次传递;它可以解析任意argv样式元素的数组,允许解析来自任何源的命令行字符串;它提供了选项别名的标准方法;它可以执行外部选项过滤器;它可以自动为应用程序生成帮助和使用信息。", + "version": { + "desktop": "1.16", + "server": "1.16" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpopt.so.0"], + "server": ["libpopt.so.0"] + } + }, + "libnl3": { + "lib_name": "libnl3", + "sections_number": "7.19", + "lib_description": "libnl 套件是一组库,为基于 netlink 协议的 Linux 内核接口提供 API。", + "version": { + "desktop": "3.4.0", + "server": "3.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"], + "server": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"] + } + }, + "libsecret": { + "lib_name": "libsecret", + "sections_number": "7.20", + "lib_description": "libsecret 是一个用于存储和检索密码和其他机密的库。它使用 D-Bus 与“Secret Service”通信。gnome-keyring 和 ksecretservice 都是 Secret Service 的实现。", + "version": { + "desktop": "0.18.7", + "server": "0.18.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsecret-1.so.0"], + "server": ["libsecret-1.so.0"] + } + }, + "libIDL": { + "lib_name": "libIDL", + "sections_number": "7.21", + "lib_description": "libIDL是一个包含接口定义语言文件的库 。这是定义可移植接口的规范。", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libIDL-2.so.0"], + "server": ["libIDL-2.so.0"] + } + }, + "libtalloc": { + "lib_name": "libtalloc", + "sections_number": "7.22", + "lib_description": "libtalloc 包提供了一个使用析构函数实现分层内存分配器的库。", + "version": { + "desktop": "2.1.14", + "server": "2.2.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtalloc.so.2"], + "server": ["libtalloc.so.2"] + } + }, + "libtevent": { + "lib_name": "libtevent", + "sections_number": "7.23", + "lib_description": "libtevent 包提供 Tevent,一个基于talloc 内存管理库的事件系统。Tevent 支持多种事件类型,包括定时器、信号和经典的文件描述符事件。Tevent 还提供帮助器来处理提供 tevent_req(Tevent 请求)函数的异步代码。", + "version": { + "desktop": "0.9.37", + "server": "0.10.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtevent.so.0"], + "server": ["libtevent.so.0"] + } + }, + "readline": { + "lib_name": "readline", + "sections_number": "7.24", + "lib_description": "包括GNU readline库 和历史库。GNU readline 库有助于在需要提供命令行界面的离散程序之间保持用户界面的一致性。 GNU 历史库提供了一个一致的用户界面,用于调用以前键入的输入行。", + "version": { + "desktop": "7.0", + "server": "7.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libhistory.so.8", + "libreadline.so.8"], + "server": ["libhistory.so.7", + "libreadline.so.7"] + } + }, + "libmodulemd": { + "lib_name": "libmodulemd", + "sections_number": "7.25", + "lib_description": "用于操作模块元数据文件的C函数库", + "version": { + "desktop": "", + "server": "1.6.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libmodulemd.so.1"] + } + }, + "dbus-glib": { + "lib_name": "dbus-glib", + "sections_number": "7.26", + "lib_description": "对DBus的GNOME GLib接口工具及函数库", + "version": { + "desktop": "0.110", + "server": "0.110" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-glib-1.so.2"], + "server": [] + } + }, + "attr": { + "lib_name": "attr", + "sections_number": "7.27", + "lib_description": "文件系统及文件扩展属性管理功能库", + "version": { + "desktop": "2.4.48", + "server": "2.4.48" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libattr.so.1"], + "server": [] + } + }, + "libevent": { + "lib_name": "libevent", + "sections_number": "7.28", + "lib_description": "当文件描述符上发生特定事件或达到超时后, libevent API 提供了一种执行回调函数的机制。此外,libevent还支持由于信号或常规超时而引起的回调。libevent旨在替换事件驱动网络服务器中的事件循环。", + "version": { + "desktop": "2.1.8", + "server": "2.1.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"], + "server": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"] + } + }, + "accountsservice": { + "lib_name": "accountsservice", + "sections_number": "7.29", + "lib_description": "用户管理(账户维护)", + "version": { + "desktop": "0.6.45", + "server": "0.6.50" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaccountsservice.so.0"], + "server": ["libaccountsservice.so.0"] + } + }, + "libmpc": { + "lib_name": "libmpc", + "sections_number": "7.30", + "lib_description": "用于多精度复杂算术的 C 库", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + }, + "alias": [ + { + "name": "libmpc3/libmpc", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpc.so.3"], + "server": ["libmpc.so.3"] + } + }, + "mpfr": { + "lib_name": "mpfr", + "sections_number": "7.31", + "lib_description": "多精度浮点计算 C 库", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + }, + "alias": [ + { + "name": "mpfr4/mpfr", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpfr.so.6"], + "server": ["libmpfr.so.4"] + } + }, + "ndctl": { + "lib_name": "ndctl", + "sections_number": "7.32", + "lib_description": "DAX(直接访问)协议支持工具", + "version": { + "desktop": "63", + "server": "63" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdaxctl.so.1"], + "server": ["libdaxctl.so.1"] + } + }, + "file": { + "lib_name": "file", + "sections_number": "7.33", + "lib_description": "识别特定文件类型的工具", + "version": { + "desktop": "5.35", + "server": "5.33" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmagic.so.1"], + "server": ["libmagic.so.1"] + } + }, + "gdbm": { + "lib_name": "gdbm", + "sections_number": "7.34", + "lib_description": "一个使用可扩展散列的数据库函数库", + "version": { + "desktop": "1.18", + "server": "1.18" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdbm.so.6", + "libgdbm_compat.so.4"], + "server": ["libgdbm.so.6", + "libgdbm_compat.so.4"] + } + }, + "keyutils": { + "lib_name": "keyutils", + "sections_number": "7.35", + "lib_description": "Linux 密钥管理程序", + "version": { + "desktop": "1.6", + "server": "1.5.10" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libkeyutils.so.1"], + "server": ["libkeyutils.so.1"] + } + }, + "libedit": { + "lib_name": "libedit", + "sections_number": "7.36", + "lib_description": "提供通用行编辑、历史记录和标记功能", + "version": { + "desktop": "3.1", + "server": "3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libedit.so.2"], + "server": ["libedit.so.0"] + } + }, + "kcodecs": { + "lib_name": "kcodecs", + "sections_number": "7.37", + "lib_description": "操作字符串的方法的集合KCodecs提供了一组操作字符串的方法使用不同的编码。", + "version": { + "desktop": "5.54.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libKF5Codecs.so.5"], + "server": [] + } + }, + "fcitx": { + "lib_name": "fcitx", + "sections_number": "7.38", + "lib_description": "fcitx输入法的核心功能库", + "version": { + "desktop": "4.2.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfcitx-core.so.0", + "libfcitx-gclient.so.1", + "libfcitx-utils.so.0"], + "server": [] + } + }, + "libsdl-ttf2.0": { + "lib_name": "libsdl-ttf2.0", + "sections_number": "7.39", + "lib_description": "允许SDL应用程序中使用TrueType字体", + "version": { + "desktop": "2.0.11", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL_ttf-2.0.so.0"], + "server": [] + } + } + } + }, + "##章节名": "8 系统安全库", + "security": { + "description": { + "chapters_number": "8", + "chapters_Name": "系统安全" + }, + "packages": { + "acl": { + "lib_name": "acl", + "sections_number": "8.1", + "lib_description": "管理访问控制列表。", + "version": { + "desktop": "2.2.53", + "server": "2.2.53" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libacl.so.1"], + "server": ["libacl.so.1"] + } + }, + "cyrus-sasl": { + "lib_name": "cyrus-sasl", + "sections_number": "8.2", + "lib_description": "SASL是简单的权限验证和安全层,可添加基于连接的协议的验证支持。", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + }, + "alias": [ + { + "name": "cyrus-sasl2/cyrus-sasl", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsasl2.so.2", + "libanonymous.so.2", + "libsasldb.so.2", + "libcrammd5.so.2", + "ibdigestmd5.so.2", + "libgs2.so.2", + "libgssapiv2.so.2", + "libldapdb.so.2", + "liblogin.so.2", + "libntlm.so.2", + "libplain.so.2", + "libscram.so.2"], + "server": ["libsasl2.so.3", + "libanonymous.so.3", + "libsasldb.so.3", + "libcrammd5.so.3", + "ibdigestmd5.so.3", + "libgs2.so.3", + "libgssapiv2.so.3", + "libldapdb.so.3", + "liblogin.so.3", + "libntlm.so.3", + "libplain.so.3", + "libscram.so.3"] + } + }, + "libgcrypt": { + "lib_name": "libgcrypt", + "sections_number": "8.3", + "lib_description": "通用加密库。", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + }, + "alias": [ + { + "name": "libgcrypt20/libgcrypt", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgcrypt.so.20"], + "server": ["libgcrypt.so.20"] + } + }, + "liboauth": { + "lib_name": "liboauth", + "sections_number": "8.4", + "lib_description": "oauth是一种关于授权方式的协议标准。", + "version": { + "desktop": "1.0.3", + "server": "1.0.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liboauth.so.0"], + "server": ["liboauth.so.0"] + } + }, + "gnutls": { + "lib_name": "gnutls", + "sections_number": "8.5", + "lib_description": "gnutls全称 GNU TransportLayerSecurity Library,即基于GNU版权协议的传输层安全协议,是wget支持https中的ssl协议的基础库。", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + }, + "alias": [ + { + "name": "gnutls28/gnutls", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"], + "server": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"] + } + }, + "libssh": { + "lib_name": "libssh", + "sections_number": "8.6", + "lib_description": "libssh 是一个用以访问SSH服务的C语言开发包,通过它可以执行远程命令、文件传输,同时为远程的程序提供安全的传输通道。", + "version": { + "desktop": "0.8.7", + "server": "0.8.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh.so.4"], + "server": ["libssh.so.4", + "libssh_threads.so.4"] + } + }, + "libssh2": { + "lib_name": "libssh2", + "sections_number": "8.7", + "lib_description": "libssh2是一个C 函数库,用来实现SSH2协议。主要功能:Key Exchange Methods,Hostkey Type,Ciphers,Compression Schemes,MAC hashes等", + "version": { + "desktop": "1.8.0", + "server": "1.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh2.so.1"], + "server": ["libssh2.so.1"] + } + }, + "cracklib": { + "lib_name": "cracklib", + "sections_number": "8.8", + "lib_description": "密码安全测试工具。", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + }, + "alias": [ + { + "name": "cracklib2", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrack.so.2"], + "server": ["libcrack.so.2"] + } + }, + "nspr": { + "lib_name": "nspr", + "sections_number": "8.9", + "lib_description": "包含线程、文件和网络I/O、内存管理等的运行时库。", + "version": { + "desktop": "4.20.1", + "server": "4.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnspr4.so", + "libplc4.so", + "libplds4.so"], + "server": ["libnspr4.so", + "libplc4.so", + "libplds4.so"] + } + }, + "openssl": { + "lib_name": "openssl", + "sections_number": "8.10", + "lib_description": "具有 TLS 实现的通用加密库中的实用程序,添加国密算法SM2 SM3 SMS4", + "version": { + "desktop": "1.1.1d", + "server": "1.1.1c" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypto.so.1.1", + "libssl.so.1.1"], + "server": ["libcrypto.so.1.1", + "libssl.so.1.1"] + } + } + } + }, + "##章节名": "9 网络服务库", + "network": { + "description": { + "chapters_number": "9", + "chapters_Name": "网络服务" + }, + "packages": { + "Networkmanager": { + "lib_name": "Networkmanager", + "sections_number": "9.1", + "lib_description": "网络链接管理器和用户应用程序。", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm.so.0", + "libnm-wwan.so", + "nm-pppd-plugin.so"], + "server": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-ovs.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm-settings-plugin-ifcfg-rh.so", + "libnm.so.0", + "libnm-wwan.so"] + } + }, + "sssd": { + "lib_name": "sssd", + "sections_number": "9.2", + "lib_description": "管理对远程目录的访问和权限验证", + "version": { + "desktop": "1.16.3", + "server": "1.16.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"], + "server": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"] + } + }, + "libtirpc": { + "lib_name": "libtirpc", + "sections_number": "9.3", + "lib_description": "libtirpc包包含支持使用远程过程调用 (RPC) API 的程序的库 。", + "version": { + "desktop": "1.1.4", + "server": "1.1.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtirpc.so.3"], + "server": ["libtirpc.so.3"] + } + }, + "nss": { + "lib_name": "nss", + "sections_number": "9.4", + "lib_description": "网络安全服务。", + "version": { + "desktop": "3.42.1", + "server": "3.40.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnss3.so", + "libsmime3.so", + "libssl3.so"], + "server": ["libnss3.so", + "libnsssysinit.so", + "libsmime3.so", + "libssl3.so"] + } + }, + "libpcap": { + "lib_name": "libpcap", + "sections_number": "9.5", + "lib_description": "libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。著名的软件TCPDUMP就是在libpcap的的基础上开发而成的", + "version": { + "desktop": "1.8.1", + "server": "1.9.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpcap.so.1"], + "server": ["libpcap.so.1"] + } + }, + "curl": { + "lib_name": "curl", + "sections_number": "9.6", + "lib_description": "命令行或脚本数据传输工具", + "version": { + "desktop": "7.64.1", + "server": "7.61.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcurl.so.4"], + "server": ["libcurl.so.4"] + } + }, + "iptables": { + "lib_name": "iptables", + "sections_number": "9.7", + "lib_description": "IP包过滤管理工具", + "version": { + "desktop": "1.8.2", + "server": "1.8.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.2", + "libip6tc.so.2", + "libxtables.so.12"], + "server": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.0", + "libip6tc.so.0", + "libiptc.so.0", + "libxtables.so.12"] + } + }, + "bind": { + "lib_name": "bind", + "sections_number": "9.8", + "lib_description": "包括操作 DNS 服务器的组件", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + }, + "alias": [ + { + "name": "bind9/bind", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbind9.so.161", + "libisccc.so.161", + "liblwres.so.161"], + "server": ["libbind9.so.160", + "libisccc.so.160", + "liblwres.so.160"] + } + }, + "cifs-utils": { + "lib_name": "cifs-utils", + "sections_number": "9.9", + "lib_description": "通用网络文件系统。", + "version": { + "desktop": "6.8", + "server": "6.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["idmapwb.so", + "pam_cifscreds.so"], + "server": ["idmapwb.so", + "pam_cifscreds.so"] + } + }, + "atkmm": { + "lib_name": "atkmm", + "sections_number": "9.10", + "lib_description": "atk库的C++绑定。", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + }, + "alias": [ + { + "name": "atkmm1.6/atkmm", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatkmm-1.6.so.11"], + "server": ["libatkmm-1.6.so.11"] + } + }, + "avahi": { + "lib_name": "avahi", + "sections_number": "9.11", + "lib_description": "通过mDNS/DNS-SD协议发现本地网络上的服务。", + "version": { + "desktop": "0.7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavahi-core.so.7", + "libavahi-glib.so.1", + "libavahi-client.so.3", + "libavahi-common.so.3", + "libavahi-gobject.so.0", + "libavahi-ui-gtk3.so.0"], + "server": [] + } + }, + "dhcp": { + "lib_name": "dhcp", + "sections_number": "9.12", + "lib_description": "动态分配DHCP", + "version": { + "desktop": "", + "server": "4.3.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libdhcpctl.so", + "libomapi.so"] + } + }, + "iproute": { + "lib_name": "iproute", + "sections_number": "9.13", + "lib_description": "命令行网络工具", + "version": { + "desktop": " 4.20.0", + "server": "" + }, + "alias": [ + { + "name": "iproute2", + "version": { + "desktop": " 4.20.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["m_ipt.so"], + "server": [] + } + } + } + }, + "##章节名": "10 图形库", + "graphic": { + "description": { + "chapters_number": "10", + "chapters_Name": "图形" + }, + "packages": { + "atk": { + "lib_name": "atk", + "sections_number": "10.1", + "lib_description": "提供给应用程序的可访问性的编程接口。", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + }, + "alias": [ + { + "name": "atk1.0/atk", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-1.0.so.0"], + "server": ["libatk-1.0.so.0"] + } + }, + "gtk2": { + "lib_name": "gtk2", + "sections_number": "10.2", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + }, + "alias": [ + { + "name": "gtk+2.0/gtk2", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"], + "server": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"] + } + }, + "gtk3": { + "lib_name": "gtk3", + "sections_number": "10.3", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + }, + "alias": [ + { + "name": "gtk+3.0/gtk3", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libprintbackend-cloudprint.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"], + "server": ["libprintbackend-cloudprint.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"] + } + }, + "libICE": { + "lib_name": "libICE", + "sections_number": "10.4", + "lib_description": "X.Org X11 ICE 运行时库", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + }, + "alias": [ + { + "name": "libice/libICE", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libICE.so.6"], + "server": ["libICE.so.6"] + } + }, + "libxext": { + "lib_name": "libxext", + "sections_number": "10.5", + "lib_description": "X.Org 项目提供了 X Window System.X.Org X11 libXext 的开源实现,包含运行时库。", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + }, + "alias": [ + { + "name": "libxext/libXext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXext.so.6"], + "server": ["libXext.so.6"] + } + }, + "libpng1.6": { + "lib_name": "libpng1.6", + "sections_number": "10.6", + "lib_description": "libpng 包包含其他程序用于读取和写入 PNG 格式文件的库。", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + }, + "alias": [ + { + "name": "libpng1.6/libpng", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng16.so.16"], + "server": ["libpng16.so.16"] + } + }, + "libx11": { + "lib_name": "libx11", + "sections_number": "10.7", + "lib_description": "Core X11 协议客户端库", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + }, + "alias": [ + { + "name": "libx11/libX11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libX11-xcb.so.1", + "libX11.so.6"], + "server": ["libX11-xcb.so.1", + "libX11.so.6"] + } + }, + "libsdl2": { + "lib_name": "libsdl2", + "sections_number": "10.8", + "lib_description": "SDL的重构版", + "version": { + "desktop": "2.0.9", + "server": "" + }, + "alias": [ + { + "name": "libsdl2/SDL2", + "version": { + "desktop": "2.0.9", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL2-2.0.so.0"], + "server": [] + } + }, + "libxau": { + "lib_name": "libxau", + "sections_number": "10.9", + "lib_description": "用于提供对 X Window 的单独访问系统显示。", + "version": { + "desktop": "1.0.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXau.so.6"], + "server": [] + } + }, + "libxaw": { + "lib_name": "libxaw", + "sections_number": "10.10", + "lib_description": "Xaw 是一个基于 X Toolkit Intrinsics (Xt) 库的小部件集。", + "version": { + "desktop": "1.0.13", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXaw.so.7"], + "server": [] + } + }, + "fontconfig": { + "lib_name": "fontconfig", + "sections_number": "10.11", + "lib_description": "Fontconfig 根据应用程序指定的要求提供不同的字体。", + "version": { + "desktop": "2.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontconfig.so.1"], + "server": [] + } + }, + "freetype": { + "lib_name": "freetype", + "sections_number": "10.12", + "lib_description": "字体渲染软件库。", + "version": { + "desktop": "2.9.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfreetype.so.6"], + "server": [] + } + }, + "tiff": { + "lib_name": "tiff", + "sections_number": "10.13", + "lib_description": "支持标记图像文件格式。", + "version": { + "desktop": "4.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtiff.so.5", + "libtiffxx.so.5"], + "server": [] + } + }, + "libxpm": { + "lib_name": "libxpm", + "sections_number": "10.14", + "lib_description": "X.Org X11 libXpm 运行时库", + "version": { + "desktop": "3.5.12", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXpm.so.4"], + "server": [] + } + }, + "libxdmcp": { + "lib_name": "libxdmcp", + "sections_number": "10.15", + "lib_description": "X 显示管理器控制协议 (XDMCP) 提供了一个统一的自主显示器向远程主机请求登录服务的机制。", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdmcp.so.6"], + "server": [] + } + }, + "libxrandr": { + "lib_name": "libxrandr", + "sections_number": "10.16", + "lib_description": "X.Org X11 libXrandr 运行时库", + "version": { + "desktop": "1.5.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrandr.so.2"], + "server": [] + } + }, + "libglu": { + "lib_name": "libglu", + "sections_number": "10.17", + "lib_description": "OpenGL 实用程序库 (GLU) ,它提供了许多函数,这些函数使用基本 OpenGL 库从 OpenGL 提供的更原始的例程中提供更高级别的绘图例程。", + "version": { + "desktop": "9.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libGLU.so.1"], + "server": [] + } + }, + "libdmx": { + "lib_name": "libdmx", + "sections_number": "10.18", + "lib_description": "X.Org 项目提供了 X Window 系统的开源实现。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdmx.so.1"], + "server": ["libdmx.so.1"] + } + }, + "libdrm": { + "lib_name": "libdrm", + "sections_number": "10.19", + "lib_description": "libdrm 提供了一个用户空间库,用于在支持 ioctl 接口的操作系统上访问 DRM(直接渲染管理器)。", + "version": { + "desktop": "2.4.99", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdrm.so.2", + "libdrm_amdgpu.so.1", + "libdrm_intel.so.1", + "libdrm_nouveau.so.2", + "libdrm_radeon.so.1"], + "server": [] + } + }, + "libxmu": { + "lib_name": "libxmu", + "sections_number": "10.20", + "lib_description": "X.Org X11 libXmu/libXmuu 运行时库", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXmu.so.6", + "libXmuu.so.1"], + "server": [] + } + }, + "libxcb": { + "lib_name": "libxcb", + "sections_number": "10.21", + "lib_description": "X协议C语言绑定 (XCB) ,是 Xlib 的替代品。", + "version": { + "desktop": "1.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-composite.so.0", + "libxcb-damage.so.0", + "libxcb-dpms.so.0", + "libxcb-dri2.so.0", + "libxcb-dri3.so.0", + "libxcb-glx.so.0", + "libxcb-present.so.0", + "libxcb-randr.so.0", + "libxcb-record.so.0", + "libxcb-render.so.0", + "libxcb-res.so.0", + "libxcb-screensaver.so.0", + "libxcb-shape.so.0", + "libxcb-shm.so.0", + "libxcb-sync.so.1", + "libxcb-xf86dri.so.0", + "libxcb-xfixes.so.0", + "libxcb-xinerama.so.0", + "libxcb-xinput.so.0", + "libxcb-xkb.so.1", + "libxcb-xtest.so.0", + "libxcb-xv.so.0", + "libxcb-xvmc.so.0", + "libxcb.so.1"], + "server": [] + } + }, + "libxrender": { + "lib_name": "libxrender", + "sections_number": "10.22", + "lib_description": "X.Org X11 libXrender 运行时库", + "version": { + "desktop": "0.9.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrender.so.1"], + "server": [] + } + }, + "xft": { + "lib_name": "xft", + "sections_number": "10.23", + "lib_description": "Xft 是一个将 X 应用程序与 FreeType 字体连接起来的光栅化库。", + "version": { + "desktop": "2.3.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXft.so.2"], + "server": [] + } + }, + "gdk-pixbuf": { + "lib_name": "gdk-pixbuf", + "sections_number": "10.24", + "lib_description": "创建图形用户界面的多平台工具包", + "version": { + "desktop": "2.38.1", + "server": "" + }, + "alias": [ + { + "name": "gdk-pixbuf2", + "version": { + "desktop": "2.38.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdk_pixbuf-2.0.so.0", + "libgdk_pixbuf_xlib-2.0.so.0", + "libpixbufloader-ani.so", + "libpixbufloader-bmp.so", + "libpixbufloader-gif.so", + "libpixbufloader-icns.so", + "libpixbufloader-ico.so", + "libpixbufloader-jpeg.so", + "libpixbufloader-pnm.so", + "libpixbufloader-qtif.so", + "libpixbufloader-tga.so", + "libpixbufloader-tiff.so", + "libpixbufloader-xbm.so", + "libpixbufloader-xpm.so"], + "server": [] + } + }, + "libfontenc": { + "lib_name": "libfontenc", + "sections_number": "10.25", + "lib_description": "X.Org X11 libfontenc 运行时库。", + "version": { + "desktop": "1.1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontenc.so.1"], + "server": ["libfontenc.so.1"] + } + }, + "libglvnd": { + "lib_name": "libglvnd", + "sections_number": "10.26", + "lib_description": "libglvnd 是一个供应商中立的调度层,用于仲裁多个供应商之间的 OpenGL API 调用。", + "version": { + "desktop": "1.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"], + "server": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"] + } + }, + "libjpeg-turbo": { + "lib_name": "libjpeg-turbo", + "sections_number": "10.27", + "lib_description": "libjpeg-turbo 是一个 JPEG 图像编解码器。", + "version": { + "desktop": "1.5.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libjpeg.so.62", + "libturbojpeg.so.0"], + "server": [] + } + }, + "libpciaccess": { + "lib_name": "libpciaccess", + "sections_number": "10.28", + "lib_description": "为 X 提供访问 PCI 总线和设备的功能平台无关的方式。", + "version": { + "desktop": "0.14", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpciaccess.so.0"], + "server": [] + } + }, + "libpng12": { + "lib_name": "libpng12", + "sections_number": "10.29", + "lib_description": "便携式网络图形格式库", + "version": { + "desktop": "1.2.54", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng12.so"], + "server": [] + } + }, + "libraw": { + "lib_name": "libraw", + "sections_number": "10.30", + "lib_description": "LibRaw 是一个用于从数码相机读取 RAW 文件的库。", + "version": { + "desktop": "0.19.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libraw.so.19"], + "server": [] + } + }, + "libSM": { + "lib_name": "libSM", + "sections_number": "10.31", + "lib_description": "libSM 软件包中包含 X.Org X11 SM 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSM.so.6"], + "server": [] + } + }, + "libwebp": { + "lib_name": "libwebp", + "sections_number": "10.32", + "lib_description": "这是一种对数码照片图像进行有损压缩的图像格式。", + "version": { + "desktop": "0.6.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libwebp.so.6", + "libwebpdemux.so.2", + "libwebpmux.so.3"], + "server": [] + } + }, + "libxres": { + "lib_name": "libxres", + "sections_number": "10.33", + "lib_description": "X-Resource 是一个扩展,它允许客户端向 X 服务器查询各种资源的使用情况。", + "version": { + "desktop": "1.2.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXRes.so.1"], + "server": [] + } + }, + "libxcomposite": { + "lib_name": "libxcomposite", + "sections_number": "10.34", + "lib_description": "X 复合扩展库", + "version": { + "desktop": "0.4.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXcomposite.so.1"], + "server": [] + } + }, + "libxcursor": { + "lib_name": "libxcursor", + "sections_number": "10.35", + "lib_description": "libXcursor 是一个旨在帮助定位和加载游标的库。游标可以从文件或内存中加载。", + "version": { + "desktop": "1.1.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["ibXcursor.so.1"], + "server": [] + } + }, + "libxdamage": { + "lib_name": "libxdamage", + "sections_number": "10.36", + "lib_description": "X Damage Extension 允许应用程序跟踪可绘制对象的修改区域。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdamage.so.1"], + "server": [] + } + }, + "libxfixes": { + "lib_name": "libxfixes", + "sections_number": "10.37", + "lib_description": "X Fixes 扩展为应用程序提供了针对核心协议中各种限制的变通方法。", + "version": { + "desktop": "5.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfixes.so.3"], + "server": [] + } + }, + "libxfont": { + "lib_name": "libxfont", + "sections_number": "10.38", + "lib_description": "libXfont 提供了遗留 X11 字体系统的核心。", + "version": { + "desktop": "2.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfont2.so.2"], + "server": [] + } + }, + "libxi": { + "lib_name": "libxi", + "sections_number": "10.39", + "lib_description": "libXi 是 X 输入扩展的客户端库。", + "version": { + "desktop": "1.7.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXi.so.6"], + "server": [] + } + }, + "libxinerama": { + "lib_name": "libxinerama", + "sections_number": "10.40", + "lib_description": "Xinerama 是 X Window System 的扩展。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXinerama.so.1"], + "server": [] + } + }, + "libxkbcommon": { + "lib_name": "libxkbcommon", + "sections_number": "10.41", + "lib_description": "xkbcommon 是一个用于处理键盘描述的库。", + "version": { + "desktop": "0.8.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbcommon-x11.so.0"], + "server": [] + } + }, + "libxkbfile": { + "lib_name": "libxkbfile", + "sections_number": "10.42", + "lib_description": "X 服务器和实用程序使用 Libxkbfile 来解析 XKB 配置数据文件。", + "version": { + "desktop": "1.0.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbfile.so.1"], + "server": [] + } + }, + "libxklavier": { + "lib_name": "libxklavier", + "sections_number": "10.43", + "lib_description": "这个包是一个为 X 键盘扩展提供高级 API 的库,称为 XKB。", + "version": { + "desktop": "5.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxklavier.so.16"], + "server": [] + } + }, + "cairo": { + "lib_name": "cairo", + "sections_number": "10.44", + "lib_description": "Cairo 是一个支持多种输出设备的 2D 图形库。", + "version": { + "desktop": "1.16.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcairo-gobject.so.2", + "libcairo-script-interpreter.so.2", + "libcairo.so.2"], + "server": [] + } + }, + "fltk1.3": { + "lib_name": "fltk1.3", + "sections_number": "10.45", + "lib_description": "FLTK是一个跨平台的 C++ GUI 工具包。", + "version": { + "desktop": "1.1.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfltk.so.1.3", + "libfltk_forms.so.1.3", + "libfltk_gl.so.1.3", + "libfltk_images.so.1.3"], + "server": [] + } + }, + "libxss": { + "lib_name": "libxss", + "sections_number": "10.46", + "lib_description": "此包包含 X.Org X11 libXss 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXss.so.1"], + "server": [] + } + }, + "libxshmfence": { + "lib_name": "libxshmfence", + "sections_number": "10.47", + "lib_description": "X11 的共享内存栅栏,在 DRI3 中使用。", + "version": { + "desktop": "1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxshmfence.so.1"], + "server": [] + } + }, + "libxt": { + "lib_name": "libxt", + "sections_number": "10.48", + "lib_description": "X.Org X11 libXt 运行时库", + "version": { + "desktop": "1.1.5", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXt.so.6"], + "server": [] + } + }, + "libxtst": { + "lib_name": "libxtst", + "sections_number": "10.49", + "lib_description": "X.Org X11 libXtst 运行时库", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXtst.so.6"], + "server": [] + } + }, + "libxvmc": { + "lib_name": "libxvmc", + "sections_number": "10.50", + "lib_description": "XvMC 是 X 窗口系统的 X 视频扩展 (Xv) 的扩展。", + "version": { + "desktop": "1.0.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXvMC.so.1", + "libXvMCW.so.1"], + "server": [] + } + }, + "libxxf86dga": { + "lib_name": "libxxf86dga", + "sections_number": "10.51", + "lib_description": "XFree86-DGA 扩展的客户端库", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86dga.so.1"], + "server": [] + } + }, + "libxxf86vm": { + "lib_name": "libxxf86vm", + "sections_number": "10.52", + "lib_description": "为 XFree86-VidModeExtension 提供一个扩展库。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86vm.so.1"], + "server": [] + } + }, + "pango1.0": { + "lib_name": "pango1.0", + "sections_number": "10.53", + "lib_description": "Pango 是一个用于布局和渲染文本的库,重点是关于国际化。", + "version": { + "desktop": "1.42.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpango-1.0.so.0", + "libpangocairo-1.0.so.0", + "libpangoft2-1.0.so.0", + "libpangoxft-1.0.so.0"], + "server": [] + } + }, + "pixman": { + "lib_name": "pixman", + "sections_number": "10.54", + "lib_description": "Pixman 是一个用于像素操作的低级软件库,提供图像合成和梯形光栅化等功能。", + "version": { + "desktop": "0.36.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixman-1.so.0"], + "server": [] + } + }, + "qt4-x11": { + "lib_name": "qt4-x11", + "sections_number": "10.55", + "lib_description": "开发应用程序的软件工具包", + "version": { + "desktop": "4.8.7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQtCLucene.so.4", + "libQtCore.so.4", + "libQtDBus.so.4", + "libQtDeclarative.so.4", + "libQtGui.so.4", + "libQtNetwork.so.4", + "libQtScript.so.4", + "libQtSql.so.4", + "libQtXmlPatterns.so.4", + "libQtXml.so.4"], + "server": [] + } + }, + "qtbase-opensource-src": { + "lib_name": "qtbase-opensource-src", + "sections_number": "10.56", + "lib_description": "Qt工具包的核心组件", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5Concurrent.so.5", + "libQt5Core.so.5", + "libQt5DBus.so.5", + "libQt5Network.so.5", + "libQt5Sql.so.5", + "libQt5Test.so.5", + "libQt5Xml.so.5", + "libqconnmanbearer.so", + "libqgenericbearer.so", + "libqnmbearer.so", + "libqsqlite.so"], + "server": [] + } + }, + "qtx11extras-opensource-src": { + "lib_name": "qtx11extras-opensource-src", + "sections_number": "10.57", + "lib_description": "Qt 5 X11额外功能Qt是一个跨平台的c++应用程序框架。Qt的主要特性是它丰富的widget集,提供标准的GUI功能。这个包包含了从Qt 5中访问X11内容的库。", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5X11Extras.so.5"], + "server": [] + } + }, + "xcb-util": { + "lib_name": "xcb-util", + "sections_number": "10.58", + "lib_description": "XCB 工具模块", + "version": { + "desktop": "0.3.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-util.so.1"], + "server": [] + } + }, + "xcb-util-image": { + "lib_name": "xcb-util-image", + "sections_number": "10.59", + "lib_description": "提供XImage和XShmImage功能端口", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-image.so.0"], + "server": [] + } + }, + "xcb-util-keysyms": { + "lib_name": "xcb-util-keysyms", + "sections_number": "10.60", + "lib_description": "标准X键值对转换工具", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-keysyms.so.1"], + "server": [] + } + }, + "xcb-util-renderutil": { + "lib_name": "xcb-util-renderutil", + "sections_number": "10.61", + "lib_description": "渲染扩展工具", + "version": { + "desktop": "0.3.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-render-util.so.0"], + "server": [] + } + }, + "xcb-util-wm": { + "lib_name": "xcb-util-wm", + "sections_number": "10.62", + "lib_description": "窗口管理器", + "version": { + "desktop": "0.4.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-ewmh.so.2", + "libxcb-icccm.so.4"], + "server": [] + } + }, + "xorg-x11-server": { + "lib_name": "xorg-x11-server", + "sections_number": "10.63", + "lib_description": "X.Org X11 X 服务器", + "version": { + "desktop": "1.20.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["modesetting_drv.so", + "libglx.so", + "libexa.so", + "libfbdevhw.so", + "libfb.so", + "libglamoregl.so", + "libint10.so", + "libshadowfb.so", + "libshadow.so", + "libvbe.so", + "libvgahw.so", + "libwfb.so"], + "server": [] + } + }, + "libsdl1.2": { + "lib_name": "libsdl1.2", + "sections_number": "10.64", + "lib_description": "跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、 MPEG播放器和其他应用软件", + "version": { + "desktop": "1.2.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL-1.2.so.0"], + "server": ["libSDL-1.2.so.0"] + } + } + } + }, + "##章节名": "11 多媒体库", + "multimedia": { + "description": { + "chapters_number": "11", + "chapters_Name": "多媒体" + }, + "packages": { + "alsa-lib": { + "lib_name": "alsa-lib", + "sections_number": "11.1", + "lib_description": "编译 ALSA 应用程序的用户空间库", + "version": { + "desktop": "1.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasound.so.2"], + "server": [] + } + }, + "ffmpeg": { + "lib_name": "ffmpeg", + "sections_number": "11.2", + "lib_description": "Linux音视频播放解决方案", + "version": { + "desktop": "4.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavcodec.so.58", + "libavfilter.so.7", + "libavformat.so.58", + "libavresample.so.4", + "libavutil.so.56", + "libpostproc.so.55", + "libswresample.so.3", + "libswscale.so.5"], + "server": [] + } + }, + "gstreamer1.0": { + "lib_name": "gstreamer1.0", + "sections_number": "11.3", + "lib_description": "GStreamer 流媒体框架运行时", + "version": { + "desktop": "1.14.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgstbase-1.0.so.0", + "libgstcheck-1.0.so.0", + "libgstcontroller-1.0.so.0", + "libgstcoreelements.so", + "libgstcoretracers.so", + "libgstnet-1.0.so.0", + "libgstreamer-1.0.so.0"], + "server": [] + } + }, + "libdvdnav": { + "lib_name": "libdvdnav", + "sections_number": "11.4", + "lib_description": "显示 DVD 视频菜单功能库", + "version": { + "desktop": "6.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdnav.so.4"], + "server": [] + } + }, + "libdvdread": { + "lib_name": "libdvdread", + "sections_number": "11.5", + "lib_description": "用于访问 DVD 磁盘的库", + "version": { + "desktop": "6.0.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdread.so.4", "libdvdread.so.7"], + "server": [] + } + }, + "pulseaudio": { + "lib_name": "pulseaudio", + "sections_number": "11.6", + "lib_description": "Linux声音服务器", + "version": { + "desktop": "12.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libalsa-util.so", + "libavahi-wrap.so", + "libbluez5-util.so", + "libcli.so", + "libprotocol-cli.so", + "libprotocol-esound.so", + "libprotocol-http.so", + "libprotocol-native.so", + "libprotocol-simple.so", + "libpulsedsp.so", + "libpulse-mainloop-glib.so.0", + "libpulse-simple.so.0", + "libpulse.so.0", + "libraop.so", + "librtp.so", + "libwebrtc-util.so"], + "server": [] + } + } + } + }, + "##章节名": "12 打印扫描库", + "print_scan": { + "description": { + "chapters_number": "12", + "chapters_Name": "打印扫描" + }, + "packages": { + "cups-filters": { + "lib_name": "cups-filters", + "sections_number": "12.1", + "lib_description": "CUPS 是苹果公司为 Mac OS X 和其他类 UNIX 操作系统开发的基于标准的开源打印系统。CUPS 使用 Internet 打印协议 (IPP) 并提供 System V 和 Berkeley 命令行界面、Web 界面和 C API 来管理打印机和打印作业。该项目提供后端、过滤器和其他软件,cups-filters是过滤器。", + "version": { + "desktop": "1.21.6", + "server": "1.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontembed.so.1", + "libcupsfilters.so.1"], + "server": ["libfontembed.so.1", + "libcupsfilters.so.1"] + } + }, + "sane-backends": { + "lib_name": "sane-backends", + "sections_number": "12.2", + "lib_description": "SANE 应用程序编程接口 (API) ,提供对任何光栅图像扫描仪硬件(平板扫描仪、手持式扫描仪、视频和照相机、图像采集卡等)的标准化访问。", + "version": { + "desktop": "1.0.27", + "server": "1.0.27" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsane.so.1"], + "server": [] + } + } + } + }, + "##章节名": "13 运行时语言库", + "runtime_language": { + "description": { + "chapters_number": "13", + "chapters_Name": "运行时语言" + }, + "packages": { + "python2": { + "lib_name": "python2", + "sections_number": "13.1", + "lib_description": "", + "version": { + "desktop": "2.7.16", + "server": "2.7.16" + }, + "alias": [ + { + "name": "python2.7/python2", + "version": { + "desktop": "2.7.16", + "server": "2.7.16" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpython2.7.so.1"], + "server": ["libpython2.7.so.1"] + } + }, + "openjdk": { + "lib_name": "openjdk", + "sections_number": "13.2", + "lib_description": "OpenJDK 是 Java 标准版 (Java SE) 和 Java 开发工具包 (JDK) 的开源实现。OpenJDK 源代码是这些商业 Java 产品的基础。它包含了Java 运行时环境,用以运行 Java 程序,也包含了 Java 虚拟机和一些别的组成。", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + }, + "alias": [ + { + "name": "openjdk-lts/", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "openjdk-11/", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-11-openjdk/", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-1.8.0-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-wrapper.so.6", + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjawt.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"], + "server": ["libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"] + } + }, + "perl": { + "lib_name": "perl", + "sections_number": "13.3", + "lib_description": "Perl库:开发文件用于开发嵌入Perl解释器的应用程序的文件。", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + }, + "alias": [ + { + "name": "perl/", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + }, + { + "name": "perl-libs", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libperl.so.5.30"], + "server": ["libperl.so.5.28"] + } + } + } + }, + "##章节名": "14 编程开发库", + "development": { + "description": { + "chapters_number": "14", + "chapters_Name": "编程开发" + }, + "packages": { + "libxml2": { + "lib_name": "libxml2", + "sections_number": "14.1", + "lib_description": "Libxml2 是一个xml的c语言版的解析器", + "version": { + "desktop": "2.9.4", + "server": "2.9.7" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxml2.so.2"], + "server": ["libxml2.so.2"] + } + }, + "libunwindb": { + "lib_name": "libunwindb", + "sections_number": "14.2", + "lib_description": "可移植且高效的 C 编程接口 (API),用于确定程序的调用链。", + "version": { + "desktop": "1.2.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libunwind.so.8", + "libunwind-coredump.so.0"], + "server": ["libunwind.so.8", + "libunwind-coredump.so.0"] + } + } + } + }, + "##章节名": "15 基础计算库", + "basic_calculation": { + "description": { + "chapters_number": "15", + "chapters_Name": "基础计算" + }, + "packages": { + "orbit2": { + "lib_name": "orbit2", + "sections_number": "15.1", + "lib_description": "高性能CORBA实现CORBA:一种使程序对象能够在不同的应用程序之间通信、发送请求和接收回复的体系结构,而不管它们的编程语言、操作系统或网络位置如何。", + "version": { + "desktop": "", + "server": "2.14.19" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libORBit-2.so", + "libORBitCosNaming-2.so.0", + "libORBit-imodule-2.so"] + } + }, + "atlas": { + "lib_name": "atlas", + "sections_number": "15.2", + "lib_description": "自动调整线性代数软件:是一种自动生成和优化数值软件的方法。目前,ATLAS为被称为基本线性代数子程序(BLAS)的完整线性代数内核集和LAPACK库中的线性代数例程子集提供了优化版本。", + "version": { + "desktop": "", + "server": "3.10.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libsatlas.so.3", + "libtatlas.so.3"] + } + }, + "lapack": { + "lib_name": "lapack", + "sections_number": "15.3", + "lib_description": "基本线性代数参考实现BLAS(基本线性代数子程序)是一组用于大多数基本向量和矩阵运算的高效例程。它们被广泛用作其他高质量线性代数软件的基础", + "version": { + "desktop": "", + "server": "3.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libblas.so.3", + "liblapack.so.3", + "liblapacke.so.3"] + } + } + } + }, + "##章节名": "16 存储库", + "storage": { + "description": { + "chapters_number": "16", + "chapters_Name": "存储" + }, + "packages": { + "ceph": { + "lib_name": "ceph", + "sections_number": "16.1", + "lib_description": "Ceph是一个开源软件定义的存储平台,它在单个分布式计算机集群上实现对象存储,并提供用于对象,块和文件级存储的3合1接口。Ceph的主要目标是实现无单点故障的完全分布式操作,可扩展到艾字节级别,并且可以免费使用。", + "version": { + "desktop": "", + "server": "2012/2/8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcls_cephfs.so.1", + "libcls_hello.so.1", + "libcls_journal.so.1", + "libcls_kvs.so.1", + "libcls_lock.so.1", + "libcls_log.so.1", + "libcls_lua.so.1", + "libcls_numops.so.1", + "libcls_rbd.so.1", + "libcls_refcount.so.1", + "libcls_replica_log.so.1", + "libcls_rgw.so.1", + "libcls_sdk.so.1", + "libcls_statelog.so.1", + "libcls_timeindex.so.1", + "libcls_user.so.1", + "libcls_version.so.1", + "libceph_snappy.so.1", + "libceph_zlib.so", + "libceph_zstd.so", + "libec_jerasure.so", + "libec_jerasure_generic.so", + "libec_jerasure_neon.so", + "libec_lrc.so", + "libec_shec.so", + "libec_shec_generic.so", + "libec_shec_neon.so", + "libosd_tp.so", + "libos_tp.so"] + } + } + } + }, + "##章节名": "17 虚拟化库", + "virtualization": { + "description": { + "chapters_number": "17", + "chapters_Name": "虚拟化" + }, + "packages": { + "libvirt": { + "lib_name": "libvirt", + "sections_number": "17.1", + "lib_description": "用于管理虚拟化平台的开源的API,后台程序和管理工具。", + "version": { + "desktop": "", + "server": "5.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libvirt-admin.so.0", + "libvirt-lxc.so.0", + "libvirt-qemu.so.0", + "libvirt.so.0", + "libvirt_driver_interface.so", + "libvirt_driver_network.so", + "libvirt_driver_nodedev.so", + "libvirt_driver_nwfilter.so", + "libvirt_driver_qemu.so", + "libvirt_driver_secret.so", + "libvirt_driver_storage.so", + "lockd.so", + "libvirt_storage_backend_disk.so", + "libvirt_storage_backend_fs.so", + "libvirt_storage_backend_iscsi.so", + "libvirt_storage_backend_iscsi-direct.so", + "libvirt_storage_backend_logical.so", + "libvirt_storage_backend_mpath.so", + "libvirt_storage_backend_rbd.so", + "libvirt_storage_backend_scsi.so", + "libvirt_storage_backend_gluster.so", + "libvirt_storage_file_gluster.so", + "libvirt_storage_file_fs.so"] + } + } + } + }, + "##章节名": "18 集群高可用库", + "high_availability": { + "description": { + "chapters_number": "18", + "chapters_Name": "集群高可用" + }, + "packages": { + "pacemaker": { + "lib_name": "pacemaker", + "sections_number": "18.1", + "lib_description": "Pacemaker是一种先进的、可扩展的高可用性集群资源管理器", + "version": { + "desktop": "", + "server": "2.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcib.so.27", + "libcrmcommon.so.34", + "libcrmservice.so.28", + "liblrmd.so.28", + "libpacemaker.so.1", + "libstonithd.so.26", + "libpe_rules.so.26", + "libpe_status.so.28"] + } + }, + "corosync": { + "lib_name": "corosync", + "sections_number": "18.2", + "lib_description": "Corosync 集群引擎和应用程序编程接口", + "version": { + "desktop": "", + "server": "3.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcfg.so.7", + "libcmap.so.4", + "libcorosync_common.so.4", + "libcpg.so.4", + "libquorum.so.5", + "libsam.so.4", + "libvotequorum.so.8"] + } + } + } + } + } + } +} diff --git a/Jsons/lib_list_1.0I-202329.json b/Jsons/lib_list_1.0I-202329.json new file mode 100644 index 0000000000000000000000000000000000000000..0dc86e1705f1d8c29345f955bc8d801d510aea76 --- /dev/null +++ b/Jsons/lib_list_1.0I-202329.json @@ -0,0 +1,5122 @@ +{ + "std_description": { + "std_name": "操作系统应用编程接口", + "std_number": "T/CESA-XXXX-2022", + "##std_version": "标准的版本标识,仅供作为本json描述文件的标识使用,由标准版本号+类别组成,标准第一版为1.0,勘误增加小版本号如1.1,标准修订增加大版本号2.0;", + "##std_version": "标准类别用1位大写字母,I表示团标,S电子信息行标,G表示国标", + "std_version": "1.0I", + "etc": "这是《操作系统应用编程接口》标准运行库描述文件,是《操作系统应用编程接口》标准符合性测试工具的组成部分;" + }, + "CopyRight": { + "License": "本文件遵循木兰协议xxxxxx", + "comment": "", + "Author": "贡献者:XXX@cesi,xxx@uitech,xxx@huawei,xxx@kylinos" + }, + "##libs": "标准规定动库包", + "libs": { + "##libs_location": "查询共享对象库的路径,与标准规定了文件系统层次结构保持一致", + "lib_location": [ + "/lib", + "/lib64", + "/usr/lib" + ], + "category": { + + "##章节名": "7 基础库", + "base": { + "description": { + "##chapters_number": "库对应标准章号,做完日志或错误等输出记录标识,可用于反查标准", + "chapters_number": "7", + "chapters_Name": "基础" + }, + "packages": { + "##glibc": "包名,考虑到编译后名称二进制安装包可能会存在差异,一般以源码包去命名,做完匹配符,用以检查安装的运行库是否存在,同aliasname。后面不在赘述", + "glibc": { + "##lib_name": "包名,一般与外部名称应该一致", + "lib_name": "glibc", + "##sections_number": "库包对应标准节号,当符合性检查出现错误或警告时,可用于标准反查", + "sections_number": "7.1", + "##lib_description": "库的介绍,可能会被删除,仅作为识读使用,不参与符合性检查,值可以置空", + "lib_description": "该软件包包括标准C库的共享版本以及标准数学库,以及其他许多库。", + "##version": "最低版本要求,'desktop_version':桌面OS,'server_version',服务器OS", + "##version": "版本位次检查规则:如果版号有n位,则前n-1位不可变,第n位版本号比低于版本要求;如果版号中含有字母或特殊字符另行扩充判定规则", + "version": { + "desktop": "2.28", + "server": "2.28" + }, + "##aliasname": "包的别名,考虑由于来源差异,部分包命及版本规则与包的根社区不一致,标准特对少部分包增加别名及特点版本要求,标准名和别名应遍历查找", + "##aliaversion": "别名对应版本,如果没有特殊要求,应与标准版一致;如果别名有多个,那么版本号也应该是多个,保持一一对应,多个别名对一个版本", + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "libc6", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "libnsl", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "nss_modules", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "nss_nis-3.0", + "version": { + "desktop": "2.28", + "server": "2.28" + } + } + ], + "##necessity": "必要性", + "##necessity": "第一位:L0表示对应平台不作要求,L1长期兼容库,L2兼容库,L3试用版本;如果是L0,则第二项可以置空'';L1与L2在符合性检查没有明显区别,主要是为了区别标准的长期性承诺", + "##necessity": "第二位:basic表示基本,基本ISO安装应提供该库,expansion表示扩展,该库可以通过扩展光盘或仓库提供,当兼容性级别为'L0'时,本项可置空,不再做检查,也不再做共享对象的检查", + "##necessity": "第三位:Deprecated表示不推荐,即不推荐应用调用,为兼容历史应用要求操作系统提供的库,操作性系统符合性检查时忽略该项,应用如果依赖该类库应给出告警", + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "##share_objs": "库所要求的共享对象名清单;当'share_objs'存在时表示桌面与服务器的要求一致(或对其中一类操作系统无要求);如果不存在则表示,按操作系统类别分别比较", + "##share_objs": "只有标准要求的共享对象(或符号链接)都存在才符合标准。如果是个符号链接,应查询到对应的实体库,并查验对应其符号链是否与查询到的符号链接文件是否一致", + "share_objs": { + "desktop": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"], + "server": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"] + } + }, + "elfutils": { + "lib_name": "elfutils", + "sections_number": "7.2", + "lib_description": "用于处理 ELF 文件和 DWARF 数据的应用程序集合", + "version": { + "desktop": "0.176", + "server": "0.176" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"], + "server": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"] + } + }, + "pam": { + "lib_name": "pam", + "sections_number": "7.3", + "lib_description": "Linux身份验证模块", + "version": { + "desktop": "1.3.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"], + "server": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"] + } + }, + "zlib": { + "lib_name": "zlib", + "sections_number": "7.4", + "lib_description": "无损数据压缩库", + "version": { + "desktop": "1.2.11", + "server": "1.2.11" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libz.so.1"], + "server": ["libz.so.1"] + } + }, + "gcc": { + "lib_name": "gcc", + "sections_number": "7.5", + "lib_description": "GNU 的编译器集合 包括对 ,C、C++、Fortran、Object-C、Object-C++、Go、D、等的支持。当前是 GCC 8 的实现版本。", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + }, + "alias": [ + { + "name": "gcc-7", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-8", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-9", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-10", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libstdc++", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libatomic", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libubsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libtsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libitm", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "liblsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatomic.so.1", + "libcc1.so", + "libcc1plugin.so", + "libcp1plugin.so", + "libgcc_s_x32.so", + "libgcc_s.so.1", + "libgdruntime.so.76", + "libgnarl-8.so.1", + "libgnarl.so", + "libgnat-8.so.1", + "libgnat.so", + "libgo.so.13", + "libgomp.so.1", + "libgphobos.so.76", + "libhsail-rt.so.0", + "libitm.so.1", + "liblsan.so.0", + "liblto_plugin.so.0", + "libmpx.so.2", + "libstdc++.so.6", + "libubsan.so.1"], + "server": ["libatomic.so.1", + "libgcc_s.so.1", + "libgomp.so.1", + "libstdc++.so.6"] + } + }, + "krb5": { + "lib_name": "krb5", + "sections_number": "7.6", + "lib_description": "Kerberos 网络身份验证协议", + "version": { + "desktop": "1.17", + "server": "1.17" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"], + "server": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"] + } + }, + "libxcrypt": { + "lib_name": "libxcrypt", + "sections_number": "7.7", + "lib_description": "实现加密和解密的库", + "version": { + "desktop": "4.4.10", + "server": "4.4.4" + }, + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "4.4.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypt.so.1"], + "server": ["libcrypt.so.1"] + } + }, + "audit": { + "lib_name": "audit", + "sections_number": "7.8", + "lib_description": "用于内核审计的用户空间工具", + "version": { + "desktop": "2.8.4", + "server": "2.8.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaudit.so.1", + "libauparse.so.0"], + "server": ["libaudit.so.1", + "libauparse.so.0"] + } + }, + "bzip2": { + "lib_name": "bzip2", + "sections_number": "7.9", + "lib_description": "高质量的数据压缩器", + "version": { + "desktop": "1.0.6", + "server": "1.0.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbz2.so.1"], + "server": ["libbz2.so.1"] + } + }, + "dbus": { + "lib_name": "dbus", + "sections_number": "7.10", + "lib_description": "消息总线系统,用于应用间通信。提供系统留守进程和用户登录留守进程", + "version": { + "desktop": "1.12.16", + "server": "1.12.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-1.so.3"], + "server": ["libdbus-1.so.3"] + } + }, + "expat": { + "lib_name": "expat", + "sections_number": "7.11", + "lib_description": "expat 是一个用 C 语言编写的面向流的 XML 解析器库", + "version": { + "desktop": "2.2.6", + "server": "2.2.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libexpat.so.1"], + "server": ["libexpat.so.1"] + } + }, + "glib2": { + "lib_name": "glib2", + "sections_number": "7.12", + "lib_description": "构成 GTK+ 和 GNOME 等项目基础的核心库", + "version": { + "desktop": "2.58", + "server": "2.56" + }, + "alias": [ + { + "name": "glib2.0", + "version": { + "desktop": "2.58", + "server": "2.56" + } + }, + { + "name": "glib2", + "version": { + "desktop": "2.58", + "server": "2.56" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"], + "server": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"] + } + }, + "gmp": { + "lib_name": "gmp", + "sections_number": "7.13", + "lib_description": "一个 GNU 多精度算术库", + "version": { + "desktop": "6.1.2", + "server": "6.1.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgmp.so.10"], + "server": ["libgmp.so.10"] + } + }, + "libidn2": { + "lib_name": "libidn2", + "sections_number": "7.14", + "lib_description": "GNU libidn2是GNU libidn的后继者。standalone lib。包含IDNA2008,Punycode 和 Unicode TR46 的实现。通过IETF国际域名(IDN)实施字符串预处理、Punycode和IDNA规格定义的包", + "version": { + "desktop": "2.0.5", + "server": "2.0.5" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libidn2.so.0"], + "server": ["libidn2.so.0"] + } + }, + "ncurses": { + "lib_name": "ncurses", + "sections_number": "7.15", + "lib_description": "终端控制库", + "version": { + "desktop": "6.1.1", + "server": "6.1" + }, + "alias": [ + { + "name": "ncurses", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + }, + { + "name": "ncurses-libs", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"], + "server": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"] + } + }, + "xz": { + "lib_name": "xz", + "sections_number": "7.16", + "lib_description": "一款免费的通用数据压缩软件,采用 LZMA2 算法", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + }, + "alias": [ + { + "name": "xz-utils", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + }, + { + "name": "xz", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liblzma.so.5"], + "server": ["liblzma.so.5"] + } + }, + "libcap": { + "lib_name": "libcap", + "sections_number": "7.17", + "lib_description": "这是一个用于获取和设置 POSIX.1e(以前的 POSIX 6)草案 15 功能的库。", + "version": { + "desktop": "2.25", + "server": "2.26" + }, + "alias": [ + { + "name": "libcap", + "version": { + "desktop": "2.25", + "server": "2.26" + } + }, + { + "name": "libcap2", + "version": { + "desktop": "2.25", + "server": "2.26" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcap.so.2"], + "server": ["libcap.so.2"] + } + }, + "popt": { + "lib_name": "popt", + "sections_number": "7.18", + "lib_description": "解析命令行选项的库。它不使用全局变量,因此可以在解析argv时进行多次传递;它可以解析任意argv样式元素的数组,允许解析来自任何源的命令行字符串;它提供了选项别名的标准方法;它可以执行外部选项过滤器;它可以自动为应用程序生成帮助和使用信息。", + "version": { + "desktop": "1.16", + "server": "1.16" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpopt.so.0"], + "server": ["libpopt.so.0"] + } + }, + "libnl3": { + "lib_name": "libnl3", + "sections_number": "7.19", + "lib_description": "libnl 套件是一组库,为基于 netlink 协议的 Linux 内核接口提供 API。", + "version": { + "desktop": "3.4.0", + "server": "3.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"], + "server": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"] + } + }, + "libsecret": { + "lib_name": "libsecret", + "sections_number": "7.20", + "lib_description": "libsecret 是一个用于存储和检索密码和其他机密的库。它使用 D-Bus 与“Secret Service”通信。gnome-keyring 和 ksecretservice 都是 Secret Service 的实现。", + "version": { + "desktop": "0.18.7", + "server": "0.18.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsecret-1.so.0"], + "server": ["libsecret-1.so.0"] + } + }, + "libIDL": { + "lib_name": "libIDL", + "sections_number": "7.21", + "lib_description": "libIDL是一个包含接口定义语言文件的库 。这是定义可移植接口的规范。", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + }, + "alias": [ + { + "name": "libIDL", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + } + }, + { + "name": "libidl", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libIDL-2.so.0"], + "server": ["libIDL-2.so.0"] + } + }, + "libtalloc": { + "lib_name": "libtalloc", + "sections_number": "7.22", + "lib_description": "libtalloc 包提供了一个使用析构函数实现分层内存分配器的库。", + "version": { + "desktop": "2.1.14", + "server": "2.2.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtalloc.so.2"], + "server": ["libtalloc.so.2"] + } + }, + "libtevent": { + "lib_name": "libtevent", + "sections_number": "7.23", + "lib_description": "libtevent 包提供 Tevent,一个基于talloc 内存管理库的事件系统。Tevent 支持多种事件类型,包括定时器、信号和经典的文件描述符事件。Tevent 还提供帮助器来处理提供 tevent_req(Tevent 请求)函数的异步代码。", + "version": { + "desktop": "0.9.37", + "server": "0.10.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtevent.so.0"], + "server": ["libtevent.so.0"] + } + }, + "dbus-glib": { + "lib_name": "dbus-glib", + "sections_number": "7.24", + "lib_description": "对DBus的GNOME GLib接口工具及函数库", + "version": { + "desktop": "0.110", + "server": "0.110" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-glib-1.so.2"], + "server": [] + } + }, + "attr": { + "lib_name": "attr", + "sections_number": "7.25", + "lib_description": "文件系统及文件扩展属性管理功能库", + "version": { + "desktop": "2.4.48", + "server": "2.4.48" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libattr.so.1"], + "server": [] + } + }, + "libevent": { + "lib_name": "libevent", + "sections_number": "7.26", + "lib_description": "当文件描述符上发生特定事件或达到超时后, libevent API 提供了一种执行回调函数的机制。此外,libevent还支持由于信号或常规超时而引起的回调。libevent旨在替换事件驱动网络服务器中的事件循环。", + "version": { + "desktop": "2.1.8", + "server": "2.1.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"], + "server": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"] + } + }, + "accountsservice": { + "lib_name": "accountsservice", + "sections_number": "7.27", + "lib_description": "用户管理(账户维护)", + "version": { + "desktop": "0.6.45", + "server": "0.6.50" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaccountsservice.so.0"], + "server": ["libaccountsservice.so.0"] + } + }, + "libmpc": { + "lib_name": "libmpc", + "sections_number": "7.28", + "lib_description": "用于多精度复杂算术的 C 库", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + }, + "alias": [ + { + "name": "libmpc3", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + }, + { + "name": "libmpc", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpc.so.3"], + "server": ["libmpc.so.3"] + } + }, + "mpfr": { + "lib_name": "mpfr", + "sections_number": "7.29", + "lib_description": "多精度浮点计算 C 库", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + }, + "alias": [ + { + "name": "mpfr4", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + }, + { + "name": "mpfr", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpfr.so.6"], + "server": ["libmpfr.so.4"] + } + }, + "ndctl": { + "lib_name": "ndctl", + "sections_number": "7.30", + "lib_description": "DAX(直接访问)协议支持工具", + "version": { + "desktop": "63", + "server": "63" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdaxctl.so.1"], + "server": ["libdaxctl.so.1"] + } + }, + "file": { + "lib_name": "file", + "sections_number": "7.31", + "lib_description": "识别特定文件类型的工具", + "version": { + "desktop": "5.35", + "server": "5.33" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmagic.so.1"], + "server": ["libmagic.so.1"] + } + }, + "gdbm": { + "lib_name": "gdbm", + "sections_number": "7.32", + "lib_description": "一个使用可扩展散列的数据库函数库", + "version": { + "desktop": "1.18", + "server": "1.18" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdbm.so.6", + "libgdbm_compat.so.4"], + "server": ["libgdbm.so.6", + "libgdbm_compat.so.4"] + } + }, + "keyutils": { + "lib_name": "keyutils", + "sections_number": "7.33", + "lib_description": "Linux 密钥管理程序", + "version": { + "desktop": "1.6", + "server": "1.5.10" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libkeyutils.so.1"], + "server": ["libkeyutils.so.1"] + } + }, + "libedit": { + "lib_name": "libedit", + "sections_number": "7.34", + "lib_description": "提供通用行编辑、历史记录和标记功能", + "version": { + "desktop": "3.1", + "server": "3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libedit.so.2"], + "server": ["libedit.so.0"] + } + }, + "kcodecs": { + "lib_name": "kcodecs", + "sections_number": "7.35", + "lib_description": "操作字符串的方法的集合KCodecs提供了一组操作字符串的方法使用不同的编码。", + "version": { + "desktop": "5.54.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libKF5Codecs.so.5"], + "server": [] + } + }, + "fcitx": { + "lib_name": "fcitx", + "sections_number": "7.36", + "lib_description": "fcitx输入法的核心功能库", + "version": { + "desktop": "4.2.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfcitx-core.so.0", + "libfcitx-gclient.so.1", + "libfcitx-utils.so.0"], + "server": [] + } + }, + "libsdl-ttf2.0": { + "lib_name": "libsdl-ttf2.0", + "sections_number": "7.37", + "lib_description": "允许SDL应用程序中使用TrueType字体", + "version": { + "desktop": "2.0.11", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL_ttf-2.0.so.0"], + "server": [] + } + } + } + }, + "##章节名": "8 系统安全库", + "security": { + "description": { + "chapters_number": "8", + "chapters_Name": "系统安全" + }, + "packages": { + "acl": { + "lib_name": "acl", + "sections_number": "8.1", + "lib_description": "管理访问控制列表。", + "version": { + "desktop": "2.2.53", + "server": "2.2.53" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libacl.so.1"], + "server": ["libacl.so.1"] + } + }, + "cyrus-sasl": { + "lib_name": "cyrus-sasl", + "sections_number": "8.2", + "lib_description": "SASL是简单的权限验证和安全层,可添加基于连接的协议的验证支持。", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + }, + "alias": [ + { + "name": "cyrus-sasl2", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + }, + { + "name": "cyrus-sasl", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsasl2.so.2", + "libanonymous.so.2", + "libsasldb.so.2", + "libcrammd5.so.2", + "libdigestmd5.so.2", + "libgs2.so.2", + "libgssapiv2.so.2", + "libldapdb.so.2", + "liblogin.so.2", + "libntlm.so.2", + "libplain.so.2", + "libscram.so.2"], + "server": ["libsasl2.so.3", + "libanonymous.so.3", + "libsasldb.so.3", + "libcrammd5.so.3", + "libdigestmd5.so.3", + "libgs2.so.3", + "libgssapiv2.so.3", + "libldapdb.so.3", + "liblogin.so.3", + "libntlm.so.3", + "libplain.so.3", + "libscram.so.3"] + } + }, + "libgcrypt": { + "lib_name": "libgcrypt", + "sections_number": "8.3", + "lib_description": "通用加密库。", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + }, + "alias": [ + { + "name": "libgcrypt20", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + }, + { + "name": "libgcrypt", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgcrypt.so.20"], + "server": ["libgcrypt.so.20"] + } + }, + "liboauth": { + "lib_name": "liboauth", + "sections_number": "8.4", + "lib_description": "oauth是一种关于授权方式的协议标准。", + "version": { + "desktop": "1.0.3", + "server": "1.0.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liboauth.so.0"], + "server": ["liboauth.so.0"] + } + }, + "gnutls": { + "lib_name": "gnutls", + "sections_number": "8.5", + "lib_description": "gnutls全称 GNU TransportLayerSecurity Library,即基于GNU版权协议的传输层安全协议,是wget支持https中的ssl协议的基础库。", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + }, + "alias": [ + { + "name": "gnutls28", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + }, + { + "name": "gnutls", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"], + "server": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"] + } + }, + "libssh": { + "lib_name": "libssh", + "sections_number": "8.6", + "lib_description": "libssh 是一个用以访问SSH服务的C语言开发包,通过它可以执行远程命令、文件传输,同时为远程的程序提供安全的传输通道。", + "version": { + "desktop": "0.8.7", + "server": "0.8.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh.so.4"], + "server": ["libssh.so.4", + "libssh_threads.so.4"] + } + }, + "libssh2": { + "lib_name": "libssh2", + "sections_number": "8.7", + "lib_description": "libssh2是一个C 函数库,用来实现SSH2协议。主要功能:Key Exchange Methods,Hostkey Type,Ciphers,Compression Schemes,MAC hashes等", + "version": { + "desktop": "1.8.0", + "server": "1.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh2.so.1"], + "server": ["libssh2.so.1"] + } + }, + "cracklib": { + "lib_name": "cracklib", + "sections_number": "8.8", + "lib_description": "密码安全测试工具。", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + }, + "alias": [ + { + "name": "cracklib2", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + } + }, + { + "name": "cracklib", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrack.so.2"], + "server": ["libcrack.so.2"] + } + }, + "nspr": { + "lib_name": "nspr", + "sections_number": "8.9", + "lib_description": "包含线程、文件和网络I/O、内存管理等的运行时库。", + "version": { + "desktop": "4.20.1", + "server": "4.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnspr4.so", + "libplc4.so", + "libplds4.so"], + "server": ["libnspr4.so", + "libplc4.so", + "libplds4.so"] + } + }, + "openssl": { + "lib_name": "openssl", + "sections_number": "8.10", + "lib_description": "具有 TLS 实现的通用加密库中的实用程序,添加国密算法SM2 SM3 SMS4", + "version": { + "desktop": "1.1.1d", + "server": "1.1.1c" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypto.so.1.1", + "libssl.so.1.1"], + "server": ["libcrypto.so.1.1", + "libssl.so.1.1"] + } + } + } + }, + "##章节名": "9 网络服务库", + "network": { + "description": { + "chapters_number": "9", + "chapters_Name": "网络服务" + }, + "packages": { + "Networkmanager": { + "lib_name": "Networkmanager", + "sections_number": "9.1", + "lib_description": "网络链接管理器和用户应用程序。", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + }, + "alias": [ + { + "name": "network-manager", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + } + }, + { + "name": "Networkmanager", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm.so.0", + "libnm-wwan.so", + "nm-pppd-plugin.so"], + "server": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-ovs.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm-settings-plugin-ifcfg-rh.so", + "libnm.so.0", + "libnm-wwan.so"] + } + }, + "sssd": { + "lib_name": "sssd", + "sections_number": "9.2", + "lib_description": "管理对远程目录的访问和权限验证", + "version": { + "desktop": "1.16.3", + "server": "1.16.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"], + "server": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"] + } + }, + "libtirpc": { + "lib_name": "libtirpc", + "sections_number": "9.3", + "lib_description": "libtirpc包包含支持使用远程过程调用 (RPC) API 的程序的库 。", + "version": { + "desktop": "1.1.4", + "server": "1.1.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtirpc.so.3"], + "server": ["libtirpc.so.3"] + } + }, + "nss": { + "lib_name": "nss", + "sections_number": "9.4", + "lib_description": "网络安全服务。", + "version": { + "desktop": "3.42.1", + "server": "3.40.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnss3.so", + "libsmime3.so", + "libssl3.so"], + "server": ["libnss3.so", + "libnsssysinit.so", + "libsmime3.so", + "libssl3.so"] + } + }, + "libpcap": { + "lib_name": "libpcap", + "sections_number": "9.5", + "lib_description": "libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。著名的软件TCPDUMP就是在libpcap的的基础上开发而成的", + "version": { + "desktop": "1.8.1", + "server": "1.9.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpcap.so.1"], + "server": ["libpcap.so.1"] + } + }, + "curl": { + "lib_name": "curl", + "sections_number": "9.6", + "lib_description": "命令行或脚本数据传输工具", + "version": { + "desktop": "7.64.1", + "server": "7.61.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcurl.so.4"], + "server": ["libcurl.so.4"] + } + }, + "iptables": { + "lib_name": "iptables", + "sections_number": "9.7", + "lib_description": "IP包过滤管理工具", + "version": { + "desktop": "1.8.2", + "server": "1.8.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.2", + "libip6tc.so.2", + "libxtables.so.12"], + "server": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.0", + "libip6tc.so.0", + "libiptc.so.0", + "libxtables.so.12"] + } + }, + "bind": { + "lib_name": "bind", + "sections_number": "9.8", + "lib_description": "包括操作 DNS 服务器的组件", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + }, + "alias": [ + { + "name": "bind9", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + }, + { + "name": "bind", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbind9.so.161", + "libisccc.so.161", + "liblwres.so.161"], + "server": ["libbind9.so.160", + "libisccc.so.160", + "liblwres.so.160"] + } + }, + "cifs-utils": { + "lib_name": "cifs-utils", + "sections_number": "9.9", + "lib_description": "通用网络文件系统。", + "version": { + "desktop": "6.8", + "server": "6.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["idmapwb.so", + "pam_cifscreds.so"], + "server": ["idmapwb.so", + "pam_cifscreds.so"] + } + }, + "atkmm": { + "lib_name": "atkmm", + "sections_number": "9.10", + "lib_description": "atk库的C++绑定。", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + }, + "alias": [ + { + "name": "atkmm1.6", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + }, + { + "name": "atkmm", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatkmm-1.6.so.11"], + "server": ["libatkmm-1.6.so.11"] + } + }, + "avahi": { + "lib_name": "avahi", + "sections_number": "9.11", + "lib_description": "通过mDNS/DNS-SD协议发现本地网络上的服务。", + "version": { + "desktop": ".7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavahi-core.so.7", + "libavahi-glib.so.1", + "libavahi-client.so.3", + "libavahi-common.so.3", + "libavahi-gobject.so.0", + "libavahi-ui-gtk3.so.0"], + "server": [] + } + }, + "dhcp": { + "lib_name": "dhcp", + "sections_number": "9.12", + "lib_description": "动态分配DHCP", + "version": { + "desktop": "", + "server": "4.3.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libdhcpctl.so", + "libomapi.so"] + } + }, + "iproute": { + "lib_name": "iproute", + "sections_number": "9.13", + "lib_description": "命令行网络工具", + "version": { + "desktop": " 4.20.0", + "server": "" + }, + "alias": [ + { + "name": "iproute2", + "version": { + "desktop": " 4.20.0", + "server": "" + } + }, + { + "name": "iproute", + "version": { + "desktop": " 4.20.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["m_ipt.so"], + "server": [] + } + } + } + }, + "##章节名": "10 图形库", + "graphic": { + "description": { + "chapters_number": "10", + "chapters_Name": "图形" + }, + "packages": { + "atk": { + "lib_name": "atk", + "sections_number": "10.1", + "lib_description": "提供给应用程序的可访问性的编程接口。", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + }, + "alias": [ + { + "name": "atk1.0", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + }, + { + "name": "atk", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-1.0.so.0"], + "server": ["libatk-1.0.so.0"] + } + }, + "gtk2": { + "lib_name": "gtk2", + "sections_number": "10.2", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + }, + "alias": [ + { + "name": "gtk+2.0", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + }, + { + "name": "gtk2", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"], + "server": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"] + } + }, + "gtk3": { + "lib_name": "gtk3", + "sections_number": "10.3", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + }, + "alias": [ + { + "name": "gtk+3.0", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + } + }, + { + "name": "gtk3", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"], + "server": ["libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"] + } + }, + "libICE": { + "lib_name": "libICE", + "sections_number": "10.4", + "lib_description": "X.Org X11 ICE 运行时库", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + }, + "alias": [ + { + "name": "libice", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + }, + { + "name": "libICE", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libICE.so.6"], + "server": ["libICE.so.6"] + } + }, + "libxext": { + "lib_name": "libxext", + "sections_number": "10.5", + "lib_description": "X.Org 项目提供了 X Window System.X.Org X11 libXext 的开源实现,包含运行时库。", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + }, + "alias": [ + { + "name": "libxext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + }, + { + "name": "libXext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXext.so.6"], + "server": ["libXext.so.6"] + } + }, + "libpng1.6": { + "lib_name": "libpng1.6", + "sections_number": "10.6", + "lib_description": "libpng 包包含其他程序用于读取和写入 PNG 格式文件的库。", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + }, + "alias": [ + { + "name": "libpng1.6", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + } + }, + { + "name": "libpng", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng16.so.16"], + "server": ["libpng16.so.16"] + } + }, + "libx11": { + "lib_name": "libx11", + "sections_number": "10.7", + "lib_description": "Core X11 协议客户端库", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + }, + "alias": [ + { + "name": "libx11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + }, + { + "name": "libX11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libX11-xcb.so.1", + "libX11.so.6"], + "server": ["libX11-xcb.so.1", + "libX11.so.6"] + } + }, + "libsdl2": { + "lib_name": "libsdl2", + "sections_number": "10.8", + "lib_description": "SDL的重构版", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + }, + "alias": [ + { + "name": "libsdl2", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + } + }, + { + "name": "SDL2", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL2-2.0.so.0"], + "server": [] + } + }, + "libxau": { + "lib_name": "libxau", + "sections_number": "10.9", + "lib_description": "用于提供对 X Window 的单独访问系统显示。", + "version": { + "desktop": "1.0.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXau.so.6"], + "server": [] + } + }, + "libxaw": { + "lib_name": "libxaw", + "sections_number": "10.10", + "lib_description": "Xaw 是一个基于 X Toolkit Intrinsics (Xt) 库的小部件集。", + "version": { + "desktop": "1.0.13", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXaw.so.7"], + "server": [] + } + }, + "fontconfig": { + "lib_name": "fontconfig", + "sections_number": "10.11", + "lib_description": "Fontconfig 根据应用程序指定的要求提供不同的字体。", + "version": { + "desktop": "2.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontconfig.so.1"], + "server": [] + } + }, + "freetype": { + "lib_name": "freetype", + "sections_number": "10.12", + "lib_description": "字体渲染软件库。", + "version": { + "desktop": "2.9.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfreetype.so.6"], + "server": [] + } + }, + "tiff": { + "lib_name": "tiff", + "sections_number": "10.13", + "lib_description": "支持标记图像文件格式。", + "version": { + "desktop": "4.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtiff.so.5", + "libtiffxx.so.5"], + "server": [] + } + }, + "libxpm": { + "lib_name": "libxpm", + "sections_number": "10.14", + "lib_description": "X.Org X11 libXpm 运行时库", + "version": { + "desktop": "3.5.12", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXpm.so.4"], + "server": [] + } + }, + "libxdmcp": { + "lib_name": "libxdmcp", + "sections_number": "10.15", + "lib_description": "X 显示管理器控制协议 (XDMCP) 提供了一个统一的自主显示器向远程主机请求登录服务的机制。", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdmcp.so.6"], + "server": [] + } + }, + "libxrandr": { + "lib_name": "libxrandr", + "sections_number": "10.16", + "lib_description": "X.Org X11 libXrandr 运行时库", + "version": { + "desktop": "1.5.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrandr.so.2"], + "server": [] + } + }, + "libglu": { + "lib_name": "libglu", + "sections_number": "10.17", + "lib_description": "OpenGL 实用程序库 (GLU) ,它提供了许多函数,这些函数使用基本 OpenGL 库从 OpenGL 提供的更原始的例程中提供更高级别的绘图例程。", + "version": { + "desktop": "9.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libGLU.so.1"], + "server": [] + } + }, + "libdmx": { + "lib_name": "libdmx", + "sections_number": "10.18", + "lib_description": "X.Org 项目提供了 X Window 系统的开源实现。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdmx.so.1"], + "server": ["libdmx.so.1"] + } + }, + "libdrm": { + "lib_name": "libdrm", + "sections_number": "10.19", + "lib_description": "libdrm 提供了一个用户空间库,用于在支持 ioctl 接口的操作系统上访问 DRM(直接渲染管理器)。", + "version": { + "desktop": "2.4.99", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdrm.so.2", + "libdrm_amdgpu.so.1", + "libdrm_nouveau.so.2", + "libdrm_radeon.so.1"], + "server": [] + } + }, + "libxmu": { + "lib_name": "libxmu", + "sections_number": "10.20", + "lib_description": "X.Org X11 libXmu/libXmuu 运行时库", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXmu.so.6", + "libXmuu.so.1"], + "server": [] + } + }, + "libxcb": { + "lib_name": "libxcb", + "sections_number": "10.21", + "lib_description": "X协议C语言绑定 (XCB) ,是 Xlib 的替代品。", + "version": { + "desktop": "1.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-composite.so.0", + "libxcb-damage.so.0", + "libxcb-dpms.so.0", + "libxcb-dri2.so.0", + "libxcb-dri3.so.0", + "libxcb-glx.so.0", + "libxcb-present.so.0", + "libxcb-randr.so.0", + "libxcb-record.so.0", + "libxcb-render.so.0", + "libxcb-res.so.0", + "libxcb-screensaver.so.0", + "libxcb-shape.so.0", + "libxcb-shm.so.0", + "libxcb-sync.so.1", + "libxcb-xf86dri.so.0", + "libxcb-xfixes.so.0", + "libxcb-xinerama.so.0", + "libxcb-xinput.so.0", + "libxcb-xkb.so.1", + "libxcb-xtest.so.0", + "libxcb-xv.so.0", + "libxcb-xvmc.so.0", + "libxcb.so.1"], + "server": [] + } + }, + "libxrender": { + "lib_name": "libxrender", + "sections_number": "10.22", + "lib_description": "X.Org X11 libXrender 运行时库", + "version": { + "desktop": "0.9.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrender.so.1"], + "server": [] + } + }, + "xft": { + "lib_name": "xft", + "sections_number": "10.23", + "lib_description": "Xft 是一个将 X 应用程序与 FreeType 字体连接起来的光栅化库。", + "version": { + "desktop": "2.3.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXft.so.2"], + "server": [] + } + }, + "gdk-pixbuf": { + "lib_name": "gdk-pixbuf", + "sections_number": "10.24", + "lib_description": "创建图形用户界面的多平台工具包", + "version": { + "desktop": "2.38.1", + "server": "" + }, + "alias": [ + { + "name": "gdk-pixbuf2", + "version": { + "desktop": "2.38.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdk_pixbuf-2.0.so.0", + "libgdk_pixbuf_xlib-2.0.so.0", + "libpixbufloader-ani.so", + "libpixbufloader-bmp.so", + "libpixbufloader-gif.so", + "libpixbufloader-icns.so", + "libpixbufloader-ico.so", + "libpixbufloader-jpeg.so", + "libpixbufloader-pnm.so", + "libpixbufloader-qtif.so", + "libpixbufloader-tga.so", + "libpixbufloader-tiff.so", + "libpixbufloader-xbm.so", + "libpixbufloader-xpm.so"], + "server": [] + } + }, + "libfontenc": { + "lib_name": "libfontenc", + "sections_number": "10.25", + "lib_description": "X.Org X11 libfontenc 运行时库。", + "version": { + "desktop": "1.1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontenc.so.1"], + "server": ["libfontenc.so.1"] + } + }, + "libglvnd": { + "lib_name": "libglvnd", + "sections_number": "10.26", + "lib_description": "libglvnd 是一个供应商中立的调度层,用于仲裁多个供应商之间的 OpenGL API 调用。", + "version": { + "desktop": "1.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"], + "server": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"] + } + }, + "libjpeg-turbo": { + "lib_name": "libjpeg-turbo", + "sections_number": "10.27", + "lib_description": "libjpeg-turbo 是一个 JPEG 图像编解码器。", + "version": { + "desktop": "1.5.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libjpeg.so.62", + "libturbojpeg.so.0"], + "server": [] + } + }, + "libpciaccess": { + "lib_name": "libpciaccess", + "sections_number": "10.28", + "lib_description": "为 X 提供访问 PCI 总线和设备的功能平台无关的方式。", + "version": { + "desktop": ".14", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpciaccess.so.0"], + "server": [] + } + }, + "libpng12": { + "lib_name": "libpng12", + "sections_number": "10.29", + "lib_description": "便携式网络图形格式库", + "version": { + "desktop": "1.2.54", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng12.so"], + "server": [] + } + }, + "libraw": { + "lib_name": "libraw", + "sections_number": "10.30", + "lib_description": "LibRaw 是一个用于从数码相机读取 RAW 文件的库。", + "version": { + "desktop": "0.19.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libraw.so.19"], + "server": [] + } + }, + "libSM": { + "lib_name": "libSM", + "sections_number": "10.31", + "lib_description": "libSM 软件包中包含 X.Org X11 SM 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSM.so.6"], + "server": [] + } + }, + "libwebp": { + "lib_name": "libwebp", + "sections_number": "10.32", + "lib_description": "这是一种对数码照片图像进行有损压缩的图像格式。", + "version": { + "desktop": "0.6.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libwebp.so.6", + "libwebpdemux.so.2", + "libwebpmux.so.3"], + "server": [] + } + }, + "libxres": { + "lib_name": "libxres", + "sections_number": "10.33", + "lib_description": "X-Resource 是一个扩展,它允许客户端向 X 服务器查询各种资源的使用情况。", + "version": { + "desktop": "1.2.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXRes.so.1"], + "server": [] + } + }, + "libxcomposite": { + "lib_name": "libxcomposite", + "sections_number": "10.34", + "lib_description": "X 复合扩展库", + "version": { + "desktop": "0.4.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXcomposite.so.1"], + "server": [] + } + }, + "libxcursor": { + "lib_name": "libxcursor", + "sections_number": "10.35", + "lib_description": "libXcursor 是一个旨在帮助定位和加载游标的库。游标可以从文件或内存中加载。", + "version": { + "desktop": "1.1.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["ibXcursor.so.1"], + "server": [] + } + }, + "libxdamage": { + "lib_name": "libxdamage", + "sections_number": "10.36", + "lib_description": "X Damage Extension 允许应用程序跟踪可绘制对象的修改区域。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdamage.so.1"], + "server": [] + } + }, + "libxfixes": { + "lib_name": "libxfixes", + "sections_number": "10.37", + "lib_description": "X Fixes 扩展为应用程序提供了针对核心协议中各种限制的变通方法。", + "version": { + "desktop": "5.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfixes.so.3"], + "server": [] + } + }, + "libxfont": { + "lib_name": "libxfont", + "sections_number": "10.38", + "lib_description": "libXfont 提供了遗留 X11 字体系统的核心。", + "version": { + "desktop": "2.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfont2.so.2"], + "server": [] + } + }, + "libxi": { + "lib_name": "libxi", + "sections_number": "10.39", + "lib_description": "libXi 是 X 输入扩展的客户端库。", + "version": { + "desktop": "1.7.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXi.so.6"], + "server": [] + } + }, + "libxinerama": { + "lib_name": "libxinerama", + "sections_number": "10.40", + "lib_description": "Xinerama 是 X Window System 的扩展。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXinerama.so.1"], + "server": [] + } + }, + "libxkbcommon": { + "lib_name": "libxkbcommon", + "sections_number": "10.41", + "lib_description": "xkbcommon 是一个用于处理键盘描述的库。", + "version": { + "desktop": "0.8.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbcommon-x11.so.0"], + "server": [] + } + }, + "libxkbfile": { + "lib_name": "libxkbfile", + "sections_number": "10.42", + "lib_description": "X 服务器和实用程序使用 Libxkbfile 来解析 XKB 配置数据文件。", + "version": { + "desktop": "1.0.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbfile.so.1"], + "server": [] + } + }, + "libxklavier": { + "lib_name": "libxklavier", + "sections_number": "10.43", + "lib_description": "这个包是一个为 X 键盘扩展提供高级 API 的库,称为 XKB。", + "version": { + "desktop": "5.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxklavier.so.16"], + "server": [] + } + }, + "cairo": { + "lib_name": "cairo", + "sections_number": "10.44", + "lib_description": "Cairo 是一个支持多种输出设备的 2D 图形库。", + "version": { + "desktop": "1.16.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcairo-gobject.so.2", + "libcairo-script-interpreter.so.2", + "libcairo.so.2"], + "server": [] + } + }, + "fltk1.3": { + "lib_name": "fltk1.3", + "sections_number": "10.45", + "lib_description": "FLTK是一个跨平台的 C++ GUI 工具包。", + "version": { + "desktop": "1.1.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfltk.so.1.3", + "libfltk_forms.so.1.3", + "libfltk_gl.so.1.3", + "libfltk_images.so.1.3"], + "server": [] + } + }, + "libxss": { + "lib_name": "libxss", + "sections_number": "10.46", + "lib_description": "此包包含 X.Org X11 libXss 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXss.so.1"], + "server": [] + } + }, + "libxshmfence": { + "lib_name": "libxshmfence", + "sections_number": "10.47", + "lib_description": "X11 的共享内存栅栏,在 DRI3 中使用。", + "version": { + "desktop": "1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxshmfence.so.1"], + "server": [] + } + }, + "libxt": { + "lib_name": "libxt", + "sections_number": "10.48", + "lib_description": "X.Org X11 libXt 运行时库", + "version": { + "desktop": "1.1.5", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXt.so.6"], + "server": [] + } + }, + "libxtst": { + "lib_name": "libxtst", + "sections_number": "10.49", + "lib_description": "X.Org X11 libXtst 运行时库", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXtst.so.6"], + "server": [] + } + }, + "libxvmc": { + "lib_name": "libxvmc", + "sections_number": "10.50", + "lib_description": "XvMC 是 X 窗口系统的 X 视频扩展 (Xv) 的扩展。", + "version": { + "desktop": "1.0.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXvMC.so.1", + "libXvMCW.so.1"], + "server": [] + } + }, + "libxxf86dga": { + "lib_name": "libxxf86dga", + "sections_number": "10.51", + "lib_description": "XFree86-DGA 扩展的客户端库", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86dga.so.1"], + "server": [] + } + }, + "libxxf86vm": { + "lib_name": "libxxf86vm", + "sections_number": "10.52", + "lib_description": "为 XFree86-VidModeExtension 提供一个扩展库。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86vm.so.1"], + "server": [] + } + }, + "pango1.0": { + "lib_name": "pango1.0", + "sections_number": "10.53", + "lib_description": "Pango 是一个用于布局和渲染文本的库,重点是关于国际化。", + "version": { + "desktop": "1.42.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpango-1.0.so.0", + "libpangocairo-1.0.so.0", + "libpangoft2-1.0.so.0", + "libpangoxft-1.0.so.0"], + "server": [] + } + }, + "pixman": { + "lib_name": "pixman", + "sections_number": "10.54", + "lib_description": "Pixman 是一个用于像素操作的低级软件库,提供图像合成和梯形光栅化等功能。", + "version": { + "desktop": "0.36.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixman-1.so.0"], + "server": [] + } + }, + "qt4-x11": { + "lib_name": "qt4-x11", + "sections_number": "10.55", + "lib_description": "开发应用程序的软件工具包", + "version": { + "desktop": "4.8.7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQtCLucene.so.4", + "libQtCore.so.4", + "libQtDBus.so.4", + "libQtDeclarative.so.4", + "libQtGui.so.4", + "libQtNetwork.so.4", + "libQtScript.so.4", + "libQtSql.so.4", + "libQtXmlPatterns.so.4", + "libQtXml.so.4"], + "server": [] + } + }, + "qtbase-opensource-src": { + "lib_name": "qtbase-opensource-src", + "sections_number": "10.56", + "lib_description": "Qt工具包的核心组件", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5Concurrent.so.5", + "libQt5Core.so.5", + "libQt5DBus.so.5", + "libQt5Network.so.5", + "libQt5Sql.so.5", + "libQt5Test.so.5", + "libQt5Xml.so.5", + "libqconnmanbearer.so", + "libqgenericbearer.so", + "libqnmbearer.so", + "libqsqlite.so"], + "server": [] + } + }, + "qtx11extras-opensource-src": { + "lib_name": "qtx11extras-opensource-src", + "sections_number": "10.57", + "lib_description": "Qt 5 X11额外功能Qt是一个跨平台的c++应用程序框架。Qt的主要特性是它丰富的widget集,提供标准的GUI功能。这个包包含了从Qt 5中访问X11内容的库。", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5X11Extras.so.5"], + "server": [] + } + }, + "xcb-util": { + "lib_name": "xcb-util", + "sections_number": "10.58", + "lib_description": "XCB 工具模块", + "version": { + "desktop": "0.3.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-util.so.1"], + "server": [] + } + }, + "xcb-util-image": { + "lib_name": "xcb-util-image", + "sections_number": "10.59", + "lib_description": "提供XImage和XShmImage功能端口", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-image.so.0"], + "server": [] + } + }, + "xcb-util-keysyms": { + "lib_name": "xcb-util-keysyms", + "sections_number": "10.60", + "lib_description": "标准X键值对转换工具", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-keysyms.so.1"], + "server": [] + } + }, + "xcb-util-renderutil": { + "lib_name": "xcb-util-renderutil", + "sections_number": "10.61", + "lib_description": "渲染扩展工具", + "version": { + "desktop": "0.3.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-render-util.so.0"], + "server": [] + } + }, + "xcb-util-wm": { + "lib_name": "xcb-util-wm", + "sections_number": "10.62", + "lib_description": "窗口管理器", + "version": { + "desktop": "0.4.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-ewmh.so.2", + "libxcb-icccm.so.4"], + "server": [] + } + }, + "xorg-x11-server": { + "lib_name": "xorg-x11-server", + "sections_number": "10.63", + "lib_description": "X.Org X11 X 服务器", + "version": { + "desktop": "1.20.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["modesetting_drv.so", + "libglx.so", + "libexa.so", + "libfbdevhw.so", + "libfb.so", + "libglamoregl.so", + "libint10.so", + "libshadowfb.so", + "libshadow.so", + "libvbe.so", + "libvgahw.so", + "libwfb.so"], + "server": [] + } + }, + "libsdl1.2": { + "lib_name": "libsdl1.2", + "sections_number": "10.64", + "lib_description": "跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、 MPEG播放器和其他应用软件", + "version": { + "desktop": "1.2.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL-1.2.so.0"], + "server": ["libSDL-1.2.so.0"] + } + } + } + }, + "##章节名": "11 多媒体库", + "multimedia": { + "description": { + "chapters_number": "11", + "chapters_Name": "多媒体" + }, + "packages": { + "alsa-lib": { + "lib_name": "alsa-lib", + "sections_number": "11.1", + "lib_description": "编译 ALSA 应用程序的用户空间库", + "version": { + "desktop": "1.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasound.so.2"], + "server": [] + } + }, + "ffmpeg": { + "lib_name": "ffmpeg", + "sections_number": "11.2", + "lib_description": "Linux音视频播放解决方案", + "version": { + "desktop": "4.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavcodec.so.58", + "libavfilter.so.7", + "libavformat.so.58", + "libavresample.so.4", + "libavutil.so.56", + "libpostproc.so.55", + "libswresample.so.3", + "libswscale.so.5"], + "server": [] + } + }, + "gstreamer1.0": { + "lib_name": "gstreamer1.0", + "sections_number": "11.3", + "lib_description": "GStreamer 流媒体框架运行时", + "version": { + "desktop": "1.14.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgstbase-1.0.so.0", + "libgstcheck-1.0.so.0", + "libgstcontroller-1.0.so.0", + "libgstcoreelements.so", + "libgstcoretracers.so", + "libgstnet-1.0.so.0", + "libgstreamer-1.0.so.0"], + "server": [] + } + }, + "libdvdnav": { + "lib_name": "libdvdnav", + "sections_number": "11.4", + "lib_description": "显示 DVD 视频菜单功能库", + "version": { + "desktop": "6.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdnav.so.4"], + "server": [] + } + }, + "libdvdread": { + "lib_name": "libdvdread", + "sections_number": "11.5", + "lib_description": "用于访问 DVD 磁盘的库", + "version": { + "desktop": "6.0.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdread.so.4", "libdvdread.so.7"], + "server": [] + } + }, + "pulseaudio": { + "lib_name": "pulseaudio", + "sections_number": "11.6", + "lib_description": "Linux声音服务器", + "version": { + "desktop": "12.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libalsa-util.so", + "libavahi-wrap.so", + "libbluez5-util.so", + "libcli.so", + "libprotocol-cli.so", + "libprotocol-esound.so", + "libprotocol-http.so", + "libprotocol-native.so", + "libprotocol-simple.so", + "libpulsedsp.so", + "libpulse-mainloop-glib.so.0", + "libpulse-simple.so.0", + "libpulse.so.0", + "libraop.so", + "librtp.so", + "libwebrtc-util.so"], + "server": [] + } + } + } + }, + "##章节名": "12 打印扫描库", + "print_scan": { + "description": { + "chapters_number": "12", + "chapters_Name": "打印扫描" + }, + "packages": { + "cups-filters": { + "lib_name": "cups-filters", + "sections_number": "12.1", + "lib_description": "CUPS 是苹果公司为 Mac OS X 和其他类 UNIX操作系统开发的基于标准的开源打印系统。CUPS 使用 Internet 打印协议 (“IPP”) 并提供 System V 和 Berkeley 命令行界面、Web 界面和 C API 来管理打印机和打印作业。该项目提供后端、过滤器和其他软件,cups-filters是过滤器。", + "version": { + "desktop": "1.21.6", + "server": "1.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontembed.so.1", + "libcupsfilters.so.1"], + "server": ["libfontembed.so.1", + "libcupsfilters.so.1"] + } + }, + "sane-backends": { + "lib_name": "sane-backends", + "sections_number": "12.2", + "lib_description": "SANE 应用程序编程接口 (API) ,提供对任何光栅图像扫描仪硬件(平板扫描仪、手持式扫描仪、视频和照相机、图像采集卡等)的标准化访问。", + "version": { + "desktop": "1.0.27", + "server": "1.0.27" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsane.so.1"], + "server": [] + } + } + } + }, + "##章节名": "13 运行时语言库", + "runtime_language": { + "description": { + "chapters_number": "13", + "chapters_Name": "运行时语言" + }, + "packages": { + "openjdk": { + "lib_name": "openjdk", + "sections_number": "13.1", + "lib_description": "OpenJDK 是 Java 标准版 (Java SE) 和 Java 开发工具包 (JDK) 的开源实现。OpenJDK 源代码是这些商业 Java 产品的基础。它包含了Java 运行时环境,用以运行 Java 程序,也包含了 Java 虚拟机和一些别的组成。", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + }, + "alias": [ + { + "name": "openjdk-lts", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "openjdk-11", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-11-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-1.8.0-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-wrapper.so.6", + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjawt.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"], + "server": [ + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"] + } + }, + "perl": { + "lib_name": "perl", + "sections_number": "13.2", + "lib_description": "Perl库:开发文件用于开发嵌入Perl解释器的应用程序的文件。", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + }, + "alias": [ + { + "name": "perl", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + }, + { + "name": "perl-libs", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libperl.so.5.30"], + "server": ["libperl.so.5.28"] + } + } + } + }, + "##章节名": "14 编程开发库", + "development": { + "description": { + "chapters_number": "14", + "chapters_Name": "编程开发" + }, + "packages": { + "libxml2": { + "lib_name": "libxml2", + "sections_number": "14.1", + "lib_description": "Libxml2 是一个xml的c语言版的解析器", + "version": { + "desktop": "2.9.4", + "server": "2.9.7" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxml2.so.2"], + "server": ["libxml2.so.2"] + } + }, + "libunwind": { + "lib_name": "libunwind", + "sections_number": "14.2", + "lib_description": "可移植且高效的 C 编程接口 (API),用于确定程序的调用链。", + "version": { + "desktop": "1.2.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libunwind.so.8", + "libunwind-coredump.so.0"], + "server": ["libunwind.so.8", + "libunwind-coredump.so.0"] + } + } + } + }, + "##章节名": "15 基础计算库", + "basic_calculation": { + "description": { + "chapters_number": "15", + "chapters_Name": "基础计算" + }, + "packages": { + "orbit2": { + "lib_name": "orbit2", + "sections_number": "15.1", + "lib_description": "高性能CORBA实现CORBA:一种使程序对象能够在不同的应用程序之间通信、发送请求和接收回复的体系结构,而不管它们的编程语言、操作系统或网络位置如何。", + "version": { + "desktop": "", + "server": "2.14.19" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libORBit-2.so", + "libORBitCosNaming-2.so.0", + "libORBit-imodule-2.so"] + } + }, + "atlas": { + "lib_name": "atlas", + "sections_number": "15.2", + "lib_description": "自动调整线性代数软件:是一种自动生成和优化数值软件的方法。目前,ATLAS为被称为基本线性代数子程序(BLAS)的完整线性代数内核集和LAPACK库中的线性代数例程子集提供了优化版本。", + "version": { + "desktop": "", + "server": "3.10.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libsatlas.so.3", + "libtatlas.so.3"] + } + }, + "lapack": { + "lib_name": "lapack", + "sections_number": "15.3", + "lib_description": "基本线性代数参考实现BLAS(基本线性代数子程序)是一组用于大多数基本向量和矩阵运算的高效例程。它们被广泛用作其他高质量线性代数软件的基础", + "version": { + "desktop": "", + "server": "3.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libblas.so.3", + "liblapack.so.3", + "liblapacke.so.3"] + } + } + } + }, + "##章节名": "16 存储库", + "storage": { + "description": { + "chapters_number": "16", + "chapters_Name": "存储" + }, + "packages": { + "ceph": { + "lib_name": "ceph", + "sections_number": "16.1", + "lib_description": "Ceph是一个开源软件定义的存储平台,它在单个分布式计算机集群上实现对象存储,并提供用于对象,块和文件级存储的3合1接口。Ceph的主要目标是实现无单点故障的完全分布式操作,可扩展到艾字节级别,并且可以免费使用。", + "version": { + "desktop": "", + "server": "12.2.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcls_cephfs.so.1", + "libcls_hello.so.1", + "libcls_journal.so.1", + "libcls_kvs.so.1", + "libcls_lock.so.1", + "libcls_log.so.1", + "libcls_lua.so.1", + "libcls_numops.so.1", + "libcls_rbd.so.1", + "libcls_refcount.so.1", + "libcls_rgw.so.1", + "libcls_sdk.so.1", + "libcls_timeindex.so.1", + "libcls_user.so.1", + "libcls_version.so.1", + "libceph_snappy.so.2", + "libceph_zlib.so", + "libceph_zstd.so", + "libec_jerasure.so", + "libec_jerasure_generic.so", + "libec_lrc.so", + "libec_shec.so", + "libec_shec_generic.so", + "libosd_tp.so", + "libos_tp.so"] + } + } + } + }, + "##章节名": "17 虚拟化库", + "virtualization": { + "description": { + "chapters_number": "17", + "chapters_Name": "虚拟化" + }, + "packages": { + "libvirt": { + "lib_name": "libvirt", + "sections_number": "17.1", + "lib_description": "用于管理虚拟化平台的开源的API,后台程序和管理工具。", + "version": { + "desktop": "", + "server": "5.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libvirt-admin.so.0", + "libvirt-lxc.so.0", + "libvirt-qemu.so.0", + "libvirt.so.0", + "libvirt_driver_interface.so", + "libvirt_driver_network.so", + "libvirt_driver_nodedev.so", + "libvirt_driver_nwfilter.so", + "libvirt_driver_qemu.so", + "libvirt_driver_secret.so", + "libvirt_driver_storage.so", + "lockd.so", + "libvirt_storage_backend_disk.so", + "libvirt_storage_backend_fs.so", + "libvirt_storage_backend_iscsi.so", + "libvirt_storage_backend_iscsi-direct.so", + "libvirt_storage_backend_logical.so", + "libvirt_storage_backend_mpath.so", + "libvirt_storage_backend_rbd.so", + "libvirt_storage_backend_scsi.so", + "libvirt_storage_backend_gluster.so", + "libvirt_storage_file_gluster.so", + "libvirt_storage_file_fs.so"] + } + } + } + }, + "##章节名": "18 集群高可用库", + "high_availability": { + "description": { + "chapters_number": "18", + "chapters_Name": "集群高可用" + }, + "packages": { + "pacemaker": { + "lib_name": "pacemaker", + "sections_number": "18.1", + "lib_description": "Pacemaker是一种先进的、可扩展的高可用性集群资源管理器", + "version": { + "desktop": "", + "server": "2.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcib.so.27", + "libcrmcommon.so.34", + "libcrmservice.so.28", + "liblrmd.so.28", + "libpacemaker.so.1", + "libstonithd.so.26", + "libpe_rules.so.26", + "libpe_status.so.28"] + } + }, + "corosync": { + "lib_name": "corosync", + "sections_number": "18.2", + "lib_description": "Corosync 集群引擎和应用程序编程接口", + "version": { + "desktop": "", + "server": "3.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcfg.so.7", + "libcmap.so.4", + "libcorosync_common.so.4", + "libcpg.so.4", + "libquorum.so.5", + "libsam.so.4", + "libvotequorum.so.8"] + } + } + } + } + } + } +} diff --git a/Jsons/lib_list_20230111.json b/Jsons/lib_list_20230111.json new file mode 100644 index 0000000000000000000000000000000000000000..6fe61cf11988f6a28fd07ae4f4181cc446221ae0 --- /dev/null +++ b/Jsons/lib_list_20230111.json @@ -0,0 +1,5108 @@ +{ + "std_description": { + "std_name": "操作系统应用编程接口", + "std_number": "T/CESA-XXXX-2022", + "##std_version": "标准的版本标识,仅供作为本json描述文件的标识使用,由标准版本号+类别组成,标准第一版为1.0,勘误增加小版本号如1.1,标准修订增加大版本号2.0;", + "##std_version": "标准类别用1位大写字母,I表示团标,S电子信息行标,G表示国标", + "std_version": "1.0I", + "etc": "这是《操作系统应用编程接口》标准运行库描述文件,是《操作系统应用编程接口》标准符合性测试工具的组成部分;" + }, + "CopyRight": { + "License": "本文件遵循木兰协议xxxxxx", + "comment": "", + "Author": "贡献者:XXX@cesi,xxx@uitech,xxx@huawei,xxx@kylinos" + }, + "##libs": "标准规定动库包", + "libs": { + "##libs_location": "查询共享对象库的路径,与标准规定了文件系统层次结构保持一致", + "lib_location": [ + "/lib", + "/lib64", + "/usr/lib" + ], + "category": { + + "##章节名": "7 基础库", + "base": { + "description": { + "##chapters_number": "库对应标准章号,做完日志或错误等输出记录标识,可用于反查标准", + "chapters_number": "7", + "chapters_Name": "基础" + }, + "packages": { + "##glibc": "包名,考虑到编译后名称二进制安装包可能会存在差异,一般以源码包去命名,做完匹配符,用以检查安装的运行库是否存在,同aliasname。后面不在赘述", + "glibc": { + "##lib_name": "包名,一般与外部名称应该一致", + "lib_name": "glibc", + "##sections_number": "库包对应标准节号,当符合性检查出现错误或警告时,可用于标准反查", + "sections_number": "7.1", + "##lib_description": "库的介绍,可能会被删除,仅作为识读使用,不参与符合性检查,值可以置空", + "lib_description": "该软件包包括标准C库的共享版本以及标准数学库,以及其他许多库。", + "##version": "最低版本要求,'desktop_version':桌面OS,'server_version',服务器OS", + "##version": "版本位次检查规则:如果版号有n位,则前n-1位不可变,第n位版本号比低于版本要求;如果版号中含有字母或特殊字符另行扩充判定规则", + "version": { + "desktop": "2.28", + "server": "2.28" + }, + "##aliasname": "包的别名,考虑由于来源差异,部分包命及版本规则与包的根社区不一致,标准特对少部分包增加别名及特点版本要求,标准名和别名应遍历查找", + "##aliaversion": "别名对应版本,如果没有特殊要求,应与标准版一致;如果别名有多个,那么版本号也应该是多个,保持一一对应,多个别名对一个版本", + "alias": [ + { + "name": "libc6", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "libnsl", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "nss_modules", + "version": { + "desktop": "2.28", + "server": "2.28" + } + }, + { + "name": "nss_nis-3.0", + "version": { + "desktop": "2.28", + "server": "2.28" + } + } + ], + "##necessity": "必要性", + "##necessity": "第一位:L0表示对应平台不作要求,L1长期兼容库,L2兼容库,L3试用版本;如果是L0,则第二项可以置空'';L1与L2在符合性检查没有明显区别,主要是为了区别标准的长期性承诺", + "##necessity": "第二位:basic表示基本,基本ISO安装应提供该库,expansion表示扩展,该库可以通过扩展光盘或仓库提供,当兼容性级别为'L0'时,本项可置空,不再做检查,也不再做共享对象的检查", + "##necessity": "第三位:Deprecated表示不推荐,即不推荐应用调用,为兼容历史应用要求操作系统提供的库,操作性系统符合性检查时忽略该项,应用如果依赖该类库应给出告警", + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "##share_objs": "库所要求的共享对象名清单;当'share_objs'存在时表示桌面与服务器的要求一致(或对其中一类操作系统无要求);如果不存在则表示,按操作系统类别分别比较", + "##share_objs": "只有标准要求的共享对象(或符号链接)都存在才符合标准。如果是个符号链接,应查询到对应的实体库,并查验对应其符号链是否与查询到的符号链接文件是否一致", + "share_objs": { + "desktop": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"], + "server": ["libBrokenLocale.so.1", + "libanl.so.1", + "libc.so.6", + "libdl.so.2", + "libm.so.6", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nis.so.2", + "libpthread.so.0", + "libresolv.so.2", + "librt.so.1", + "libthread_db.so.1", + "libutil.so.1"] + } + }, + "elfutils": { + "lib_name": "elfutils", + "sections_number": "7.2", + "lib_description": "用于处理 ELF 文件和 DWARF 数据的应用程序集合", + "version": { + "desktop": "0.176", + "server": "0.176" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"], + "server": ["libasm.so.1", + "libdw.so.1", + "libelf.so.1"] + } + }, + "pam": { + "lib_name": "pam", + "sections_number": "7.3", + "lib_description": "Linux身份验证模块", + "version": { + "desktop": "1.3.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"], + "server": ["libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0"] + } + }, + "zlib": { + "lib_name": "zlib", + "sections_number": "7.4", + "lib_description": "无损数据压缩库", + "version": { + "desktop": "1.2.11", + "server": "1.2.11" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libz.so.1"], + "server": ["libz.so.1"] + } + }, + "gcc": { + "lib_name": "gcc", + "sections_number": "7.5", + "lib_description": "GNU 的编译器集合 包括对 ,C、C++、Fortran、Object-C、Object-C++、Go、D、等的支持。当前是 GCC 8 的实现版本。", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + }, + "alias": [ + { + "name": "gcc-7", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-8", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-9", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "gcc-10", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libstdc++", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libatomic", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libubsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libtsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "libitm", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + }, + { + "name": "liblsan", + "version": { + "desktop": "8.3.0", + "server": "7.3.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatomic.so.1", + "libcc1.so", + "libcc1plugin.so", + "libcp1plugin.so", + "libgcc_s_x32.so", + "libgcc_s.so.1", + "libgdruntime.so.76", + "libgnarl-8.so.1", + "libgnarl.so", + "libgnat-8.so.1", + "libgnat.so", + "libgo.so.13", + "libgomp.so.1", + "libgphobos.so.76", + "libhsail-rt.so.0", + "libitm.so.1", + "liblsan.so.0", + "liblto_plugin.so.0", + "libmpx.so.2", + "libobjc.so.4", + "libquadmath.so.0", + "libstdc++.so.6", + "libtsan.so.0", + "libubsan.so.1"], + "server": ["libatomic.so.1", + "libgcc_s.so.1", + "libgomp.so.1", + "libobjc.so.4", + "libquadmath.so.0", + "libstdc++.so.6", + "libtsan.so.0"] + } + }, + "krb5": { + "lib_name": "krb5", + "sections_number": "7.6", + "lib_description": "Kerberos 网络身份验证协议", + "version": { + "desktop": "1.17", + "server": "1.17" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"], + "server": ["libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libk5crypto.so.3", + "libkrad.so.0", + "libkrb5.so.3", + "libkrb5support.so.0"] + } + }, + "libxcrypt": { + "lib_name": "libxcrypt", + "sections_number": "7.7", + "lib_description": "实现加密和解密的库", + "version": { + "desktop": "4.4.10", + "server": "4.4.4" + }, + "alias": [ + { + "name": "glibc", + "version": { + "desktop": "2.28", + "server": "4.4.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypt.so.1"], + "server": ["libcrypt.so.1"] + } + }, + "audit": { + "lib_name": "audit", + "sections_number": "7.8", + "lib_description": "用于内核审计的用户空间工具", + "version": { + "desktop": "2.8.4", + "server": "2.8.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaudit.so.1", + "libauparse.so.0"], + "server": ["libaudit.so.1", + "libauparse.so.0"] + } + }, + "bzip2": { + "lib_name": "bzip2", + "sections_number": "7.9", + "lib_description": "高质量的数据压缩器", + "version": { + "desktop": "1.0.6", + "server": "1.0.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbz2.so.1"], + "server": ["libbz2.so.1"] + } + }, + "dbus": { + "lib_name": "dbus", + "sections_number": "7.10", + "lib_description": "消息总线系统,用于应用间通信。提供系统留守进程和用户登录留守进程", + "version": { + "desktop": "1.12.16", + "server": "1.12.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-1.so.3"], + "server": ["libdbus-1.so.3"] + } + }, + "expat": { + "lib_name": "expat", + "sections_number": "7.11", + "lib_description": "expat 是一个用 C 语言编写的面向流的 XML 解析器库", + "version": { + "desktop": "2.2.6", + "server": "2.2.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libexpat.so.1"], + "server": ["libexpat.so.1"] + } + }, + "glib2": { + "lib_name": "glib2", + "sections_number": "7.12", + "lib_description": "构成 GTK+ 和 GNOME 等项目基础的核心库", + "version": { + "desktop": "2.58", + "server": "2.56" + }, + "alias": [ + { + "name": "glib2.0", + "version": { + "desktop": "2.58", + "server": "2.56" + } + }, + { + "name": "glib2", + "version": { + "desktop": "2.58", + "server": "2.56" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"], + "server": ["libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0"] + } + }, + "gmp": { + "lib_name": "gmp", + "sections_number": "7.13", + "lib_description": "一个 GNU 多精度算术库", + "version": { + "desktop": "6.1.2", + "server": "6.1.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgmp.so.10"], + "server": ["libgmp.so.10"] + } + }, + "libidn2": { + "lib_name": "libidn2", + "sections_number": "7.14", + "lib_description": "GNU libidn2是GNU libidn的后继者。standalone lib。包含IDNA2008,Punycode 和 Unicode TR46 的实现。通过IETF国际域名(IDN)实施字符串预处理、Punycode和IDNA规格定义的包", + "version": { + "desktop": "2.0.5", + "server": "2.0.5" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libidn2.so.0"], + "server": ["libidn2.so.0"] + } + }, + "ncurses": { + "lib_name": "ncurses", + "sections_number": "7.15", + "lib_description": "终端控制库", + "version": { + "desktop": "6.1.1", + "server": "6.1" + }, + "alias": [ + { + "name": "ncurses", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + }, + { + "name": "ncurses-libs", + "version": { + "desktop": "6.1.1", + "server": "6.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"], + "server": ["libform.so.6", + "libformw.so.6", + "libmenu.so.6", + "libmenuw.so.6", + "libncurses.so.6", + "libncursesw.so.6", + "libpanel.so.6", + "libpanelw.so.6", + "libtic.so.6", + "libtinfo.so.6"] + } + }, + "xz": { + "lib_name": "xz", + "sections_number": "7.16", + "lib_description": "一款免费的通用数据压缩软件,采用 LZMA2 算法", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + }, + "alias": [ + { + "name": "xz-utils", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + }, + { + "name": "xz", + "version": { + "desktop": "5.2.4", + "server": "5.2.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liblzma.so.5"], + "server": ["liblzma.so.5"] + } + }, + "libcap": { + "lib_name": "libcap", + "sections_number": "7.17", + "lib_description": "这是一个用于获取和设置 POSIX.1e(以前的 POSIX 6)草案 15 功能的库。", + "version": { + "desktop": "2.25", + "server": "2.26" + }, + "alias": [ + { + "name": "libcap", + "version": { + "desktop": "2.25", + "server": "2.26" + } + }, + { + "name": "libcap2", + "version": { + "desktop": "2.25", + "server": "2.26" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcap.so.2"], + "server": ["libcap.so.2"] + } + }, + "popt": { + "lib_name": "popt", + "sections_number": "7.18", + "lib_description": "解析命令行选项的库。它不使用全局变量,因此可以在解析argv时进行多次传递;它可以解析任意argv样式元素的数组,允许解析来自任何源的命令行字符串;它提供了选项别名的标准方法;它可以执行外部选项过滤器;它可以自动为应用程序生成帮助和使用信息。", + "version": { + "desktop": "1.16", + "server": "1.16" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpopt.so.0"], + "server": ["libpopt.so.0"] + } + }, + "libnl3": { + "lib_name": "libnl3", + "sections_number": "7.19", + "lib_description": "libnl 套件是一组库,为基于 netlink 协议的 Linux 内核接口提供 API。", + "version": { + "desktop": "3.4.0", + "server": "3.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"], + "server": ["libnl-3.so.200", + "libnl-cli-3.so.200", + "libnl-genl-3.so.200", + "libnl-idiag-3.so.200", + "libnl-nf-3.so.200", + "libnl-route-3.so.200", + "libnl-xfrm-3.so.200"] + } + }, + "libsecret": { + "lib_name": "libsecret", + "sections_number": "7.20", + "lib_description": "libsecret 是一个用于存储和检索密码和其他机密的库。它使用 D-Bus 与“Secret Service”通信。gnome-keyring 和 ksecretservice 都是 Secret Service 的实现。", + "version": { + "desktop": "0.18.7", + "server": "0.18.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsecret-1.so.0"], + "server": ["libsecret-1.so.0"] + } + }, + "libIDL": { + "lib_name": "libIDL", + "sections_number": "7.21", + "lib_description": "libIDL是一个包含接口定义语言文件的库 。这是定义可移植接口的规范。", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + }, + "alias": [ + { + "name": "libIDL", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + } + }, + { + "name": "libidl", + "version": { + "desktop": "0.8.14", + "server": "0.8.14" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libIDL-2.so.0"], + "server": ["libIDL-2.so.0"] + } + }, + "libtalloc": { + "lib_name": "libtalloc", + "sections_number": "7.22", + "lib_description": "libtalloc 包提供了一个使用析构函数实现分层内存分配器的库。", + "version": { + "desktop": "2.1.14", + "server": "2.2.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtalloc.so.2"], + "server": ["libtalloc.so.2"] + } + }, + "libtevent": { + "lib_name": "libtevent", + "sections_number": "7.23", + "lib_description": "libtevent 包提供 Tevent,一个基于talloc 内存管理库的事件系统。Tevent 支持多种事件类型,包括定时器、信号和经典的文件描述符事件。Tevent 还提供帮助器来处理提供 tevent_req(Tevent 请求)函数的异步代码。", + "version": { + "desktop": "0.9.37", + "server": "0.10.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtevent.so.0"], + "server": ["libtevent.so.0"] + } + }, + "dbus-glib": { + "lib_name": "dbus-glib", + "sections_number": "7.24", + "lib_description": "对DBus的GNOME GLib接口工具及函数库", + "version": { + "desktop": "0.110", + "server": "0.110" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdbus-glib-1.so.2"], + "server": [] + } + }, + "attr": { + "lib_name": "attr", + "sections_number": "7.25", + "lib_description": "文件系统及文件扩展属性管理功能库", + "version": { + "desktop": "2.4.48", + "server": "2.4.48" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libattr.so.1"], + "server": [] + } + }, + "libevent": { + "lib_name": "libevent", + "sections_number": "7.26", + "lib_description": "当文件描述符上发生特定事件或达到超时后, libevent API 提供了一种执行回调函数的机制。此外,libevent还支持由于信号或常规超时而引起的回调。libevent旨在替换事件驱动网络服务器中的事件循环。", + "version": { + "desktop": "2.1.8", + "server": "2.1.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"], + "server": ["libevent-2.1.so.7", + "libevent_core-2.1.so.7", + "libevent_extra-2.1.so.7", + "libevent_openssl-2.1.so.7", + "llibevent_pthreads-2.1.so.7"] + } + }, + "accountsservice": { + "lib_name": "accountsservice", + "sections_number": "7.27", + "lib_description": "用户管理(账户维护)", + "version": { + "desktop": "0.6.45", + "server": "0.6.50" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libaccountsservice.so.0"], + "server": ["libaccountsservice.so.0"] + } + }, + "libmpc": { + "lib_name": "libmpc", + "sections_number": "7.28", + "lib_description": "用于多精度复杂算术的 C 库", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + }, + "alias": [ + { + "name": "libmpc3", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + }, + { + "name": "libmpc", + "version": { + "desktop": "1.1.0", + "server": "1.0.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpc.so.3"], + "server": ["libmpc.so.3"] + } + }, + "mpfr": { + "lib_name": "mpfr", + "sections_number": "7.29", + "lib_description": "多精度浮点计算 C 库", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + }, + "alias": [ + { + "name": "mpfr4", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + }, + { + "name": "mpfr", + "version": { + "desktop": "4.0.2", + "server": "3.1.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmpfr.so.6"], + "server": ["libmpfr.so.4"] + } + }, + "ndctl": { + "lib_name": "ndctl", + "sections_number": "7.30", + "lib_description": "DAX(直接访问)协议支持工具", + "version": { + "desktop": "63", + "server": "63" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdaxctl.so.1"], + "server": ["libdaxctl.so.1"] + } + }, + "file": { + "lib_name": "file", + "sections_number": "7.31", + "lib_description": "识别特定文件类型的工具", + "version": { + "desktop": "5.35", + "server": "5.33" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libmagic.so.1"], + "server": ["libmagic.so.1"] + } + }, + "gdbm": { + "lib_name": "gdbm", + "sections_number": "7.32", + "lib_description": "一个使用可扩展散列的数据库函数库", + "version": { + "desktop": "1.18", + "server": "1.18" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdbm.so.6", + "libgdbm_compat.so.4"], + "server": ["libgdbm.so.6", + "libgdbm_compat.so.4"] + } + }, + "keyutils": { + "lib_name": "keyutils", + "sections_number": "7.33", + "lib_description": "Linux 密钥管理程序", + "version": { + "desktop": "1.6", + "server": "1.5.10" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libkeyutils.so.1"], + "server": ["libkeyutils.so.1"] + } + }, + "libedit": { + "lib_name": "libedit", + "sections_number": "7.34", + "lib_description": "提供通用行编辑、历史记录和标记功能", + "version": { + "desktop": "3.1", + "server": "3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libedit.so.2"], + "server": ["libedit.so.0"] + } + }, + "kcodecs": { + "lib_name": "kcodecs", + "sections_number": "7.35", + "lib_description": "操作字符串的方法的集合KCodecs提供了一组操作字符串的方法使用不同的编码。", + "version": { + "desktop": "5.54.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libKF5Codecs.so.5"], + "server": [] + } + }, + "fcitx": { + "lib_name": "fcitx", + "sections_number": "7.36", + "lib_description": "fcitx输入法的核心功能库", + "version": { + "desktop": "4.2.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfcitx-core.so.0", + "libfcitx-gclient.so.1", + "libfcitx-utils.so.0"], + "server": [] + } + }, + "libsdl-ttf2.0": { + "lib_name": "libsdl-ttf2.0", + "sections_number": "7.37", + "lib_description": "允许SDL应用程序中使用TrueType字体", + "version": { + "desktop": "2.0.11", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL_ttf-2.0.so.0"], + "server": [] + } + } + } + }, + "##章节名": "8 系统安全库", + "security": { + "description": { + "chapters_number": "8", + "chapters_Name": "系统安全" + }, + "packages": { + "acl": { + "lib_name": "acl", + "sections_number": "8.1", + "lib_description": "管理访问控制列表。", + "version": { + "desktop": "2.2.53", + "server": "2.2.53" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libacl.so.1"], + "server": ["libacl.so.1"] + } + }, + "cyrus-sasl": { + "lib_name": "cyrus-sasl", + "sections_number": "8.2", + "lib_description": "SASL是简单的权限验证和安全层,可添加基于连接的协议的验证支持。", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + }, + "alias": [ + { + "name": "cyrus-sasl2", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + }, + { + "name": "cyrus-sasl", + "version": { + "desktop": "2.1.27", + "server": "2.1.27" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsasl2.so.2", + "libanonymous.so.2", + "libsasldb.so.2", + "libcrammd5.so.2", + "libdigestmd5.so.2", + "libgs2.so.2", + "libgssapiv2.so.2", + "libldapdb.so.2", + "liblogin.so.2", + "libntlm.so.2", + "libplain.so.2", + "libscram.so.2"], + "server": ["libsasl2.so.3", + "libanonymous.so.3", + "libsasldb.so.3", + "libcrammd5.so.3", + "libdigestmd5.so.3", + "libgs2.so.3", + "libgssapiv2.so.3", + "libldapdb.so.3", + "liblogin.so.3", + "libntlm.so.3", + "libplain.so.3", + "libscram.so.3"] + } + }, + "libgcrypt": { + "lib_name": "libgcrypt", + "sections_number": "8.3", + "lib_description": "通用加密库。", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + }, + "alias": [ + { + "name": "libgcrypt20", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + }, + { + "name": "libgcrypt", + "version": { + "desktop": "1.8.4", + "server": "1.8.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgcrypt.so.20"], + "server": ["libgcrypt.so.20"] + } + }, + "liboauth": { + "lib_name": "liboauth", + "sections_number": "8.4", + "lib_description": "oauth是一种关于授权方式的协议标准。", + "version": { + "desktop": "1.0.3", + "server": "1.0.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["liboauth.so.0"], + "server": ["liboauth.so.0"] + } + }, + "gnutls": { + "lib_name": "gnutls", + "sections_number": "8.5", + "lib_description": "gnutls全称 GNU TransportLayerSecurity Library,即基于GNU版权协议的传输层安全协议,是wget支持https中的ssl协议的基础库。", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + }, + "alias": [ + { + "name": "gnutls28", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + }, + { + "name": "gnutls", + "version": { + "desktop": "3.6.7", + "server": "3.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"], + "server": ["libgnutls-dane.so.0", + "libgnutls.so.30", + "libgnutlsxx.so.28"] + } + }, + "libssh": { + "lib_name": "libssh", + "sections_number": "8.6", + "lib_description": "libssh 是一个用以访问SSH服务的C语言开发包,通过它可以执行远程命令、文件传输,同时为远程的程序提供安全的传输通道。", + "version": { + "desktop": "0.8.7", + "server": "0.8.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh.so.4"], + "server": ["libssh.so.4", + "libssh_threads.so.4"] + } + }, + "libssh2": { + "lib_name": "libssh2", + "sections_number": "8.7", + "lib_description": "libssh2是一个C 函数库,用来实现SSH2协议。主要功能:Key Exchange Methods,Hostkey Type,Ciphers,Compression Schemes,MAC hashes等", + "version": { + "desktop": "1.8.0", + "server": "1.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libssh2.so.1"], + "server": ["libssh2.so.1"] + } + }, + "cracklib": { + "lib_name": "cracklib", + "sections_number": "8.8", + "lib_description": "密码安全测试工具。", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + }, + "alias": [ + { + "name": "cracklib2", + "version": { + "desktop": "2.9.6", + "server": "2.9.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrack.so.2"], + "server": ["libcrack.so.2"] + } + }, + "nspr": { + "lib_name": "nspr", + "sections_number": "8.9", + "lib_description": "包含线程、文件和网络I/O、内存管理等的运行时库。", + "version": { + "desktop": "4.20.1", + "server": "4.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnspr4.so", + "libplc4.so", + "libplds4.so"], + "server": ["libnspr4.so", + "libplc4.so", + "libplds4.so"] + } + }, + "openssl": { + "lib_name": "openssl", + "sections_number": "8.10", + "lib_description": "具有 TLS 实现的通用加密库中的实用程序,添加国密算法SM2 SM3 SMS4", + "version": { + "desktop": "1.1.1d", + "server": "1.1.1c" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcrypto.so.1.1", + "libssl.so.1.1"], + "server": ["libcrypto.so.1.1", + "libssl.so.1.1"] + } + } + } + }, + "##章节名": "9 网络服务库", + "network": { + "description": { + "chapters_number": "9", + "chapters_Name": "网络服务" + }, + "packages": { + "Networkmanager": { + "lib_name": "Networkmanager", + "sections_number": "9.1", + "lib_description": "网络链接管理器和用户应用程序。", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + }, + "alias": [ + { + "name": "network-manager", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + } + }, + { + "name": "Networkmanager", + "version": { + "desktop": "1.14.6", + "server": "1.16.0" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm.so.0", + "libnm-wwan.so", + "nm-pppd-plugin.so"], + "server": ["libnm-device-plugin-adsl.so", + "libnm-device-plugin-bluetooth.so", + "libnm-device-plugin-ovs.so", + "libnm-device-plugin-team.so", + "libnm-device-plugin-wifi.so", + "libnm-device-plugin-wwan.so", + "libnm-ppp-plugin.so", + "libnm-settings-plugin-ifcfg-rh.so", + "libnm.so.0", + "libnm-wwan.so"] + } + }, + "sssd": { + "lib_name": "sssd", + "sections_number": "9.2", + "lib_description": "管理对远程目录的访问和权限验证", + "version": { + "desktop": "1.16.3", + "server": "1.16.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"], + "server": ["libipa_hbac.so.0", + "libsss_certmap.so.0", + "libsss_idmap.so.0", + "libsss_nss_idmap.so.0", + "libsss_simpleifp.so.0", + "libwbclient.so.0"] + } + }, + "libtirpc": { + "lib_name": "libtirpc", + "sections_number": "9.3", + "lib_description": "libtirpc包包含支持使用远程过程调用 (RPC) API 的程序的库 。", + "version": { + "desktop": "1.1.4", + "server": "1.1.4" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtirpc.so.3"], + "server": ["libtirpc.so.3"] + } + }, + "nss": { + "lib_name": "nss", + "sections_number": "9.4", + "lib_description": "网络安全服务。", + "version": { + "desktop": "3.42.1", + "server": "3.40.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libnss3.so", + "libsmime3.so", + "libssl3.so"], + "server": ["libnss3.so", + "libnsssysinit.so", + "libsmime3.so", + "libssl3.so"] + } + }, + "libpcap": { + "lib_name": "libpcap", + "sections_number": "9.5", + "lib_description": "libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。著名的软件TCPDUMP就是在libpcap的的基础上开发而成的", + "version": { + "desktop": "1.8.1", + "server": "1.9.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpcap.so.1"], + "server": ["libpcap.so.1"] + } + }, + "curl": { + "lib_name": "curl", + "sections_number": "9.6", + "lib_description": "命令行或脚本数据传输工具", + "version": { + "desktop": "7.64.1", + "server": "7.61.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcurl.so.4"], + "server": ["libcurl.so.4"] + } + }, + "iptables": { + "lib_name": "iptables", + "sections_number": "9.7", + "lib_description": "IP包过滤管理工具", + "version": { + "desktop": "1.8.2", + "server": "1.8.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.2", + "libip6tc.so.2", + "libxtables.so.12"], + "server": ["libarpt_mangle.so", + "libebt_802_3.so", + "libebt_arp.so", + "libebt_dnat.so", + "libebt_ip6.so", + "libebt_ip.so", + "libebt_log.so", + "libebt_mark_m.so", + "libebt_mark.so", + "libebt_nflog.so", + "libebt_pkttype.so", + "libebt_redirect.so", + "libebt_snat.so", + "libebt_stp.so", + "libebt_vlan.so", + "libip6t_ah.so", + "libip6t_DNAT.so", + "libip6t_DNPT.so", + "libip6t_dst.so", + "libip6t_eui64.so", + "libip6t_frag.so", + "libip6t_hbh.so", + "libip6t_hl.so", + "libip6t_HL.so", + "libip6t_icmp6.so", + "libip6t_ipv6header.so", + "libip6t_LOG.so", + "libip6t_MASQUERADE.so", + "libip6t_mh.so", + "libip6t_NETMAP.so", + "libip6t_REDIRECT.so", + "libip6t_REJECT.so", + "libip6t_rt.so", + "libip6t_SNAT.so", + "libip6t_SNPT.so", + "libip6t_srh.so", + "libipt_ah.so", + "libipt_CLUSTERIP.so", + "libipt_DNAT.so", + "libipt_ECN.so", + "libipt_icmp.so", + "libipt_LOG.so", + "libipt_MASQUERADE.so", + "libipt_NETMAP.so", + "libipt_realm.so", + "libipt_REDIRECT.so", + "libipt_REJECT.so", + "libipt_SNAT.so", + "libipt_ttl.so", + "libipt_TTL.so", + "libipt_ULOG.so", + "libxt_addrtype.so", + "libxt_AUDIT.so", + "libxt_bpf.so", + "libxt_cgroup.so", + "libxt_CHECKSUM.so", + "libxt_CLASSIFY.so", + "libxt_cluster.so", + "libxt_comment.so", + "libxt_connbytes.so", + "libxt_connlabel.so", + "libxt_connlimit.so", + "libxt_connmark.so", + "libxt_CONNMARK.so", + "libxt_CONNSECMARK.so", + "libxt_conntrack.so", + "libxt_cpu.so", + "libxt_CT.so", + "libxt_dccp.so", + "libxt_devgroup.so", + "libxt_dscp.so", + "libxt_DSCP.so", + "libxt_ecn.so", + "libxt_esp.so", + "libxt_hashlimit.so", + "libxt_helper.so", + "libxt_HMARK.so", + "libxt_IDLETIMER.so", + "libxt_ipcomp.so", + "libxt_iprange.so", + "libxt_ipvs.so", + "libxt_LED.so", + "libxt_length.so", + "libxt_limit.so", + "libxt_mac.so", + "libxt_mark.so", + "libxt_MARK.so", + "libxt_multiport.so", + "libxt_nfacct.so", + "libxt_NFLOG.so", + "libxt_NFQUEUE.so", + "libxt_NOTRACK.so", + "libxt_osf.so", + "libxt_owner.so", + "libxt_physdev.so", + "libxt_pkttype.so", + "libxt_policy.so", + "libxt_quota.so", + "libxt_rateest.so", + "libxt_RATEEST.so", + "libxt_recent.so", + "libxt_rpfilter.so", + "libxt_sctp.so", + "libxt_SECMARK.so", + "libxt_set.so", + "libxt_SET.so", + "libxt_socket.so", + "libxt_standard.so", + "libxt_state.so", + "libxt_statistic.so", + "libxt_string.so", + "libxt_SYNPROXY.so", + "libxt_tcpmss.so", + "libxt_TCPMSS.so", + "libxt_TCPOPTSTRIP.so", + "libxt_tcp.so", + "libxt_TEE.so", + "libxt_time.so", + "libxt_tos.so", + "libxt_TOS.so", + "libxt_TPROXY.so", + "libxt_TRACE.so", + "libxt_u32.so", + "libxt_udp.so", + "libip4tc.so.0", + "libip6tc.so.0", + "libiptc.so.0", + "libxtables.so.12"] + } + }, + "bind": { + "lib_name": "bind", + "sections_number": "9.8", + "lib_description": "包括操作 DNS 服务器的组件", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + }, + "alias": [ + { + "name": "bind9", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + }, + { + "name": "bind", + "version": { + "desktop": "9.11.5", + "server": "9.11.4" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libbind9.so.161", + "libisccc.so.161", + "liblwres.so.161"], + "server": ["libbind9.so.160", + "libisccc.so.160", + "liblwres.so.160"] + } + }, + "cifs-utils": { + "lib_name": "cifs-utils", + "sections_number": "9.9", + "lib_description": "通用网络文件系统。", + "version": { + "desktop": "6.8", + "server": "6.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["idmapwb.so", + "pam_cifscreds.so"], + "server": ["idmapwb.so", + "pam_cifscreds.so"] + } + }, + "atkmm": { + "lib_name": "atkmm", + "sections_number": "9.10", + "lib_description": "atk库的C++绑定。", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + }, + "alias": [ + { + "name": "atkmm1.6", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + }, + { + "name": "atkmm", + "version": { + "desktop": "2.28.0", + "server": "2.24.2" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatkmm-1.6.so.11"], + "server": ["libatkmm-1.6.so.11"] + } + }, + "avahi": { + "lib_name": "avahi", + "sections_number": "9.11", + "lib_description": "通过mDNS/DNS-SD协议发现本地网络上的服务。", + "version": { + "desktop": ".7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavahi-core.so.7", + "libavahi-glib.so.1", + "libavahi-client.so.3", + "libavahi-common.so.3", + "libavahi-gobject.so.0", + "libavahi-ui-gtk3.so.0"], + "server": [] + } + }, + "dhcp": { + "lib_name": "dhcp", + "sections_number": "9.12", + "lib_description": "动态分配DHCP", + "version": { + "desktop": "", + "server": "4.3.6" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libdhcpctl.so", + "libomapi.so"] + } + }, + "iproute": { + "lib_name": "iproute", + "sections_number": "9.13", + "lib_description": "命令行网络工具", + "version": { + "desktop": " 4.20.0", + "server": "" + }, + "alias": [ + { + "name": "iproute2", + "version": { + "desktop": " 4.20.0", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["m_ipt.so"], + "server": [] + } + } + } + }, + "##章节名": "10 图形库", + "graphic": { + "description": { + "chapters_number": "10", + "chapters_Name": "图形" + }, + "packages": { + "atk": { + "lib_name": "atk", + "sections_number": "10.1", + "lib_description": "提供给应用程序的可访问性的编程接口。", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + }, + "alias": [ + { + "name": "atk1.0", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + }, + { + "name": "atk", + "version": { + "desktop": "2.30.0", + "server": "2.28.1" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-1.0.so.0"], + "server": ["libatk-1.0.so.0"] + } + }, + "gtk2": { + "lib_name": "gtk2", + "sections_number": "10.2", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + }, + "alias": [ + { + "name": "gtk+2.0", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + }, + { + "name": "gtk2", + "version": { + "desktop": "2.24.32", + "server": "2.24.32" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"], + "server": ["libpixmap.so", + "libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libferret.so", + "libgail.so", + "libgailutil.so.18", + "libgdk-x11-2.0.so.0", + "libgtk-x11-2.0.so.0"] + } + }, + "gtk3": { + "lib_name": "gtk3", + "sections_number": "10.3", + "lib_description": "GTK+ 图形用户界面库", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + }, + "alias": [ + { + "name": "gtk+3.0", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + } + }, + { + "name": "gtk3", + "version": { + "desktop": " 3.24.5", + "server": "3.22.30" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"], + "server": ["libprintbackend-cups.so", + "libprintbackend-file.so", + "libprintbackend-lpr.so", + "libgailutil-3.so.0", + "libgdk-3.so.0", + "libgtk-3.so.0"] + } + }, + "libICE": { + "lib_name": "libICE", + "sections_number": "10.4", + "lib_description": "X.Org X11 ICE 运行时库", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + }, + "alias": [ + { + "name": "libice", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + }, + { + "name": "libICE", + "version": { + "desktop": "1.0.9", + "server": "1.0.9" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libICE.so.6"], + "server": ["libICE.so.6"] + } + }, + "libxext": { + "lib_name": "libxext", + "sections_number": "10.5", + "lib_description": "X.Org 项目提供了 X Window System.X.Org X11 libXext 的开源实现,包含运行时库。", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + }, + "alias": [ + { + "name": "libxext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + }, + { + "name": "libXext", + "version": { + "desktop": "1.3.3", + "server": "1.3.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXext.so.6"], + "server": ["libXext.so.6"] + } + }, + "libpng1.6": { + "lib_name": "libpng1.6", + "sections_number": "10.6", + "lib_description": "libpng 包包含其他程序用于读取和写入 PNG 格式文件的库。", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + }, + "alias": [ + { + "name": "libpng1.6", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + } + }, + { + "name": "libpng", + "version": { + "desktop": "1.6.36", + "server": "1.6.34" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng16.so.16"], + "server": ["libpng16.so.16"] + } + }, + "libx11": { + "lib_name": "libx11", + "sections_number": "10.7", + "lib_description": "Core X11 协议客户端库", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + }, + "alias": [ + { + "name": "libx11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + }, + { + "name": "libX11", + "version": { + "desktop": "1.6.9", + "server": "1.6.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libX11-xcb.so.1", + "libX11.so.6"], + "server": ["libX11-xcb.so.1", + "libX11.so.6"] + } + }, + "libsdl2": { + "lib_name": "libsdl2", + "sections_number": "10.8", + "lib_description": "SDL的重构版", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + }, + "alias": [ + { + "name": "libsdl2", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + } + }, + { + "name": "SDL2", + "version": { + "desktop": "2.0.9", + "server": "2.0.8" + } + } + ], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL2-2.0.so.0"], + "server": [] + } + }, + "libxau": { + "lib_name": "libxau", + "sections_number": "10.9", + "lib_description": "用于提供对 X Window 的单独访问系统显示。", + "version": { + "desktop": "1.0.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXau.so.6"], + "server": [] + } + }, + "libxaw": { + "lib_name": "libxaw", + "sections_number": "10.10", + "lib_description": "Xaw 是一个基于 X Toolkit Intrinsics (Xt) 库的小部件集。", + "version": { + "desktop": "1.0.13", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXaw.so.7"], + "server": [] + } + }, + "fontconfig": { + "lib_name": "fontconfig", + "sections_number": "10.11", + "lib_description": "Fontconfig 根据应用程序指定的要求提供不同的字体。", + "version": { + "desktop": "2.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontconfig.so.1"], + "server": [] + } + }, + "freetype": { + "lib_name": "freetype", + "sections_number": "10.12", + "lib_description": "字体渲染软件库。", + "version": { + "desktop": "2.9.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfreetype.so.6"], + "server": [] + } + }, + "tiff": { + "lib_name": "tiff", + "sections_number": "10.13", + "lib_description": "支持标记图像文件格式。", + "version": { + "desktop": "4.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libtiff.so.5", + "libtiffxx.so.5"], + "server": [] + } + }, + "libxpm": { + "lib_name": "libxpm", + "sections_number": "10.14", + "lib_description": "X.Org X11 libXpm 运行时库", + "version": { + "desktop": "3.5.12", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXpm.so.4"], + "server": [] + } + }, + "libxdmcp": { + "lib_name": "libxdmcp", + "sections_number": "10.15", + "lib_description": "X 显示管理器控制协议 (XDMCP) 提供了一个统一的自主显示器向远程主机请求登录服务的机制。", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdmcp.so.6"], + "server": [] + } + }, + "libxrandr": { + "lib_name": "libxrandr", + "sections_number": "10.16", + "lib_description": "X.Org X11 libXrandr 运行时库", + "version": { + "desktop": "1.5.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrandr.so.2"], + "server": [] + } + }, + "libglu": { + "lib_name": "libglu", + "sections_number": "10.17", + "lib_description": "OpenGL 实用程序库 (GLU) ,它提供了许多函数,这些函数使用基本 OpenGL 库从 OpenGL 提供的更原始的例程中提供更高级别的绘图例程。", + "version": { + "desktop": "9.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libGLU.so.1"], + "server": [] + } + }, + "libdmx": { + "lib_name": "libdmx", + "sections_number": "10.18", + "lib_description": "X.Org 项目提供了 X Window 系统的开源实现。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdmx.so.1"], + "server": ["libdmx.so.1"] + } + }, + "libdrm": { + "lib_name": "libdrm", + "sections_number": "10.19", + "lib_description": "libdrm 提供了一个用户空间库,用于在支持 ioctl 接口的操作系统上访问 DRM(直接渲染管理器)。", + "version": { + "desktop": "2.4.99", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdrm.so.2", + "libdrm_amdgpu.so.1", + "libdrm_intel.so.1", + "libdrm_nouveau.so.2", + "libdrm_radeon.so.1"], + "server": [] + } + }, + "libxmu": { + "lib_name": "libxmu", + "sections_number": "10.20", + "lib_description": "X.Org X11 libXmu/libXmuu 运行时库", + "version": { + "desktop": "1.1.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXmu.so.6", + "libXmuu.so.1"], + "server": [] + } + }, + "libxcb": { + "lib_name": "libxcb", + "sections_number": "10.21", + "lib_description": "X协议C语言绑定 (XCB) ,是 Xlib 的替代品。", + "version": { + "desktop": "1.13.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-composite.so.0", + "libxcb-damage.so.0", + "libxcb-dpms.so.0", + "libxcb-dri2.so.0", + "libxcb-dri3.so.0", + "libxcb-glx.so.0", + "libxcb-present.so.0", + "libxcb-randr.so.0", + "libxcb-record.so.0", + "libxcb-render.so.0", + "libxcb-res.so.0", + "libxcb-screensaver.so.0", + "libxcb-shape.so.0", + "libxcb-shm.so.0", + "libxcb-sync.so.1", + "libxcb-xf86dri.so.0", + "libxcb-xfixes.so.0", + "libxcb-xinerama.so.0", + "libxcb-xinput.so.0", + "libxcb-xkb.so.1", + "libxcb-xtest.so.0", + "libxcb-xv.so.0", + "libxcb-xvmc.so.0", + "libxcb.so.1"], + "server": [] + } + }, + "libxrender": { + "lib_name": "libxrender", + "sections_number": "10.22", + "lib_description": "X.Org X11 libXrender 运行时库", + "version": { + "desktop": "0.9.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXrender.so.1"], + "server": [] + } + }, + "xft": { + "lib_name": "xft", + "sections_number": "10.23", + "lib_description": "Xft 是一个将 X 应用程序与 FreeType 字体连接起来的光栅化库。", + "version": { + "desktop": "2.3.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXft.so.2"], + "server": [] + } + }, + "gdk-pixbuf": { + "lib_name": "gdk-pixbuf", + "sections_number": "10.24", + "lib_description": "创建图形用户界面的多平台工具包", + "version": { + "desktop": "2.38.1", + "server": "" + }, + "alias": [ + { + "name": "gdk-pixbuf2", + "version": { + "desktop": "2.38.1", + "server": "" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgdk_pixbuf-2.0.so.0", + "libgdk_pixbuf_xlib-2.0.so.0", + "libpixbufloader-ani.so", + "libpixbufloader-bmp.so", + "libpixbufloader-gif.so", + "libpixbufloader-icns.so", + "libpixbufloader-ico.so", + "libpixbufloader-jpeg.so", + "libpixbufloader-pnm.so", + "libpixbufloader-qtif.so", + "libpixbufloader-tga.so", + "libpixbufloader-tiff.so", + "libpixbufloader-xbm.so", + "libpixbufloader-xpm.so"], + "server": [] + } + }, + "libfontenc": { + "lib_name": "libfontenc", + "sections_number": "10.25", + "lib_description": "X.Org X11 libfontenc 运行时库。", + "version": { + "desktop": "1.1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontenc.so.1"], + "server": ["libfontenc.so.1"] + } + }, + "libglvnd": { + "lib_name": "libglvnd", + "sections_number": "10.26", + "lib_description": "libglvnd 是一个供应商中立的调度层,用于仲裁多个供应商之间的 OpenGL API 调用。", + "version": { + "desktop": "1.1.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"], + "server": ["libEGL.so.1", + "libGL.so.1", + "libGLESv1_CM.so.1", + "libGLESv2.so.2", + "libGLX.so.0", + "libGLdispatch.so.0", + "libOpenGL.so.0"] + } + }, + "libjpeg-turbo": { + "lib_name": "libjpeg-turbo", + "sections_number": "10.27", + "lib_description": "libjpeg-turbo 是一个 JPEG 图像编解码器。", + "version": { + "desktop": "1.5.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libjpeg.so.62", + "libturbojpeg.so.0"], + "server": [] + } + }, + "libpciaccess": { + "lib_name": "libpciaccess", + "sections_number": "10.28", + "lib_description": "为 X 提供访问 PCI 总线和设备的功能平台无关的方式。", + "version": { + "desktop": ".14", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpciaccess.so.0"], + "server": [] + } + }, + "libpng12": { + "lib_name": "libpng12", + "sections_number": "10.29", + "lib_description": "便携式网络图形格式库", + "version": { + "desktop": "1.2.54", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpng12.so"], + "server": [] + } + }, + "libraw": { + "lib_name": "libraw", + "sections_number": "10.30", + "lib_description": "LibRaw 是一个用于从数码相机读取 RAW 文件的库。", + "version": { + "desktop": "0.19.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libraw.so.19"], + "server": [] + } + }, + "libSM": { + "lib_name": "libSM", + "sections_number": "10.31", + "lib_description": "libSM 软件包中包含 X.Org X11 SM 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSM.so.6"], + "server": [] + } + }, + "libwebp": { + "lib_name": "libwebp", + "sections_number": "10.32", + "lib_description": "这是一种对数码照片图像进行有损压缩的图像格式。", + "version": { + "desktop": "0.6.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libwebp.so.6", + "libwebpdemux.so.2", + "libwebpmux.so.3"], + "server": [] + } + }, + "libxres": { + "lib_name": "libxres", + "sections_number": "10.33", + "lib_description": "X-Resource 是一个扩展,它允许客户端向 X 服务器查询各种资源的使用情况。", + "version": { + "desktop": "1.2.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXRes.so.1"], + "server": [] + } + }, + "libxcomposite": { + "lib_name": "libxcomposite", + "sections_number": "10.34", + "lib_description": "X 复合扩展库", + "version": { + "desktop": "0.4.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXcomposite.so.1"], + "server": [] + } + }, + "libxcursor": { + "lib_name": "libxcursor", + "sections_number": "10.35", + "lib_description": "libXcursor 是一个旨在帮助定位和加载游标的库。游标可以从文件或内存中加载。", + "version": { + "desktop": "1.1.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["ibXcursor.so.1"], + "server": [] + } + }, + "libxdamage": { + "lib_name": "libxdamage", + "sections_number": "10.36", + "lib_description": "X Damage Extension 允许应用程序跟踪可绘制对象的修改区域。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXdamage.so.1"], + "server": [] + } + }, + "libxfixes": { + "lib_name": "libxfixes", + "sections_number": "10.37", + "lib_description": "X Fixes 扩展为应用程序提供了针对核心协议中各种限制的变通方法。", + "version": { + "desktop": "5.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfixes.so.3"], + "server": [] + } + }, + "libxfont": { + "lib_name": "libxfont", + "sections_number": "10.38", + "lib_description": "libXfont 提供了遗留 X11 字体系统的核心。", + "version": { + "desktop": "2.0.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXfont2.so.2"], + "server": [] + } + }, + "libxi": { + "lib_name": "libxi", + "sections_number": "10.39", + "lib_description": "libXi 是 X 输入扩展的客户端库。", + "version": { + "desktop": "1.7.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXi.so.6"], + "server": [] + } + }, + "libxinerama": { + "lib_name": "libxinerama", + "sections_number": "10.40", + "lib_description": "Xinerama 是 X Window System 的扩展。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXinerama.so.1"], + "server": [] + } + }, + "libxkbcommon": { + "lib_name": "libxkbcommon", + "sections_number": "10.41", + "lib_description": "xkbcommon 是一个用于处理键盘描述的库。", + "version": { + "desktop": "0.8.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbcommon-x11.so.0"], + "server": [] + } + }, + "libxkbfile": { + "lib_name": "libxkbfile", + "sections_number": "10.42", + "lib_description": "X 服务器和实用程序使用 Libxkbfile 来解析 XKB 配置数据文件。", + "version": { + "desktop": "1.0.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxkbfile.so.1"], + "server": [] + } + }, + "libxklavier": { + "lib_name": "libxklavier", + "sections_number": "10.43", + "lib_description": "这个包是一个为 X 键盘扩展提供高级 API 的库,称为 XKB。", + "version": { + "desktop": "5.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxklavier.so.16"], + "server": [] + } + }, + "cairo": { + "lib_name": "cairo", + "sections_number": "10.44", + "lib_description": "Cairo 是一个支持多种输出设备的 2D 图形库。", + "version": { + "desktop": "1.16.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libcairo-gobject.so.2", + "libcairo-script-interpreter.so.2", + "libcairo.so.2"], + "server": [] + } + }, + "fltk1.3": { + "lib_name": "fltk1.3", + "sections_number": "10.45", + "lib_description": "FLTK是一个跨平台的 C++ GUI 工具包。", + "version": { + "desktop": "1.1.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfltk.so.1.3", + "libfltk_forms.so.1.3", + "libfltk_gl.so.1.3", + "libfltk_images.so.1.3"], + "server": [] + } + }, + "libxss": { + "lib_name": "libxss", + "sections_number": "10.46", + "lib_description": "此包包含 X.Org X11 libXss 的运行时库。", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXss.so.1"], + "server": [] + } + }, + "libxshmfence": { + "lib_name": "libxshmfence", + "sections_number": "10.47", + "lib_description": "X11 的共享内存栅栏,在 DRI3 中使用。", + "version": { + "desktop": "1.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxshmfence.so.1"], + "server": [] + } + }, + "libxt": { + "lib_name": "libxt", + "sections_number": "10.48", + "lib_description": "X.Org X11 libXt 运行时库", + "version": { + "desktop": "1.1.5", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXt.so.6"], + "server": [] + } + }, + "libxtst": { + "lib_name": "libxtst", + "sections_number": "10.49", + "lib_description": "X.Org X11 libXtst 运行时库", + "version": { + "desktop": "1.2.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXtst.so.6"], + "server": [] + } + }, + "libxvmc": { + "lib_name": "libxvmc", + "sections_number": "10.50", + "lib_description": "XvMC 是 X 窗口系统的 X 视频扩展 (Xv) 的扩展。", + "version": { + "desktop": "1.0.10", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXvMC.so.1", + "libXvMCW.so.1"], + "server": [] + } + }, + "libxxf86dga": { + "lib_name": "libxxf86dga", + "sections_number": "10.51", + "lib_description": "XFree86-DGA 扩展的客户端库", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86dga.so.1"], + "server": [] + } + }, + "libxxf86vm": { + "lib_name": "libxxf86vm", + "sections_number": "10.52", + "lib_description": "为 XFree86-VidModeExtension 提供一个扩展库。", + "version": { + "desktop": "1.1.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libXxf86vm.so.1"], + "server": [] + } + }, + "pango1.0": { + "lib_name": "pango1.0", + "sections_number": "10.53", + "lib_description": "Pango 是一个用于布局和渲染文本的库,重点是关于国际化。", + "version": { + "desktop": "1.42.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpango-1.0.so.0", + "libpangocairo-1.0.so.0", + "libpangoft2-1.0.so.0", + "libpangoxft-1.0.so.0"], + "server": [] + } + }, + "pixman": { + "lib_name": "pixman", + "sections_number": "10.54", + "lib_description": "Pixman 是一个用于像素操作的低级软件库,提供图像合成和梯形光栅化等功能。", + "version": { + "desktop": "0.36.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libpixman-1.so.0"], + "server": [] + } + }, + "qt4-x11": { + "lib_name": "qt4-x11", + "sections_number": "10.55", + "lib_description": "开发应用程序的软件工具包", + "version": { + "desktop": "4.8.7", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQtCLucene.so.4", + "libQtCore.so.4", + "libQtDBus.so.4", + "libQtDeclarative.so.4", + "libQtGui.so.4", + "libQtNetwork.so.4", + "libQtScript.so.4", + "libQtSql.so.4", + "libQtXmlPatterns.so.4", + "libQtXml.so.4"], + "server": [] + } + }, + "qtbase-opensource-src": { + "lib_name": "qtbase-opensource-src", + "sections_number": "10.56", + "lib_description": "Qt工具包的核心组件", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5Concurrent.so.5", + "libQt5Core.so.5", + "libQt5DBus.so.5", + "libQt5Network.so.5", + "libQt5Sql.so.5", + "libQt5Test.so.5", + "libQt5Xml.so.5", + "libqconnmanbearer.so", + "libqgenericbearer.so", + "libqnmbearer.so", + "libqsqlite.so"], + "server": [] + } + }, + "qtx11extras-opensource-src": { + "lib_name": "qtx11extras-opensource-src", + "sections_number": "10.57", + "lib_description": "Qt 5 X11额外功能Qt是一个跨平台的c++应用程序框架。Qt的主要特性是它丰富的widget集,提供标准的GUI功能。这个包包含了从Qt 5中访问X11内容的库。", + "version": { + "desktop": "5.11.3", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libQt5X11Extras.so.5"], + "server": [] + } + }, + "xcb-util": { + "lib_name": "xcb-util", + "sections_number": "10.58", + "lib_description": "XCB 工具模块", + "version": { + "desktop": "0.3.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-util.so.1"], + "server": [] + } + }, + "xcb-util-image": { + "lib_name": "xcb-util-image", + "sections_number": "10.59", + "lib_description": "提供XImage和XShmImage功能端口", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-image.so.0"], + "server": [] + } + }, + "xcb-util-keysyms": { + "lib_name": "xcb-util-keysyms", + "sections_number": "10.60", + "lib_description": "标准X键值对转换工具", + "version": { + "desktop": "0.4.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-keysyms.so.1"], + "server": [] + } + }, + "xcb-util-renderutil": { + "lib_name": "xcb-util-renderutil", + "sections_number": "10.61", + "lib_description": "渲染扩展工具", + "version": { + "desktop": "0.3.9", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-render-util.so.0"], + "server": [] + } + }, + "xcb-util-wm": { + "lib_name": "xcb-util-wm", + "sections_number": "10.62", + "lib_description": "窗口管理器", + "version": { + "desktop": "0.4.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxcb-ewmh.so.2", + "libxcb-icccm.so.4"], + "server": [] + } + }, + "xorg-x11-server": { + "lib_name": "xorg-x11-server", + "sections_number": "10.63", + "lib_description": "X.Org X11 X 服务器", + "version": { + "desktop": "1.20.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["modesetting_drv.so", + "libglx.so", + "libexa.so", + "libfbdevhw.so", + "libfb.so", + "libglamoregl.so", + "libint10.so", + "libshadowfb.so", + "libshadow.so", + "libvbe.so", + "libvgahw.so", + "libwfb.so"], + "server": [] + } + }, + "libsdl1.2": { + "lib_name": "libsdl1.2", + "sections_number": "10.64", + "lib_description": "跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、 MPEG播放器和其他应用软件", + "version": { + "desktop": "1.2.15", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libSDL-1.2.so.0"], + "server": ["libSDL-1.2.so.0"] + } + } + } + }, + "##章节名": "11 多媒体库", + "multimedia": { + "description": { + "chapters_number": "11", + "chapters_Name": "多媒体" + }, + "packages": { + "alsa-lib": { + "lib_name": "alsa-lib", + "sections_number": "11.1", + "lib_description": "编译 ALSA 应用程序的用户空间库", + "version": { + "desktop": "1.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libasound.so.2"], + "server": [] + } + }, + "ffmpeg": { + "lib_name": "ffmpeg", + "sections_number": "11.2", + "lib_description": "Linux音视频播放解决方案", + "version": { + "desktop": "4.1.8", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libavcodec.so.58", + "libavfilter.so.7", + "libavformat.so.58", + "libavresample.so.4", + "libavutil.so.56", + "libpostproc.so.55", + "libswresample.so.3", + "libswscale.so.5"], + "server": [] + } + }, + "gstreamer1.0": { + "lib_name": "gstreamer1.0", + "sections_number": "11.3", + "lib_description": "GStreamer 流媒体框架运行时", + "version": { + "desktop": "1.14.4", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libgstbase-1.0.so.0", + "libgstcheck-1.0.so.0", + "libgstcontroller-1.0.so.0", + "libgstcoreelements.so", + "libgstcoretracers.so", + "libgstnet-1.0.so.0", + "libgstreamer-1.0.so.0"], + "server": [] + } + }, + "libdvdnav": { + "lib_name": "libdvdnav", + "sections_number": "11.4", + "lib_description": "显示 DVD 视频菜单功能库", + "version": { + "desktop": "6.0.0", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdnav.so.4"], + "server": [] + } + }, + "libdvdread": { + "lib_name": "libdvdread", + "sections_number": "11.5", + "lib_description": "用于访问 DVD 磁盘的库", + "version": { + "desktop": "6.0.1", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libdvdread.so.4", "libdvdread.so.7"], + "server": [] + } + }, + "pulseaudio": { + "lib_name": "pulseaudio", + "sections_number": "11.6", + "lib_description": "Linux声音服务器", + "version": { + "desktop": "12.2", + "server": "" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libalsa-util.so", + "libavahi-wrap.so", + "libbluez5-util.so", + "libcli.so", + "libprotocol-cli.so", + "libprotocol-esound.so", + "libprotocol-http.so", + "libprotocol-native.so", + "libprotocol-simple.so", + "libpulsedsp.so", + "libpulse-mainloop-glib.so.0", + "libpulse-simple.so.0", + "libpulse.so.0", + "libraop.so", + "librtp.so", + "libwebrtc-util.so"], + "server": [] + } + } + } + }, + "##章节名": "12 打印扫描库", + "print_scan": { + "description": { + "chapters_number": "12", + "chapters_Name": "打印扫描" + }, + "packages": { + "cups-filters": { + "lib_name": "cups-filters", + "sections_number": "12.1", + "lib_description": "CUPS 是苹果公司为 Mac OS X 和其他类 UNIX 操作系统开发的基于标准的开源打印系统。CUPS 使用 Internet 打印协议 (IPP) 并提供 System V 和 Berkeley 命令行界面、Web 界面和C API 来管理打印机和打印作业。该项目提供后端、过滤器和其他软件,cups-filters是过滤器。", + "version": { + "desktop": "1.21.6", + "server": "1.20.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libfontembed.so.1", + "libcupsfilters.so.1"], + "server": ["libfontembed.so.1", + "libcupsfilters.so.1"] + } + }, + "sane-backends": { + "lib_name": "sane-backends", + "sections_number": "12.2", + "lib_description": "SANE 应用程序编程接口 (API) ,提供对任何光栅图像扫描仪硬件(平板扫描仪、手持式扫描仪、视频和照相机、图像采集卡等)的标准化访问。", + "version": { + "desktop": "1.0.27", + "server": "1.0.27" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L0", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libsane.so.1"], + "server": [] + } + } + } + }, + "##章节名": "13 运行时语言库", + "runtime_language": { + "description": { + "chapters_number": "13", + "chapters_Name": "运行时语言" + }, + "packages": { + "openjdk": { + "lib_name": "openjdk", + "sections_number": "13.1", + "lib_description": "OpenJDK 是 Java 标准版 (Java SE) 和 Java 开发工具包 (JDK) 的开源实现。OpenJDK 源代码是这些商业 Java 产品的基础。它包含了Java 运行时环境,用以运行 Java 程序,也包含了 Java 虚拟机和一些别的组成。", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + }, + "alias": [ + { + "name": "openjdk-lts", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "openjdk-11", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-11-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + }, + { + "name": "java-1.8.0-openjdk", + "version": { + "desktop": "11.0.9", + "server": "11.0.6" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libatk-wrapper.so.6", + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjawt.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"], + "server": [ + "libattach.so", + "libawt_headless.so", + "libawt.so", + "libawt_xawt.so", + "libdt_socket.so", + "libextnet.so", + "libfontmanager.so", + "libinstrument.so", + "libj2gss.so", + "libj2pcsc.so", + "libj2pkcs11.so", + "libjaas.so", + "libjavajpeg.so", + "libjava.so", + "libjdwp.so", + "libjimage.so", + "libjsig.so", + "libjsound.so", + "liblcms.so", + "libmanagement_agent.so", + "libmanagement_ext.so", + "libmanagement.so", + "libmlib_image.so", + "libnet.so", + "libnio.so", + "libprefs.so", + "librmi.so", + "libsaproc.so", + "libsctp.so", + "libsplashscreen.so", + "libsunec.so", + "libunpack.so", + "libverify.so", + "libzip.so"] + } + }, + "perl": { + "lib_name": "perl", + "sections_number": "13.2", + "lib_description": "Perl库:开发文件用于开发嵌入Perl解释器的应用程序的文件。", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + }, + "alias": [ + { + "name": "perl", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + }, + { + "name": "perl-libs", + "version": { + "desktop": "5.28.1", + "server": "5.26.3" + } + } + ], + "necessity": { + "desktop": { + "level": "L3", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libperl.so.5.30"], + "server": ["libperl.so.5.28"] + } + } + } + }, + "##章节名": "14 编程开发库", + "development": { + "description": { + "chapters_number": "14", + "chapters_Name": "编程开发" + }, + "packages": { + "libxml2": { + "lib_name": "libxml2", + "sections_number": "14.1", + "lib_description": "Libxml2 是一个xml的c语言版的解析器", + "version": { + "desktop": "2.9.4", + "server": "2.9.7" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L1", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L1", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libxml2.so.2"], + "server": ["libxml2.so.2"] + } + }, + "libunwind": { + "lib_name": "libunwind", + "sections_number": "14.2", + "lib_description": "可移植且高效的 C 编程接口 (API),用于确定程序的调用链。", + "version": { + "desktop": "1.2.1", + "server": "1.3.1" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L2", + "options": "basic", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": ["libunwind.so.8", + "libunwind-coredump.so.0"], + "server": ["libunwind.so.8", + "libunwind-coredump.so.0"] + } + } + } + }, + "##章节名": "15 基础计算库", + "basic_calculation": { + "description": { + "chapters_number": "15", + "chapters_Name": "基础计算" + }, + "packages": { + "orbit2": { + "lib_name": "orbit2", + "sections_number": "15.1", + "lib_description": "高性能CORBA实现CORBA:一种使程序对象能够在不同的应用程序之间通信、发送请求和接收回复的体系结构,而不管它们的编程语言、操作系统或网络位置如何。", + "version": { + "desktop": "", + "server": "2.14.19" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libORBit-2.so", + "libORBitCosNaming-2.so.0", + "libORBit-imodule-2.so"] + } + }, + "atlas": { + "lib_name": "atlas", + "sections_number": "15.2", + "lib_description": "自动调整线性代数软件:是一种自动生成和优化数值软件的方法。目前,ATLAS为被称为基本线性代数子程序(BLAS)的完整线性代数内核集和LAPACK库中的线性代数例程子集提供了优化版本。", + "version": { + "desktop": "", + "server": "3.10.3" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libsatlas.so.3", + "libtatlas.so.3"] + } + }, + "lapack": { + "lib_name": "lapack", + "sections_number": "15.3", + "lib_description": "基本线性代数参考实现BLAS(基本线性代数子程序)是一组用于大多数基本向量和矩阵运算的高效例程。它们被广泛用作其他高质量线性代数软件的基础", + "version": { + "desktop": "", + "server": "3.8.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libblas.so.3", + "liblapack.so.3", + "liblapacke.so.3"] + } + } + } + }, + "##章节名": "16 存储库", + "storage": { + "description": { + "chapters_number": "16", + "chapters_Name": "存储" + }, + "packages": { + "ceph": { + "lib_name": "ceph", + "sections_number": "16.1", + "lib_description": "Ceph是一个开源软件定义的存储平台,它在单个分布式计算机集群上实现对象存储,并提供用于对象,块和文件级存储的3合1接口。Ceph的主要目标是实现无单点故障的完全分布式操作,可扩展到艾字节级别,并且可以免费使用。", + "version": { + "desktop": "", + "server": "12.2.8" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcls_cephfs.so.1", + "libcls_hello.so.1", + "libcls_journal.so.1", + "libcls_kvs.so.1", + "libcls_lock.so.1", + "libcls_log.so.1", + "libcls_lua.so.1", + "libcls_numops.so.1", + "libcls_rbd.so.1", + "libcls_refcount.so.1", + "libcls_replica_log.so.1", + "libcls_rgw.so.1", + "libcls_sdk.so.1", + "libcls_timeindex.so.1", + "libcls_user.so.1", + "libcls_version.so.1", + "libceph_zlib.so", + "libceph_zstd.so", + "libec_jerasure.so", + "libec_jerasure_generic.so", + "libec_lrc.so", + "libec_shec.so", + "libec_shec_generic.so", + "libosd_tp.so", + "libos_tp.so"] + } + } + } + }, + "##章节名": "17 虚拟化库", + "virtualization": { + "description": { + "chapters_number": "17", + "chapters_Name": "虚拟化" + }, + "packages": { + "libvirt": { + "lib_name": "libvirt", + "sections_number": "17.1", + "lib_description": "用于管理虚拟化平台的开源的API,后台程序和管理工具。", + "version": { + "desktop": "", + "server": "5.5.0" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L2", + "options": "basic", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libvirt-admin.so.0", + "libvirt-lxc.so.0", + "libvirt-qemu.so.0", + "libvirt.so.0", + "libvirt_driver_interface.so", + "libvirt_driver_network.so", + "libvirt_driver_nodedev.so", + "libvirt_driver_nwfilter.so", + "libvirt_driver_qemu.so", + "libvirt_driver_secret.so", + "libvirt_driver_storage.so", + "lockd.so", + "libvirt_storage_backend_disk.so", + "libvirt_storage_backend_fs.so", + "libvirt_storage_backend_iscsi.so", + "libvirt_storage_backend_iscsi-direct.so", + "libvirt_storage_backend_logical.so", + "libvirt_storage_backend_mpath.so", + "libvirt_storage_backend_rbd.so", + "libvirt_storage_backend_scsi.so", + "libvirt_storage_backend_gluster.so", + "libvirt_storage_file_gluster.so", + "libvirt_storage_file_fs.so"] + } + } + } + }, + "##章节名": "18 集群高可用库", + "high_availability": { + "description": { + "chapters_number": "18", + "chapters_Name": "集群高可用" + }, + "packages": { + "pacemaker": { + "lib_name": "pacemaker", + "sections_number": "18.1", + "lib_description": "Pacemaker是一种先进的、可扩展的高可用性集群资源管理器", + "version": { + "desktop": "", + "server": "2.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcib.so.27", + "libcrmcommon.so.34", + "libcrmservice.so.28", + "liblrmd.so.28", + "libpacemaker.so.1", + "libstonithd.so.26", + "libpe_rules.so.26", + "libpe_status.so.28"] + } + }, + "corosync": { + "lib_name": "corosync", + "sections_number": "18.2", + "lib_description": "Corosync 集群引擎和应用程序编程接口", + "version": { + "desktop": "", + "server": "3.0.2" + }, + "alias": [], + "necessity": { + "desktop": { + "level": "L0", + "options": "expansion", + "deprecated": "false" + }, + "server": { + "level": "L3", + "options": "expansion", + "deprecated": "false" + } + }, + "share_objs": { + "desktop": [], + "server": ["libcfg.so.7", + "libcmap.so.4", + "libcorosync_common.so.4", + "libcpg.so.4", + "libquorum.so.5", + "libsam.so.4", + "libvotequorum.so.8"] + } + } + } + } + } + } +} diff --git a/LibChecker/graphical_test.py b/LibChecker/graphical_test.py new file mode 100755 index 0000000000000000000000000000000000000000..d2dadd9b0f65230a0a0c1a3b8f5ba3db57f319c0 --- /dev/null +++ b/LibChecker/graphical_test.py @@ -0,0 +1,16 @@ +#!/usr/bin/python3 + +import tkinter as tk + +window = tk.Tk() + +window.title('My Window') + +window.geometry('1000x618') + + +l = tk.Label(window, text='nihao! this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2) + +l.pack() + +window.mainloop() diff --git a/LibChecker/lib_checker-01-JA.py b/LibChecker/lib_checker-01-JA.py new file mode 100755 index 0000000000000000000000000000000000000000..c1500b870c122774252d23fb972d2f0c19730b30 --- /dev/null +++ b/LibChecker/lib_checker-01-JA.py @@ -0,0 +1,644 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +# @Author : Wang Jinlong +# @Time : 2022/11/09 16:00 +# @File : Alpha OSAPIChecker Tools Source Code + +import argparse +import json +import os +import platform +import sys +import time + +# -1. Inherit arguments from CUI +# there are some arguments match with main program + ## --strategy: + ## --level: + ## --ostype: + ## --pkgmngr: + ## --json: +parser = argparse.ArgumentParser(description="This Progermm is a OSChecker", prog="OSChecker") +parser.add_argument('-s', '--strategy', action='store', type=str, help='Choice OSAPIChecker strategy: base,only-expand,with-expand', default="base") +parser.add_argument('-l', '--level', action='store', type=str, help='Choice OSAPIChecker level: l1,l2,l3,l1l2,l1l2l3', default="l1l2") +parser.add_argument('-t', '--ostype', action='store', type=str, help='OSType of current OS: desktop, server, embed,other', default="desktop") +parser.add_argument('-p', '--pkgmngr', action='store', type=str, help='Package Manager of current OS: apt-deb, yum-rpm, src-bin, other', default="apt-deb") +parser.add_argument('-o', '--organize', action='store', type=str, help='Choice Organize or Company') +parser.add_argument('-j', '--json', action='store', type=str, help='Choice OSChecker Json templete file', required=False) # this line use for dect the json file. +parser.add_argument('-T', '--timetmp', action='store', type=str) +args = parser.parse_args() # write arguments to struct + +g_inputstrategy = args.strategy +g_inputlevel = args.level +g_inputostype = args.ostype +g_inputpkgmngr = args.pkgmngr +g_inputorganize = args.organize +g_inputjson = args.json + +g_time_stamp = args.timetmp +g_output_filename = "Outputs/libchecker-output_" + g_time_stamp + ".json" +g_output_logname = "Logs/libchecker_" + g_time_stamp + ".log" + +# option module import +#if (g_inputpkgmngr == "apt-deb"): +# import apt_pkg # import for apt-deb package management tools + + +# for logger handler +class Logger(object): + def __init__(self, filename='default.log', stream=sys.stdout): + self.terminal = stream + self.log = open(filename, 'a') + + def write(self, message): + self.terminal.write(message) + self.log.write(message) + + def flush(self): + pass + +sys.stdout = Logger("Logs/libchecker-tmp.log", sys.stdout) +#sys.stderr = Logger("Logs/a.log_file", sys.stderr) + +# 0. Global Resources Initialized +## 0.1 init dict and list data structures +g_pkginfodict_from_json = {} # read pkacage info from json file +g_libinfodict_from_json = {} # read library info from json file +g_bind_pkglib_from_json = {} # bing package and library info +g_liblist_from_json = {} # bing package and library info +g_pkginfodict_from_os = {} # dict buffer for package info from current os +g_libinfodict_from_os = {} # dict buffer for library info from current os +g_liblist_from_os = {} # dict buffer for library info from current os +g_libchecker_comp_status = {} # dict for libchecker compare result +g_jsonfile_dict = {} # a josn file struct +g_pkgstd_dict = {} # a dict store json node mata-date +g_counter_flags = {} # a conuter struct +g_storejsondict = {} +g_pkgversiodict = {} +g_lib_location_path = " " +g_notfind_set_flag = 0 # bool flag for find source package status +g_chapter_dict = {} +g_genresults_to_json = {} +g_subresults_to_json = {} +g_pkgflag_dict = {} +g_ostype = g_inputostype # global magic string for OS type +g_pkgmgr = g_inputpkgmngr # global magic string for OS type +g_test_dict = {} +g_test_list = [] + +## 0.2 a recycle call function for user +def libchecker_over_jobs(): + #time_now = time.strftime("%Y-%m-%d_%H-%M-%S",time.localtime()) + #log_file_name = "Logs/libchecker-" + g_time_stamp + ".log" + os.rename("Logs/libchecker-tmp.log", g_output_logname) + +## 0.3 platform info +def get_env_info(): + print("系统信息:") + str1 = os.popen("cat /etc/os-release").read() + str2 = str1.split("\n") + for s1 in str2: + print("\t", s1) + +def get_stdjsons_info(json_file_path): + with open(json_file_path) as f: + f_dict = json.load(f) + + global g_jsonfile_dict + g_jsonfile_dict = f_dict + lib_basedict = f_dict['libs']['category']['base']['packages'] + + print("标准信息:") + print("\t标准简要信息:") + print("\t\t标准号: %s" % f_dict['std_description']['std_number']) + print("\t\t文件名: %s" % f_dict['std_description']['std_name']) + print("\t库检查器信息:") + print("\t\t检查位置: %s" % f_dict['libs']['lib_location']) + +def libchecker_environment_init(): + global g_counter_flags + + g_counter_flags = {'pkg_counter': {'total': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} , 'passed': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'warning': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'failed': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} }, 'lib_counter': {'total': 0, 'passed': 0, 'warning': 0, 'failed': 0}} + + get_env_info() + + get_stdjsons_info('Jsons/lib_list.json') + +# if (g_inputpkgmngr == "apt-deb"): +# apt_pkg.init_system() + +##====获取别名信息字典====## +def get_alias_dcit(l_realname): + + l_dict_alias_info = {} + l_dict_binary_name = {} + l_dict_tmp = {} + + l_list_binary_name = [] + l_list_alias = [] + l_list_tmp = [] + + + if(len(g_storejsondict[l_realname]['alias']) == 0): + l_list_binary_name.clear() + + if (g_inputpkgmngr == "yum-rpm"): + l_list_binary_name = get_rpmpkg_from_srcpkg(l_realname) + else: + l_list_binary_name = get_debpkg_from_srcpkg(l_realname) + + if(len(l_list_binary_name) != 0): + for i in range(0, len(l_list_binary_name)): + l_dict_binary_name.update({l_list_binary_name[i]: '-'}) + l_dict_alias_info.update({l_realname: l_dict_binary_name}) + else: + l_dict_alias_info.update({l_realname: "-"}) + else: + l_list_alias.clear() + l_list_tmp.clear() + + for i in range(0, len(g_storejsondict[l_realname]['alias'])): + if "/" in g_storejsondict[l_realname]['alias'][i]['name']: + l_list_tmp = g_storejsondict[l_realname]['alias'][i]['name'].split('/') + for num in range(0, len(l_list_tmp)): + l_list_alias.append(l_list_tmp[num]) + else: + l_list_alias.append(g_storejsondict[l_realname]['alias'][i]['name']) + + if l_realname not in l_list_alias: + l_list_alias.append(l_realname) + + for k in range(0, len(l_list_alias)): + l_list_binary_name.clear() + l_dict_binary_name.clear() + + if (g_inputpkgmngr == "yum-rpm"): + l_list_binary_name = get_rpmpkg_from_srcpkg(l_list_alias[k]) + else: + l_list_binary_name = get_debpkg_from_srcpkg(l_list_alias[k]) + + if(len(l_list_binary_name) != 0): + for j in range(0, len(l_list_binary_name)): + l_dict_binary_name.update({l_list_binary_name[j]: '-'}) + + l_dict_tmp = dict.fromkeys(l_dict_binary_name.keys(), None) + l_dict_alias_info[l_list_alias[k]] = l_dict_tmp + else: + l_dict_alias_info[l_list_alias[k]] = "-" + + return l_dict_alias_info + +##====检查源码包仓库是否存在====## +def check_per_pkg_info(src_pkgname): + global g_notfind_set_flag + global g_genresults_to_json + global g_test_dict + global g_counter_flags + + srcpkgver = [] + + if g_inputostype == "desktop" or g_inputostype == "server": + if (g_inputpkgmngr == "apt-deb"): + l_search_pname = os.popen('apt-cache showsrc %s 2>/dev/null | grep ^Package: | awk -F": " \'{print $2}\'' %(src_pkgname)) + l_pname = l_search_pname.read().split("\n")[0] + l_search_pname.close() + if(l_pname == src_pkgname): + p_srcpkgver = os.popen('apt-cache showsrc %s 2>/dev/null | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + elif (g_inputpkgmngr == "yum-rpm"): + p_srcpkgver = os.popen('yum list %s 2>/dev/null | awk \'{print $2}\' | sed -n \'3p\' ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + else: + print("Please input --ostype=[desktop,server,embde,...] and --pkgmngr=[apt-deb,yum-rpm,src-bin,...]") + + g_counter_flags['pkg_counter']['total']['all'] += 1 + + print("\t\t系统实现: ") + if (len(srcpkgver) == 0): + print("\t\t\t\t未发现 -> ", src_pkgname.ljust(20)) + else: + print("\t\t\t\t实现包名 -> ", src_pkgname.ljust(20),"实现版本 -> ",srcpkgver) + g_counter_flags['pkg_counter']['passed']['all'] += 1 + g_notfind_set_flag = 1 + +##====查询共享库路径信息====## +def check_sharelib_info(lib_soname): + + global g_lib_location_path + global g_counter_flags + g_lib_location_path = "0" + + global g_counter_flags + g_counter_flags['lib_counter']['total'] += 1 + l_list = ["/lib", "/lib64", "/usr/lib", "/usr/lib64"] + + for path_tmp in l_list: + for realpath, dirs, files in os.walk(path_tmp): + if lib_soname in files: + full_path = os.path.join(path_tmp, realpath, lib_soname) + g_lib_location_path = (os.path.normpath(os.path.abspath(full_path))) + if g_lib_location_path != "0": + break + + if g_lib_location_path == "0": + return "not found" + else: + return g_lib_location_path + +##====主函数====## +def libchecker_checking_loop(): + global g_notfind_set_flag + global g_chapter_dict + global g_genresults_to_json + global g_subresults_to_json + global g_storejsondict + global g_test_list + global g_test_dict + global g_pkgflag_dict + + l_dict_to_json = {} + l_pkgresult_to_json = {} + l_dict_alias_info = {} #存储写入json文件Binary package信息的字典 + l_dict_binary_list = {} + + del g_jsonfile_dict['libs']['category']['##章节名'] + print("") + print("开始检查: ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + for chapter_class in g_jsonfile_dict['libs']['category']: + if chapter_class == 'base': + l_tmp_dict = g_jsonfile_dict['libs']['category']['base']['packages'] + del l_tmp_dict['##glibc'] + else: + l_tmp_dict = g_jsonfile_dict['libs']['category'][chapter_class]['packages'] + for key in l_tmp_dict: + g_chapter_dict.update({ key: l_tmp_dict[key]['sections_number']}) + if (args.level == "l1"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L1"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l2"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L2"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l3"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l1l2"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l1l3"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L2"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l2l3"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L1"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l1l2l3"): + g_storejsondict[key] = l_tmp_dict[key] + else: + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + print("[Warnning]: Invalid input options, execute use default options \"--strate=base --levle=l1l2\"") + + for key4 in g_storejsondict: + g_test_dict.update({key4 : "wwww"}) + l_dict_to_json={'Level': 'gen', 'Shared library':'gen', 'Required version': 'gen', 'Binary package':'gen'} + g_genresults_to_json.update({ key4 : l_dict_to_json }) + + if ( g_inputstrategy == "base" ): + print(g_genresults_to_json) + print(g_storejsondict) + for l_name in list(g_genresults_to_json.keys()): + if ( g_storejsondict[l_name]['necessity'][g_inputostype]['options'] != "basic" ): + del g_genresults_to_json[l_name] + g_storejsondict.pop(l_name) + elif( g_inputstrategy == "with-expand" ): + for l_name in list(g_genresults_to_json.keys()): + if ( len(g_storejsondict[l_name]['necessity'][g_inputostype]['options']) == 0 ): + del g_genresults_to_json[l_name] + g_storejsondict.pop(l_name) + elif( g_inputstrategy == "only-expand" ): + for l_name in list(g_genresults_to_json.keys()): + if ( g_storejsondict[l_name]['necessity'][g_inputostype]['options'] != "expansion" ): + del g_genresults_to_json[l_name] + g_storejsondict.pop(l_name) + else: + print("Error: --strategy 参数指定错误") + exit() + + with open(g_output_filename,"w") as f: + json.dump(g_genresults_to_json,f) + + for last_key in g_storejsondict: + l_pkgresult_to_json.clear() + + l_dict_alias_info = get_alias_dcit(last_key) + l_require_version = g_storejsondict[last_key]['version'][g_inputostype] #源码包需求版本 + + ###向json文件写入'Level'信息 + with open(g_output_filename, 'r') as fr: + json_level = json.load(fr) + json_level[last_key]['Level'] = g_storejsondict[last_key]['necessity'][g_inputostype]['level'] + with open(g_output_filename, 'w+') as fw: + json.dump(json_level,fw,ensure_ascii=False,indent=4) + ###向json文件写入'Required version'信息 + with open(g_output_filename, 'r') as fr: + json_required_ver = json.load(fr) + json_required_ver[last_key]['Required version'] = l_require_version + with open(g_output_filename, 'w+') as fw: + json.dump(json_required_ver,fw,ensure_ascii=False,indent=4) + + if (len(g_storejsondict[last_key]['version'][g_ostype]) != 0): + for l_src_name in list(l_dict_alias_info.keys()): + l_src_status = 0 + + if (l_dict_alias_info[l_src_name] != "-"): + l_dict_binary_list.clear() + l_dict_binary_list = l_dict_alias_info[l_src_name] + for l_binary_name in list(l_dict_binary_list.keys()): + if (g_inputpkgmngr == "yum-rpm"): + l_rpm_local_version = get_rpmpkg_local_verison(l_binary_name) + if (l_rpm_local_version == "-"): + del l_dict_alias_info[l_src_name][l_binary_name] + else: + l_src_status += 1 + l_binary_version_status = get_rpmpkg_ver_contrast(l_rpm_local_version, l_require_version) + l_dict_binary_list[l_binary_name] = {'status': l_binary_version_status, 'local version': l_rpm_local_version} + else: + l_deb_local_version = get_debpkg_local_version(l_binary_name, l_src_name) + if (l_deb_local_version == "-"): + del l_dict_binary_list[l_binary_name] + else: + l_src_status += 1 + l_binary_version_status = get_debpkg_ver_contrast(l_deb_local_version, l_require_version) + l_dict_binary_list[l_binary_name] = {'status': l_binary_version_status, 'local version': l_deb_local_version} + + if (l_src_status == 0): + l_dict_alias_info[l_src_name] = "Don`t find installed packages" + else: + l_dict_alias_info[l_src_name] = l_dict_binary_list + else: + l_dict_alias_info[l_src_name] = "None" + else: + l_dict_alias_info[l_src_name] = "None" + + ###向json文件写入'Binary package'信息 + with open(g_output_filename, 'r') as fr: + json_alias_info = json.load(fr) + json_alias_info[last_key]['Binary package'] = l_dict_alias_info + with open(g_output_filename, 'w+') as fw: + json.dump(json_alias_info,fw,ensure_ascii=False,indent=4) + + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L1"): + g_counter_flags['pkg_counter']['total']['l1'] += 1 + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L2"): + g_counter_flags['pkg_counter']['total']['l2'] += 1 + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L3"): + g_counter_flags['pkg_counter']['total']['l3'] += 1 + print("\t正在检查 ", '<',last_key,'>', "...") + print("\t\t标准约定:") + print("\t\t\t\t从属章节 -> ", g_chapter_dict[last_key].ljust(20), "兼容级别 -> ", g_storejsondict[last_key]['necessity'][g_ostype]['level'].ljust(20)) + print("\t\t\t\t标准包名 -> " ,last_key.ljust(20),"标准版本 -> ", g_storejsondict[last_key]['version'][g_ostype].ljust(20)) + g_pkgversiodict[g_storejsondict[last_key]['lib_name']] = g_storejsondict[last_key]['version'][g_ostype] + if (len(g_storejsondict[last_key]['version'][g_ostype]) == 0): + print("\t\t系统实现:") + print("\t\t\t\t没有发现") + else: + g_subresults_to_json.clear() + + g_notfind_set_flag = 0 + for l_alias_name in list(l_dict_alias_info.keys()): + check_per_pkg_info(l_alias_name) #待修改 + + print("\t\t共享库信息:") + if (g_notfind_set_flag == 0): + g_counter_flags['pkg_counter']['failed']['all'] += 1 + + ###向json文件写入'Shared library'信息 + with open(g_output_filename, 'r') as fr: + json_so = json.load(fr) + json_so[last_key]['Shared library'] = "-" + with open(g_output_filename, 'w+') as fw: + json.dump(json_so,fw,ensure_ascii=False,indent=4) + continue + else: + for list1_item in g_storejsondict[last_key]['share_objs'][g_ostype]: + print("\t\t\t\t名称 -> ",list1_item) + print("\t\t\t\t\t标准约定 -> ",list1_item, ) + lib_result = check_sharelib_info(list1_item) + print("\t\t\t\t\t系统存在 -> ",lib_result, ) + temp_libsoname = lib_result.split('/')[-1] + if (lib_result == "not found"): + print("\t\t\t\t\t检测结果 -> 未检测到存在") + g_subresults_to_json[list1_item] = {'status': 'not found', 'path':'-', 'belongs':'None'} + g_counter_flags['lib_counter']['failed'] += 1 + else: + if (g_inputpkgmngr == "yum-rpm"): + l_file_belongs = get_rpm_file_belongs_package(lib_result) + else: + l_file_belongs = get_deb_file_belongs_package(lib_result) + + print("\t\t\t\t\t检测结果 -> ", compare_library_version(temp_libsoname, str(list1_item))) + print("\t\t\t\t\t文件所属 -> ", l_file_belongs) + if (compare_library_version(temp_libsoname, str(list1_item)) == "equal" ): + g_counter_flags['lib_counter']['passed'] += 1 + g_subresults_to_json[list1_item] = {'status': 'compatible', 'path':lib_result, 'belongs':l_file_belongs} + elif (compare_library_version(temp_libsoname, str(list1_item)) == "smaller" ): + g_counter_flags['lib_counter']['failed'] += 1 + g_subresults_to_json[list1_item] = {'status': 'incompatible', 'path':lib_result, 'belongs':l_file_belongs} + else: + g_counter_flags['lib_counter']['warning'] += 1 + g_subresults_to_json[list1_item] = {'status': 'compatible bigger', 'path':lib_result, 'belongs':l_file_belongs} + + ###向json文件写入'Shared library'信息 + with open(g_output_filename, 'r') as fr: + json_so = json.load(fr) + json_so[last_key]['Shared library'] = g_subresults_to_json + with open(g_output_filename, 'w+') as fw: + json.dump(json_so,fw,ensure_ascii=False,indent=4) + + print("=============================================================================================================") + print("结束检查 ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) + print("") + print("\t检查策略:", "\"", "--strategy =",args.strategy, "--level =",args.level, "--ostype =", args.ostype, "--pkgmngr =", args.pkgmngr, "--organize =", args.organize, "\"") + print("") + #print("\t软件包:") + #print("\t\t总计:", g_counter_flags['pkg_counter']['total']['all'], "{" ,"l1->",g_counter_flags['pkg_counter']['total']['l1'],";", "l2->", g_counter_flags['pkg_counter']['total']['l2'], ";", "l3->", g_counter_flags['pkg_counter']['total']['l3'], "}") + #print("\t\t通过:", g_counter_flags['pkg_counter']['passed']['all']) + #print("\t\t警告:", g_counter_flags['pkg_counter']['warning']['all']) + #print("\t\t报错:", g_counter_flags['pkg_counter']['failed']['all']) + #print("\t动态库:") + #print("\t\t总计:", g_counter_flags['lib_counter']['total']) + #print("\t\t通过:", g_counter_flags['lib_counter']['passed']) + #print("\t\t警告:", g_counter_flags['lib_counter']['warning']) + #print("\t\t报错:", g_counter_flags['lib_counter']['failed']) + print("=============================================================================================================") + +##====deb查询文件所属二进制包====## +def get_deb_file_belongs_package(l_deb_file_name): + # this function for get deb pacgakes to which the file belongs + # input: + # @ l_deb_file_name + # return: + # @ l_deb_binary_name + l_deb_realpath = os.path.realpath(l_deb_file_name) + l_file_belongs_deb = os.popen('dpkg -S %s 2>/dev/null | awk -F": " \'{print $1}\'' %(l_deb_realpath)) + l_belongs_deb = l_file_belongs_deb.read().rsplit('\n')[0] + l_file_belongs_deb.close() + + if (len(l_belongs_deb) == 0): + l_belongs_deb = "None" + + return l_belongs_deb + +##====rpm查询文件所属二进制包====## +def get_rpm_file_belongs_package(l_rpm_file_name): + # this function for get rpm pacgakes to which the file belongs + # input: + # @ l_deb_file_name + # return: + # @ l_rpm_binary_name + print("makeing") + + +##====deb对比版本大小====## +def get_debpkg_ver_contrast(l_local_ver, l_required_ver): + # --compare-version ver_local op ver_required + # op: lt le eq ne ge gt + # sn: < <= == != >= > + compare_result = os.system('dpkg --compare-versions %s ge %s' %(str(l_local_ver), str(l_required_ver))) + if(compare_result == 0): + return "compatible" + else: + return "incompatible" + +##====rpm对比版本大小====## +def get_rpmpkg_ver_contrast(l_local_ver, l_required_ver): + # compare ver_local op ver_required + if l_local_ver < l_required_ver: + return "incompatible" + else: + return "compatible" + +##====比较共享库版本大小====## +def compare_library_version(l_local_ver, l_required_ver): + # this function compare soname for number + # input: + # @ l_local_ver + # @ l_required_ver + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + if l_local_ver == l_required_ver: + return "equal" + elif str(l_local_ver) < str(l_required_ver): + return "smaller" + else: + return "bigger" + +## 3.2 get deb package info +##====apt获取二进制包列表====## +def get_debpkg_from_srcpkg(l_deb_srcname): + # this function for get deb pacgakes from package name in current os + # input: + # @ l_deb_srcname + # return: + # @ l_list_debpkgs + l_list_debpkgs = [] + l_list_debpkgs.clear() + + l_package_name = os.popen('apt-cache showsrc %s 2>/dev/null | grep ^Package: | awk -F": " \'{print $2}\'' %(l_deb_srcname)) + l_pname = l_package_name.read().split("\n")[0] + l_package_name.close() + if(l_pname == l_deb_srcname): + l_debpkgs = os.popen('apt-cache showsrc %s 2>/dev/null | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(l_deb_srcname)) + l_list_debpkgs = l_debpkgs.read().split("\n")[0].split(", ") + l_debpkgs.close() + + return l_list_debpkgs + +##====yum获取二进制包列表====## +def get_rpmpkg_from_srcpkg(l_rpm_srcname): + # this function for get rpm pacgakes from package name in current os + # input: + # @ l_rpm_srcname + # return: + # @ l_list_rpmpkgs + l_rpmpkgs = os.popen('dnf info | grep -B 5 -E "%s.*.src.rpm" | grep "名称" | awk -F" " \'{ print $3 }\' | sort -n | uniq | sed \':label;N;s/\\n/ /;t label\'' %(l_rpm_srcname)) + l_list_rpmpkgs = l_rpmpkgs.read().split("\n")[0].split(" ") + l_rpmpkgs.close() + + return l_list_rpmpkgs + +##====deb获取二进制包版本====## +def get_debpkg_local_version(l_deb_binary_name, l_deb_src_name): + # this function for get deb pacgakes local verison + # input: + # @ l_deb_binary_name + # return: + # @ l_ver_local + l_ver_local = "-" + + l_file_deb_install_status = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $1}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_deb_install_status = l_file_deb_install_status.read().rstrip('\n') + l_file_deb_install_status.close() + + if(l_deb_install_status == "ii"): + l_file_src_name = os.popen('dpkg --status %s 2>/dev/null|grep ^Source:|awk -F": " \'{print $2}\'' %(l_deb_binary_name)) + l_src_name = l_file_src_name.read().rstrip('\n') + l_file_src_name.close() + + if (len(l_src_name) == 0): + l_file_src_name = os.popen('dpkg --status %s 2>/dev/null|grep ^Package:|awk -F": " \'{print $2}\'' %(l_deb_binary_name)) + l_src_name = l_file_src_name.read().rstrip('\n') + l_file_src_name.close() + if(l_src_name == l_deb_src_name): + l_file_ver_local = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $3}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_ver_local = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + else: + l_ver_local = "-" + else: + if(l_src_name == l_deb_src_name): + l_file_ver_local = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $3}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_ver_local = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + else: + l_ver_local = "-" + + return l_ver_local + +##====rpm获取二进制包版本====## +def get_rpmpkg_local_verison(l_rpm_binary_name): + # this function for get rpm pacgakes local verison + # input: + # @ l_rpm_binary_name + # return: + # @ l_ver_local + l_ver_local = "-" + + l_rpm_install_status = os.system('rpm -qi %s 2>/dev/null 1>/dev/null' %(l_rpm_binary_name)) + if (l_rpm_install_status == 0): + l_file_ver_local = os.popen('rpm -qi %s 2>/dev/null | grep "Version\|Release" | awk -F" " \'{print $3}\' | sed \':label;N;s/\\n/-/;t label\'' %(l_rpm_binary_name)) + l_ver_local = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + + return l_ver_local + + +libchecker_environment_init() +libchecker_checking_loop() +libchecker_over_jobs() diff --git a/LibChecker/lib_checker-06-JA.py b/LibChecker/lib_checker-06-JA.py new file mode 100755 index 0000000000000000000000000000000000000000..cf93f095333356a9240b7104f90b76a669fd60e9 --- /dev/null +++ b/LibChecker/lib_checker-06-JA.py @@ -0,0 +1,638 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +# @Author : Wang Jinlong +# @Time : 2022/11/09 16:00 +# @File : Alpha OSAPIChecker Tools Source Code + +import argparse +import json +import os +import platform +import sys +import time + +# -1. Inherit arguments from CUI +# there are some arguments match with main program + ## --strategy: + ## --level: + ## --ostype: + ## --pkgmngr: + ## --json: +parser = argparse.ArgumentParser(description="This Progermm is a OSChecker", prog="OSChecker") +parser.add_argument('-s', '--strategy', action='store', type=str, help='Choice OSAPIChecker strategy: base,only-expand,with-expand', default="base") +parser.add_argument('-l', '--level', action='store', type=str, help='Choice OSAPIChecker level: l1,l2,l3,l1l2,l1l2l3', default="l1l2") +parser.add_argument('-t', '--ostype', action='store', type=str, help='OSType of current OS: desktop, server, embed,other', default="desktop") +parser.add_argument('-p', '--pkgmngr', action='store', type=str, help='Package Manager of current OS: apt-deb, yum-rpm, src-bin, other', default="apt-deb") +parser.add_argument('-o', '--organize', action='store', type=str, help='Choice Organize or Company') +parser.add_argument('-j', '--json', action='store', type=str, help='Choice OSChecker Json templete file', required=False) # this line use for dect the json file. +args = parser.parse_args() # write arguments to struct + +g_inputstrategy = args.strategy +g_inputlevel = args.level +g_inputostype = args.ostype +g_inputpkgmngr = args.pkgmngr +g_inputorganize = args.organize +g_inputjson = args.json + + +# option module import +#if (g_inputpkgmngr == "apt-deb"): +# import apt_pkg # import for apt-deb package management tools + + +# for logger handler +class Logger(object): + def __init__(self, filename='default.log', stream=sys.stdout): + self.terminal = stream + self.log = open(filename, 'a') + + def write(self, message): + self.terminal.write(message) + self.log.write(message) + + def flush(self): + pass + +sys.stdout = Logger("Logs/libchecker-tmp.log", sys.stdout) +#sys.stderr = Logger("Logs/a.log_file", sys.stderr) + +# 0. Global Resources Initialized +## 0.1 init dict and list data structures +g_pkginfodict_from_json = {} # read pkacage info from json file +g_libinfodict_from_json = {} # read library info from json file +g_bind_pkglib_from_json = {} # bing package and library info +g_liblist_from_json = {} # bing package and library info +g_pkginfodict_from_os = {} # dict buffer for package info from current os +g_libinfodict_from_os = {} # dict buffer for library info from current os +g_liblist_from_os = {} # dict buffer for library info from current os +g_libchecker_comp_status = {} # dict for libchecker compare result +g_jsonfile_dict = {} # a josn file struct +g_pkgstd_dict = {} # a dict store json node mata-date +g_counter_flags = {} # a conuter struct +g_storejsondict = {} +g_pkgversiodict = {} +g_lib_location_path = " " +g_notfind_set_flag = 0 # bool flag for find source package status +g_chapter_dict = {} +g_genresults_to_json = {} +g_subresults_to_json = {} +g_pkgflag_dict = {} +g_ostype = g_inputostype # global magic string for OS type +g_pkgmgr = g_inputpkgmngr # global magic string for OS type +g_test_dict = {} +g_test_list = [] + +## 0.2 a recycle call function for user +def libchecker_over_jobs(): + time_now = time.strftime("%Y-%m-%d_%H-%M-%S",time.localtime()) + log_file_name = "Logs/libchecker-" + time_now + ".log" + # os.system("cp Logs/libchecker-tmp.log Outputs/libchecker-output.txt") + os.rename("Logs/libchecker-tmp.log", log_file_name) + +## 0.3 platform info +def get_env_info(): + print("系统信息:") + str1 = os.popen("cat /etc/os-release").read() + str2 = str1.split("\n") + for s1 in str2: + print("\t", s1) + +def get_stdjsons_info(json_file_path): + with open(json_file_path) as f: + f_dict = json.load(f) + + global g_jsonfile_dict + g_jsonfile_dict = f_dict + lib_basedict = f_dict['libs']['category']['base']['packages'] + + print("标准信息:") + print("\t标准简要信息:") + print("\t\t标准号: %s" % f_dict['std_description']['std_number']) + print("\t\t文件名: %s" % f_dict['std_description']['std_name']) + print("\t库检查器信息:") + print("\t\t检查位置: %s" % f_dict['libs']['lib_location']) + +def libchecker_environment_init(): + global g_counter_flags + + g_counter_flags = {'pkg_counter': {'total': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} , 'passed': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'warning': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'failed': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} }, 'lib_counter': {'total': 0, 'passed': 0, 'warning': 0, 'failed': 0}} + + get_env_info() + + get_stdjsons_info('Jsons/lib_list.json') + +# if (g_inputpkgmngr == "apt-deb"): +# apt_pkg.init_system() + +##====获取别名信息字典====## +def get_alias_dcit(l_realname): + + l_dict_alias_info = {} + l_dict_binary_name = {} + l_dict_tmp = {} + + l_list_binary_name = [] + l_list_alias = [] + l_list_tmp = [] + + + if(len(g_storejsondict[l_realname]['alias']) == 0): + l_list_binary_name.clear() + + if (g_inputpkgmngr == "yum-rpm"): + l_list_binary_name = get_rpmpkg_from_srcpkg(l_realname) + else: + l_list_binary_name = get_debpkg_from_srcpkg(l_realname) + + if(len(l_list_binary_name) != 0): + for i in range(0, len(l_list_binary_name)): + l_dict_binary_name.update({l_list_binary_name[i]: '-'}) + l_dict_alias_info.update({l_realname: l_dict_binary_name}) + else: + l_dict_alias_info.update({l_realname: "-"}) + else: + l_list_alias.clear() + l_list_tmp.clear() + + for i in range(0, len(g_storejsondict[l_realname]['alias'])): + if "/" in g_storejsondict[l_realname]['alias'][i]['name']: + l_list_tmp = g_storejsondict[l_realname]['alias'][i]['name'].split('/') + for num in range(0, len(l_list_tmp)): + l_list_alias.append(l_list_tmp[num]) + else: + l_list_alias.append(g_storejsondict[l_realname]['alias'][i]['name']) + + if l_realname not in l_list_alias: + l_list_alias.append(l_realname) + + for k in range(0, len(l_list_alias)): + l_list_binary_name.clear() + l_dict_binary_name.clear() + + if (g_inputpkgmngr == "yum-rpm"): + l_list_binary_name = get_rpmpkg_from_srcpkg(l_list_alias[k]) + else: + l_list_binary_name = get_debpkg_from_srcpkg(l_list_alias[k]) + + if(len(l_list_binary_name) != 0): + for j in range(0, len(l_list_binary_name)): + l_dict_binary_name.update({l_list_binary_name[j]: '-'}) + + l_dict_tmp = dict.fromkeys(l_dict_binary_name.keys(), None) + l_dict_alias_info[l_list_alias[k]] = l_dict_tmp + else: + l_dict_alias_info[l_list_alias[k]] = "-" + + return l_dict_alias_info + +##====检查源码包仓库是否存在====## +def check_per_pkg_info(src_pkgname): + global g_notfind_set_flag + global g_genresults_to_json + global g_test_dict + global g_counter_flags + + srcpkgver = [] + + if g_inputostype == "desktop" or g_inputostype == "server": + if (g_inputpkgmngr == "apt-deb"): + l_search_pname = os.popen('apt-cache showsrc %s 2>/dev/null | grep ^Package: | awk -F": " \'{print $2}\'' %(src_pkgname)) + l_pname = l_search_pname.read().split("\n")[0] + l_search_pname.close() + if(l_pname == src_pkgname): + p_srcpkgver = os.popen('apt-cache showsrc %s 2>/dev/null | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + elif (g_inputpkgmngr == "yum-rpm"): + p_srcpkgver = os.popen('yum list %s 2>/dev/null | awk \'{print $2}\' | sed -n \'3p\' ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + else: + print("Please input --ostype=[desktop,server,embde,...] and --pkgmngr=[apt-deb,yum-rpm,src-bin,...]") + + g_counter_flags['pkg_counter']['total']['all'] += 1 + + print("\t\t系统实现: ") + if (len(srcpkgver) == 0): + print("\t\t\t\t未发现 -> ", src_pkgname.ljust(20)) + else: + print("\t\t\t\t实现包名 -> ", src_pkgname.ljust(20),"实现版本 -> ",srcpkgver) + g_counter_flags['pkg_counter']['passed']['all'] += 1 + g_notfind_set_flag = 1 + +##====查询共享库路径信息====## +def check_sharelib_info(lib_soname): + + global g_lib_location_path + global g_counter_flags + g_lib_location_path = "0" + + global g_counter_flags + g_counter_flags['lib_counter']['total'] += 1 + l_list = ["/lib", "/lib64", "/usr/lib", "/usr/lib64"] + + for path_tmp in l_list: + for realpath, dirs, files in os.walk(path_tmp): + if lib_soname in files: + full_path = os.path.join(path_tmp, realpath, lib_soname) + g_lib_location_path = (os.path.normpath(os.path.abspath(full_path))) + if g_lib_location_path != "0": + break + + if g_lib_location_path == "0": + return "not found" + else: + return g_lib_location_path + +##====主函数====## +def libchecker_checking_loop(): + global g_notfind_set_flag + global g_chapter_dict + global g_genresults_to_json + global g_subresults_to_json + global g_storejsondict + global g_test_list + global g_test_dict + global g_pkgflag_dict + + l_dict_to_json = {} + l_pkgresult_to_json = {} + l_dict_alias_info = {} #存储写入json文件Binary package信息的字典 + l_dict_binary_list = {} + + del g_jsonfile_dict['libs']['category']['##章节名'] + print("") + print("开始检查: ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + for chapter_class in g_jsonfile_dict['libs']['category']: + if chapter_class == 'base': + l_tmp_dict = g_jsonfile_dict['libs']['category']['base']['packages'] + del l_tmp_dict['##glibc'] + else: + l_tmp_dict = g_jsonfile_dict['libs']['category'][chapter_class]['packages'] + for key in l_tmp_dict: + g_chapter_dict.update({ key: l_tmp_dict[key]['sections_number']}) + if (args.level == "l1"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L1"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l2"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L2"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l3"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l1l2"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l1l3"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L2"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l2l3"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L1"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l1l2l3"): + g_storejsondict[key] = l_tmp_dict[key] + else: + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + print("[Warnning]: Invalid input options, execute use default options \"--strate=base --levle=l1l2\"") + + for key4 in g_storejsondict: + g_test_dict.update({key4 : "wwww"}) + l_dict_to_json={'Level': 'gen', 'Shared library':'gen', 'Required version': 'gen', 'Binary package':'gen'} + g_genresults_to_json.update({ key4 : l_dict_to_json }) + + if ( g_inputstrategy == "base" ): + print(g_genresults_to_json) + print(g_storejsondict) + for l_name in list(g_genresults_to_json.keys()): + if ( g_storejsondict[l_name]['necessity'][g_inputostype]['options'] != "basic" ): + del g_genresults_to_json[l_name] + elif( g_inputstrategy == "with-expand" ): + for l_name in list(g_genresults_to_json.keys()): + if ( len(g_storejsondict[l_name]['necessity'][g_inputostype]['options']) == 0 ): + del g_genresults_to_json[l_name] + elif( g_inputstrategy == "only-expand" ): + for l_name in list(g_genresults_to_json.keys()): + if ( g_storejsondict[l_name]['necessity'][g_inputostype]['options'] != "expansion" ): + del g_genresults_to_json[l_name] + else: + print("Error: --strategy 参数指定错误") + exit() + + with open("Outputs/libchecker-output.json","w") as f: + json.dump(g_genresults_to_json,f) + + for last_key in g_storejsondict: + l_pkgresult_to_json.clear() + + l_dict_alias_info = get_alias_dcit(last_key) + l_require_version = g_storejsondict[last_key]['version'][g_inputostype] #源码包需求版本 + + ###向json文件写入'Level'信息 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_level = json.load(fr) + json_level[last_key]['Level'] = g_storejsondict[last_key]['necessity'][g_inputostype]['level'] + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_level,fw,ensure_ascii=False,indent=4) + ###向json文件写入'Required version'信息 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_required_ver = json.load(fr) + json_required_ver[last_key]['Required version'] = l_require_version + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_required_ver,fw,ensure_ascii=False,indent=4) + + if (len(g_storejsondict[last_key]['version'][g_ostype]) != 0): + for l_src_name in list(l_dict_alias_info.keys()): + l_src_status = 0 + + if (l_dict_alias_info[l_src_name] != "-"): + l_dict_binary_list.clear() + l_dict_binary_list = l_dict_alias_info[l_src_name] + for l_binary_name in list(l_dict_binary_list.keys()): + if (g_inputpkgmngr == "yum-rpm"): + l_rpm_local_version = get_rpmpkg_local_verison(l_binary_name) + if (l_rpm_local_version == "-"): + del l_dict_alias_info[l_src_name][l_binary_name] + else: + l_src_status += 1 + l_binary_version_status = get_rpmpkg_ver_contrast(l_rpm_local_version, l_require_version) + l_dict_binary_list[l_binary_name] = {'status': l_binary_version_status, 'local version': l_rpm_local_version} + else: + l_deb_local_version = get_debpkg_local_version(l_binary_name, l_src_name) + if (l_deb_local_version == "-"): + del l_dict_binary_list[l_binary_name] + else: + l_src_status += 1 + l_binary_version_status = get_debpkg_ver_contrast(l_deb_local_version, l_require_version) + l_dict_binary_list[l_binary_name] = {'status': l_binary_version_status, 'local version': l_deb_local_version} + + if (l_src_status == 0): + l_dict_alias_info[l_src_name] = "Don`t find installed packages" + else: + l_dict_alias_info[l_src_name] = l_dict_binary_list + else: + l_dict_alias_info[l_src_name] = "None" + else: + l_dict_alias_info[l_src_name] = "None" + + ###向json文件写入'Binary package'信息 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_alias_info = json.load(fr) + json_alias_info[last_key]['Binary package'] = l_dict_alias_info + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_alias_info,fw,ensure_ascii=False,indent=4) + + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L1"): + g_counter_flags['pkg_counter']['total']['l1'] += 1 + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L2"): + g_counter_flags['pkg_counter']['total']['l2'] += 1 + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L3"): + g_counter_flags['pkg_counter']['total']['l3'] += 1 + print("\t正在检查 ", '<',last_key,'>', "...") + print("\t\t标准约定:") + print("\t\t\t\t从属章节 -> ", g_chapter_dict[last_key].ljust(20), "兼容级别 -> ", g_storejsondict[last_key]['necessity'][g_ostype]['level'].ljust(20)) + print("\t\t\t\t标准包名 -> " ,last_key.ljust(20),"标准版本 -> ", g_storejsondict[last_key]['version'][g_ostype].ljust(20)) + g_pkgversiodict[g_storejsondict[last_key]['lib_name']] = g_storejsondict[last_key]['version'][g_ostype] + if (len(g_storejsondict[last_key]['version'][g_ostype]) == 0): + print("\t\t系统实现:") + print("\t\t\t\t没有发现") + else: + g_subresults_to_json.clear() + + g_notfind_set_flag = 0 + for l_alias_name in list(l_dict_alias_info.keys()): + check_per_pkg_info(l_alias_name) #待修改 + + print("\t\t共享库信息:") + if (g_notfind_set_flag == 0): + g_counter_flags['pkg_counter']['failed']['all'] += 1 + + ###向json文件写入'Shared library'信息 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_so = json.load(fr) + json_so[last_key]['Shared library'] = "-" + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_so,fw,ensure_ascii=False,indent=4) + continue + else: + for list1_item in g_storejsondict[last_key]['share_objs'][g_ostype]: + print("\t\t\t\t名称 -> ",list1_item) + print("\t\t\t\t\t标准约定 -> ",list1_item, ) + lib_result = check_sharelib_info(list1_item) + print("\t\t\t\t\t系统存在 -> ",lib_result, ) + temp_libsoname = lib_result.split('/')[-1] + if (lib_result == "not found"): + print("\t\t\t\t\t检测结果 -> 未检测到存在") + g_subresults_to_json[list1_item] = {'status': 'not found', 'path':'-', 'belongs':'None'} + g_counter_flags['lib_counter']['failed'] += 1 + else: + if (g_inputpkgmngr == "yum-rpm"): + l_file_belongs = get_rpm_file_belongs_package(lib_result) + else: + l_file_belongs = get_deb_file_belongs_package(lib_result) + + print("\t\t\t\t\t检测结果 -> ", compare_library_version(temp_libsoname, str(list1_item))) + print("\t\t\t\t\t文件所属 -> ", l_file_belongs) + if (compare_library_version(temp_libsoname, str(list1_item)) == "equal" ): + g_counter_flags['lib_counter']['passed'] += 1 + g_subresults_to_json[list1_item] = {'status': 'compatible', 'path':lib_result, 'belongs':l_file_belongs} + elif (compare_library_version(temp_libsoname, str(list1_item)) == "smaller" ): + g_counter_flags['lib_counter']['failed'] += 1 + g_subresults_to_json[list1_item] = {'status': 'incompatible', 'path':lib_result, 'belongs':l_file_belongs} + else: + g_counter_flags['lib_counter']['warning'] += 1 + g_subresults_to_json[list1_item] = {'status': 'compatible bigger', 'path':lib_result, 'belongs':l_file_belongs} + + ###向json文件写入'Shared library'信息 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_so = json.load(fr) + json_so[last_key]['Shared library'] = g_subresults_to_json + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_so,fw,ensure_ascii=False,indent=4) + + print("=============================================================================================================") + print("结束检查 ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) + print("") + print("\t检查策略:", "\"", "--strategy =",args.strategy, "--level =",args.level, "--ostype =", args.ostype, "--pkgmngr =", args.pkgmngr, "--organize =", args.organize, "\"") + print("") + print("\t软件包:") + print("\t\t总计:", g_counter_flags['pkg_counter']['total']['all'], "{" ,"l1->",g_counter_flags['pkg_counter']['total']['l1'],";", "l2->", g_counter_flags['pkg_counter']['total']['l2'], ";", "l3->", g_counter_flags['pkg_counter']['total']['l3'], "}") + print("\t\t通过:", g_counter_flags['pkg_counter']['passed']['all']) + print("\t\t警告:", g_counter_flags['pkg_counter']['warning']['all']) + print("\t\t报错:", g_counter_flags['pkg_counter']['failed']['all']) + print("\t动态库:") + print("\t\t总计:", g_counter_flags['lib_counter']['total']) + print("\t\t通过:", g_counter_flags['lib_counter']['passed']) + print("\t\t警告:", g_counter_flags['lib_counter']['warning']) + print("\t\t报错:", g_counter_flags['lib_counter']['failed']) + print("=============================================================================================================") + +##====deb查询文件所属二进制包====## +def get_deb_file_belongs_package(l_deb_file_name): + # this function for get deb pacgakes to which the file belongs + # input: + # @ l_deb_file_name + # return: + # @ l_deb_binary_name + l_deb_realpath = os.path.realpath(l_deb_file_name) + l_file_belongs_deb = os.popen('dpkg -S %s 2>/dev/null | awk -F": " \'{print $1}\'' %(l_deb_realpath)) + l_belongs_deb = l_file_belongs_deb.read().rsplit('\n')[0] + l_file_belongs_deb.close() + + if (len(l_belongs_deb) == 0): + l_belongs_deb = "None" + + return l_belongs_deb + +##====rpm查询文件所属二进制包====## +def get_rpm_file_belongs_package(l_rpm_file_name): + # this function for get rpm pacgakes to which the file belongs + # input: + # @ l_deb_file_name + # return: + # @ l_rpm_binary_name + print("makeing") + + +##====deb对比版本大小====## +def get_debpkg_ver_contrast(l_local_ver, l_required_ver): + # --compare-version ver_local op ver_required + # op: lt le eq ne ge gt + # sn: < <= == != >= > + compare_result = os.system('dpkg --compare-versions %s ge %s' %(str(l_local_ver), str(l_required_ver))) + if(compare_result == 0): + return "compatible" + else: + return "incompatible" + +##====rpm对比版本大小====## +def get_rpmpkg_ver_contrast(l_local_ver, l_required_ver): + # compare ver_local op ver_required + if l_local_ver < l_required_ver: + return "incompatible" + else: + return "compatible" + +##====比较共享库版本大小====## +def compare_library_version(l_local_ver, l_required_ver): + # this function compare soname for number + # input: + # @ l_local_ver + # @ l_required_ver + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + if l_local_ver == l_required_ver: + return "equal" + elif str(l_local_ver) < str(l_required_ver): + return "smaller" + else: + return "bigger" + +## 3.2 get deb package info +##====apt获取二进制包列表====## +def get_debpkg_from_srcpkg(l_deb_srcname): + # this function for get deb pacgakes from package name in current os + # input: + # @ l_deb_srcname + # return: + # @ l_list_debpkgs + l_list_debpkgs = [] + l_list_debpkgs.clear() + + l_package_name = os.popen('apt-cache showsrc %s 2>/dev/null | grep ^Package: | awk -F": " \'{print $2}\'' %(l_deb_srcname)) + l_pname = l_package_name.read().split("\n")[0] + l_package_name.close() + if(l_pname == l_deb_srcname): + l_debpkgs = os.popen('apt-cache showsrc %s 2>/dev/null | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(l_deb_srcname)) + l_list_debpkgs = l_debpkgs.read().split("\n")[0].split(", ") + l_debpkgs.close() + + return l_list_debpkgs + +##====yum获取二进制包列表====## +def get_rpmpkg_from_srcpkg(l_rpm_srcname): + # this function for get rpm pacgakes from package name in current os + # input: + # @ l_rpm_srcname + # return: + # @ l_list_rpmpkgs + l_rpmpkgs = os.popen('dnf info | grep -B 5 -E "%s.*.src.rpm" | grep "名称" | awk -F" " \'{ print $3 }\' | sort -n | uniq | sed \':label;N;s/\\n/ /;t label\'' %(l_rpm_srcname)) + l_list_rpmpkgs = l_rpmpkgs.read().split("\n")[0].split(" ") + l_rpmpkgs.close() + + return l_list_rpmpkgs + +##====deb获取二进制包版本====## +def get_debpkg_local_version(l_deb_binary_name, l_deb_src_name): + # this function for get deb pacgakes local verison + # input: + # @ l_deb_binary_name + # return: + # @ l_ver_local + l_ver_local = "-" + + l_file_deb_install_status = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $1}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_deb_install_status = l_file_deb_install_status.read().rstrip('\n') + l_file_deb_install_status.close() + + if(l_deb_install_status == "ii"): + l_file_src_name = os.popen('dpkg --status %s 2>/dev/null|grep ^Source:|awk -F": " \'{print $2}\'' %(l_deb_binary_name)) + l_src_name = l_file_src_name.read().rstrip('\n') + l_file_src_name.close() + + if (len(l_src_name) == 0): + l_file_src_name = os.popen('dpkg --status %s 2>/dev/null|grep ^Package:|awk -F": " \'{print $2}\'' %(l_deb_binary_name)) + l_src_name = l_file_src_name.read().rstrip('\n') + l_file_src_name.close() + if(l_src_name == l_deb_src_name): + l_file_ver_local = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $3}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_ver_local = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + else: + l_ver_local = "-" + else: + if(l_src_name == l_deb_src_name): + l_file_ver_local = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $3}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_ver_local = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + else: + l_ver_local = "-" + + return l_ver_local + +##====rpm获取二进制包版本====## +def get_rpmpkg_local_verison(l_rpm_binary_name): + # this function for get rpm pacgakes local verison + # input: + # @ l_rpm_binary_name + # return: + # @ l_ver_local + l_ver_local = "-" + + l_rpm_install_status = os.system('rpm -qi %s 2>/dev/null 1>/dev/null' %(l_rpm_binary_name)) + if (l_rpm_install_status == 0): + l_file_ver_local = os.popen('rpm -qi %s 2>/dev/null | grep "Version\|Release" | awk -F" " \'{print $3}\' | sed \':label;N;s/\\n/-/;t label\'' %(l_rpm_binary_name)) + l_ver_local = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + + return l_ver_local + + +libchecker_environment_init() +libchecker_checking_loop() +libchecker_over_jobs() diff --git a/LibChecker/lib_checker-version-01-only-apt.py b/LibChecker/lib_checker-version-01-only-apt.py new file mode 100755 index 0000000000000000000000000000000000000000..e0085bb500f2faf44a1e271886c0b1a9e03e695c --- /dev/null +++ b/LibChecker/lib_checker-version-01-only-apt.py @@ -0,0 +1,886 @@ +#!/usr/bin/python3 + +import argparse +import json +import os + +# 0. Global Resources Initialized +## 0.1 init dict and list data structures + +g_pkginfodict_from_json = {} # read pkacage info from json file +g_libinfodict_from_json = {} # read library info from json file +g_bind_pkglib_from_json = {} # bing package and library info +g_liblist_from_json = {} # bing package and library info + +g_pkginfodict_from_os = {} # dict buffer for package info from current os +g_libinfodict_from_os = {} # dict buffer for library info from current os +g_liblist_from_os = {} # dict buffer for library info from current os + +g_libchecker_comp_status = {} # dict for libchecker compare result + + +## 0.2 init function was here +def libchecker_environment_init(): + print("Enter function: libchecker_environment_init") + + +# 1. Check Input Validity +## 1.1 check global variable and data structure +## 1.2 check os flag for other checker utlities + + +# 2. Get Meatdata Info from JSON File +## 2.1 read packages info from json file +def read_pkginfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = l1[0]['version']['desktop'] + + return temp_dict + +## 2.1 read packages info from json file +def read_libinfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + return temp_dict + +def get_liblists_from_stdjson(json_file_path): + print("Enter function: get_liblists_from_stdjson(%s)" %(json_file_path)) + + global g_liblist_from_json + chapter_class = ['base', 'security', 'network', 'graphic', 'multimedia', 'print_scan', 'runtime_language', 'development', 'basic_calculation', 'storage', 'virtualization', 'high_availability'] + + with open(json_file_path) as f: + f_dict = json.load(f) + + temp_dict = {} # Store dict={packages:sonames} + temp_list = [] # Store list=[soanmes] + for i in chapter_class: + lib_basedict = f_dict['libs']['category'][i]['packages'] + if i == 'base': + del lib_basedict['##glibc'] + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + for key in temp_dict: + temp_list.extend(temp_dict[key]) + + g_liblist_from_json = temp_list + + return temp_list + + + + +## 2.2 read libraries info from json file +def read_libinfo_from_json(json_file_path): + # this function read library info from json file + # input: + # @ json_file_path + # output: + # @ g_libinfodict_from_json + # return: + # @ libinfo_dict + print("Enter function: read_libinfo_from_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + + libinfo_dict = {} + + for i in file_data['libraries']: + libinfo_dict[i['linkname']] = i['soname'] + + fobj.close() + + return libinfo_dict + +## 2.3 read metadata info from json file +def libchecker_read_stdjson_file(json_file_path): + # this function read package and library info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # @ g_libinfodict_from_json + # @ g_bing_pkglib_from_json + # return: + # @ + print("Enter function: libchecker_open_json_file(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + + for i in file_data['libraries']: + g_pkginfodict_from_json[i['srcname']] = i['version'] # write pkginfo to dict: g_pkginfodict_from_json + g_libinfodict_from_json[i['linkname']] = i['soname'] # write libinfo to dict: g_libinfodict_from_json + g_bind_pkglib_from_json[i['srcname']] = i['linkname'] # write bindinfo to dict: g_bind_pkglib_from_json + + fobj.close() + +def libchecker_read_stdjson(json_file_path): + print("Enter function: libchecker_read_stdjson_file(%s)" %(json_file_path)) + + global g_pkginfodict_from_json + global g_libinfodict_from_json + + g_pkginfodict_from_json = read_pkginfo_from_stdjson(json_file_path) + g_libinfodict_from_json = read_libinfo_from_stdjson(json_file_path) + +# print(g_pkginfodict_from_json) +# print(g_libinfodict_from_json) + +## 2.3 read metadata info from json file +def libchecker_read_std_json(json_file_path): + print("Enter function: libchecker_open_std_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + objs_dict = {} + + + for i in file_data['libs']['base']: + print(i) + print(type(file_data['libs']['base'][i])) + #print(file_data['libs']['base'][i]) +# objs_dict = file_data['libs']['base'][i] + objs_dict.update({ i : file_data['libs']['base'][i]}) + +# print(objs_dict) +# print(type(objs_dict)) +# print(len(objs_dict)) +# print(objs_dict.keys()) + +# j = 'gcc' +# print(objs_dict[j]['lib_name']) + + del objs_dict['##chapters_number'] + del objs_dict['chapters_number'] + del objs_dict['##glibc'] + + + for key in objs_dict: + print(key) + + #g_pkginfodict_from_json[key['lib_name']] = key['version'] # write pkginfo to dict: g_pkginfodict_from_json + aliasname = objs_dict[key]['aliasname'] + g_pkginfodict_from_json.update({ aliasname : objs_dict[key]['version']['desktop_version']}) # src package name : pkg version + +# print(objs_dict[key]['aliasname']) + g_bind_pkglib_from_json.update({ key : objs_dict[key]['desktop-share_objs']}) # src package name : library soname + + print(g_pkginfodict_from_json) + print(g_bind_pkglib_from_json) + + for i in g_bind_pkglib_from_json: + print(g_bind_pkglib_from_json[i]) + + fobj.close() + + +# print(f_dict['libs']['base']['glibc']['necessity'].keys()) +# print(f_dict["libchecker"][1]) +# print(f_dict["libchecker"][1]['name']) + +# 3. Find Meatdate Info from Current OS +## 3.1 get src package info +def get_srcname_from_os(): + # this function for get src package name from current os + # input: + # @ + # output: + # @ + # return: + # @ + print("Enter function: get_srcname_from_os") + +def get_srcver_form_srcname(src_pkgname): + # this function for get src pacgake version from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkgver + print("Enter function: get_srcver_from_srcname(%s)" %(src_pkgname)) + p_srcpkgver = os.popen('apt-cache showsrc %s | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + return srcpkgver + +def get_pkginfo_from_srcpkg(src_pkgname): + # this function for get src pacgake info from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkg_info_dict + print("Enter function: get_pkginfo_from_srcpkg(%s)" %(src_pkgname)) + p_srcpkgnam = os.popen('apt-cache show %s | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgnam = p_srcpkgnam.read().rstrip('\n') + p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache show %s | grep Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + srcpkg_info_dict = {} + srcpkg_info_dict = {srcpkgnam : srcpkgver} + + return srcpkg_info_dict + +def compare_version_serial_number(ver1, ver2): + # this function compare two version serial number only for number + # input: + # @ ver1, string [x.x.x.x],[x]:[0-999999] + # @ ver2, string [x.x.x.x],[x]:[0-999999] + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(ver1).split(".") + list2 = str(ver2).split(".") + for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)): + if int(list1[i]) == int(list2[i]): + pass + elif int(list1[i]) < int(list2[i]): + return "<" + else: + return ">" + if len(list1) == len(list2): + return "=" + elif len(list1) < len(list2): + return "<" + else: + return ">" + +def compare_library_version(str1, str2): + # this function compare soname for number + # input: + # @ str1 + # @ str2 + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(str1).split(".") + list2 = str(str2).split(".") + + if str1 == str2: + return "=" + elif str1 < str2: + return "<" + else: + return ">" + +## 3.2 get deb package info +def get_debpkg_from_srcpkg(src_pkgname): + # this function for get deb pacgakes from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ debpkgs + print("Enter function: get_debpkg_from_srcpkg(%s)" %(src_pkgname)) + p_debpkgs = os.popen('apt-cache showsrc %s | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(src_pkgname)) + debpkgs = p_debpkgs.read().split("\n")[0].split(", ") + p_debpkgs.close() + + return debpkgs + +## 3.3 get libraries info + ################################################################################ + # RealName # + # realname = libname.so.x.y.z # + # x: major version number # + # y: minor version number # + # z: release version number # + #------------------------------------------------------------------------------# + # SoName # + # soname = libname.so.x # + # x: major version number # + #------------------------------------------------------------------------------# + # LinkName # + # link = name # + ################################################################################ +### 3.3.1 get libraries realname from deb pakcgae +def get_realname_from_debpkg(deb_pkgname): + # this function for get all library realname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ realnames + print("Enter function: get_realname_from_deb(%s)" %(deb_pkgname)) + p_realnames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$" -e ".so\."' %(deb_pkgname)) + realnames = p_realnames.read().split('\n') + del realnames[len(realnames)-1] + p_realnames.close() + + return realnames + +def compare_realname_version(realname1, realname2): + # this function compare library realname + # input: + # @ realname1 + # @ realname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.2 get libraries soname from deb package +def get_soname_from_debpkg(deb_pkgname): + # this function for get all library soname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ sonames + print("Enter function: get_soname_from_deb(%s)" %(deb_pkgname)) + # p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep .so.[0-999]$' %(deb_pkgname)) + p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep -e .so.[0-999]$ -e .so$' %(deb_pkgname)) + sonames = p_sonames.read().split('\n') + del sonames[len(sonames)-1] + p_sonames.close() + + return sonames + +def compare_soname_version(soname1, soname2): + # this function compare library soname + # input: + # @ soname1 + # @ soname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.3 get libraries linkname from deb package +def get_linkname_from_debpkg(deb_pkgname): + # this function for get all library linkname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ linknames + print("Enter function: get_linkname_from_deb(%s)" %(deb_pkgname)) + p_linknames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$"' %(deb_pkgname)) + linknames = p_linknames.read().split('\n') + del linknames[len(linknames)-1] + p_linknames.close() + + return linknames + +def compare_linkname_version(linkname1, linkname2): + # this function compare library linkname + # input: + # @ linkname1 + # @ linkname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_linkname_version") + +def pick_linkname_from_soname(soname): + # this function pick up linkname from soname + # input: + # @ soname + # output: + # @ + # return: + # @ a linkname + print("Enter function: pick_linkname_from_soname(%s)" %(soname)) + + return (soname.split(".")[0] + ".so") + +### 3.3.4 get libraries realname from src package +def get_realname_from_srcpkg(src_pkgname): + print("Enter function: get_realname_from_srcpkg(%s)" %(src_pkgname)) + # this function for get all library realname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ realnames_list + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + realnames_list_orig = [] + realnames_list = [] + for i in debpkgs_list: + realnames_list_orig.extend(get_realname_from_debpkg(i)) + + for i in realnames_list_orig: + if i not in realnames_list: + realnames_list.append(i) + + realnames_list.sort() + + return realnames_list + +### 3.3.5 get libraries soname from src package +def get_soname_from_srcpkg(src_pkgname): + # this function for get all library soname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ sonames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + sonames_list_orig = [] + sonames_list = [] + for i in debpkgs_list: + sonames_list_orig.extend(get_soname_from_debpkg(i)) + + for i in sonames_list_orig: + if i not in sonames_list: + sonames_list.append(i) + + sonames_list.sort() + + return sonames_list + +### 3.3.6 get libraries linkname from src package +def get_linkname_from_srcpkg(src_pkgname): + # this function for get all library linkname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ linknames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + linknames_list_orig = [] + linknames_list = [] + for i in debpkgs_list: + linknames_list_orig.extend(get_linkname_from_debpkg(i)) + + for i in linknames_list_orig: + if i not in linknames_list: + linknames_list.append(i) + + linknames_list.sort() + + return linknames_list + +### 3.3.7 get package info from current os +def get_pkginfo_from_os(): + # this function for get pkackage info in current os by g_pkginfodict_from_json + # input: + # @ g_pkginfodict_from_json + # output: + # @ + # return: + # @ g_pkginfodict_from_os + print("Enter function: get_pkginfo_from_os") + print(g_pkginfodict_from_json) + for key in g_pkginfodict_from_json: + g_pkginfodict_from_os[key] = get_srcver_form_srcname(key) + + return g_pkginfodict_from_os + +### 3.3.8 get libraries info from current os (don't call this function !!!) +def get_libinfo_from_os(): + # this function for get library info in current os by g_libinfodict_from_json + # input: + # @ g_libinfodict_from_json + # output: + # @ + # return: + # @ g_libinfodict_from_os + print("Enter function: get_libinfo_from_os") + liblists = [] + g_libchecker_comp_status = g_libinfodict_from_json + + for key in g_pkginfodict_from_json: + lib_linkname_lists = get_linkname_from_srcpkg(key) + lib_soname_lists = get_soname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in lib_linkname_lists: + g_libinfodict_from_os[i] = max([s for s in lib_soname_lists if i in s]) + return g_libinfodict_from_os + +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +def get_liblists_from_os(): + print("Enter function: get_liblist_from_os") + global g_liblist_from_os + temp_list = [] + + for key in g_pkginfodict_from_json: + temp_list.extend(get_soname_from_srcpkg(key)) + + + g_liblist_from_os = temp_list + + return temp_list + + +def get_libinfo_from_os_by_srcpkg(): + print("Start Test") + print(g_libinfodict_from_json) + for key in g_pkginfodict_from_json: + g_libinfodict_from_os[key] = get_soname_from_srcpkg(key) + + global g_libchecker_comp_status + + l2 = [] + for key in g_libinfodict_from_json: + l2.extend(g_libinfodict_from_json[key]) + + for i in l2: + g_libchecker_comp_status[i] = "flase" + + print(l2) + print(g_libchecker_comp_status) + + print("Overring Test") + return g_libinfodict_from_os + + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() + +# 4. Compare Package and Libraries Info +## 4.1 comapre packages between os and json-dict g_pkginfodict_from_json +def get_pkg_compare_info(): + + # it always not equla, ex: lib1-1.0 vs lib1-1.0+deb10u1, so give up! + # only compare shared library object files ***.so + + print("Enter function: get_pkg_compare_info()") + +## 4.2 comapre librarie between os and json-dict g_libinfodict_from_json +def get_lib_compare_info(): + + # only compare soname by linkname + # only compare lib***.so.X, 'X' is a key value for compare, + # because for linkname:libc6.so, soname:libc.so.6, realname:libc-2.28 + # implement by function: libchecker_compare_metainfo() + + print("Enter function: get_lib_compare_info()") + +## 4.3 generate libraries compare status to a global dict +def libchecker_compare_metainfo(): + # this function get the result of libchecker compare + # input: + # @ g_pkginfodict_from_json + # @ g_libinfodict_from_json + # output: + # @ g_libchecker_comp_status + # return: + # @ + print("Enter function: libchecker_compare_metainfo()") + liblists = [] + global g_libchecker_comp_status + + # init the g_libchecker_comp_status[] to "false" + for key in g_libinfodict_from_json: + g_libchecker_comp_status[key] = "false" + + for key in g_pkginfodict_from_json: + liblists = get_linkname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in liblists: + if compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == ">" : + g_libchecker_comp_status[i] = "true" + elif compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == "=" : + g_libchecker_comp_status[i] = "true" + else: + g_libchecker_comp_status[i] = "false" + + return g_libchecker_comp_status + +def libchecker_compare_liblist(): + + global g_liblist_from_json + global g_liblist_from_os + + liblist_json = g_liblist_from_json + liblist_os = g_liblist_from_os + + print(liblist_json) + print(liblist_os) + + compare_dict = {} + + for i in liblist_json: + compare_dict[i] = "false" + + print(compare_dict) + + for i in liblist_json: + for j in liblist_os: +# if j >= i + compare_dict[i] = compare_library_version(i, j) + + return compare_dict + +# 5. Generate Output Result +## 5.1 generate a json file output +def gen_json_file(): + # this function generate a json file (for test) + # input: + # @ + # output: + # @ file: test.json + # return: + # @ + print("Enter function: gen_json_file()") + + article_info = {} + data = json.loads(json.dumps(article_info)) + + data['cmdchecker'] = 'none' + + libchecker = {'title': 'Python-base', 'publish_time':'2019-4-1', 'write':{}} + data['libchecker'] = libchecker + + sonames = {'name': 'lixiansheng', 'sex':'man', 'email':'xxx@gmail.com'} + data['libchecker']['sonames'] = sonames + + oschecker = json.dumps(data, ensure_ascii=False) + + with open("test.json","w") as f: + json.dump(oschecker,f,indent = 4) + +def libchecker_output_json_file(): + print("Enter function: libchecker_output_json_file()") + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + result_dict = libchecker_compare_liblist() + + for key in result_dict: + if result_dict[key] == 'false': +# mateinfo = {"name" : key, "version" : "no exist", "status" : "not exist" , "category" : "exist", "otherinfo" : "no exist"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'not exist', "category" : "library", "otherinfo" : "none"} + elif result_dict[key] == '<': +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "incompatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'incompatible', "category" : "library", "otherinfo" : "none"} + else: +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "compatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'compatible', "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Outputs/libchecker-output.json","w") as f: + json.dump(output_data,f) + + +def libchecker_json_file_output(): + # this function generate a json file for libchecker + # input: + # @ g_libinfodict_from_os + # @ g_libchecker_comp_status + # output: + # @ file: libchecker-output.json + # return: + # @ + print("Enter function: gen_json_file_output()") + # { + # "libchecker" { + # "linkname" : { + # "name" : "******" + # "version" : "******" + # "status" : "******" + # "category" : "******" + # "otherinfo" : "******" + # }, + # } + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + for key in g_libchecker_comp_status: + if key not in g_libinfodict_from_os: + mateinfo = {"name" : key, "version" : "no exist", "status" : "no exist" , "category" : "exist", "otherinfo" : "no exist"} + else: + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : g_libchecker_comp_status[key], "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Output/libchecker-output.json","w") as f: + json.dump(output_data,f) + +#print(get_realname_from_debpkg('libncurses5')) +#print(get_soname_from_debpkg('libncurses5')) +#print(get_linkname_from_debpkg('libncurses5')) +#print(get_debpkg_from_srcpkg('ncurses')) +#get_pkginfo_from_os('libc6') +#libchecker_read_json_file('std-lib.json') + +#gen_json_file() +#read_json_file('std-lib.json') +#read_json_file('libchecker-out.json') +#libchecker_json_file_output() +#print(compare_library_version("lib.so.6", "lib.so.6")) +#test_function() + +#for key in g_pkginfodict_from_json: +# liblists = get_linkname_from_srcpkg(key) +# for i in g_libinfodict_from_json.keys(): + +#read_json_file('../StdLists/lib_list_1.0I-20220826.json') + +#print(read_pkginfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#print(read_libinfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#libchecker_read_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')i + +print('========== Libchecker ==========') +libchecker_read_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() +#libchecker_read_std_json('stdlists/lib_list_1.0I.json') +#def read_pkginfo_from_json(json_file_path): +#print(get_pkginfo_from_os()) +#print(get_libinfo_from_os()) + + +#print(get_libinfo_from_os_by_srcpkg()) +#print(g_libinfodict_from_json) +get_liblists_from_os() +#print(get_liblists_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +get_liblists_from_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') + +#print("g_liblist_from_json") +#print(g_liblist_from_json) +#print("g_liblist_from_os") +#print(g_liblist_from_os) + +libchecker_compare_liblist() +libchecker_output_json_file() diff --git a/LibChecker/lib_checker-version-02-with-color.py b/LibChecker/lib_checker-version-02-with-color.py new file mode 100755 index 0000000000000000000000000000000000000000..e6a1c9e8e0fa8eecee241afd68e3edf5cdab56a8 --- /dev/null +++ b/LibChecker/lib_checker-version-02-with-color.py @@ -0,0 +1,1023 @@ +#!/usr/bin/python3 + +import argparse +import json +import os +import sys +import time + +# 0. Global Resources Initialized +## 0.1 init dict and list data structures + +g_pkginfodict_from_json = {} # read pkacage info from json file +g_libinfodict_from_json = {} # read library info from json file +g_bind_pkglib_from_json = {} # bing package and library info +g_liblist_from_json = {} # bing package and library info + +g_pkginfodict_from_os = {} # dict buffer for package info from current os +g_libinfodict_from_os = {} # dict buffer for library info from current os +g_liblist_from_os = {} # dict buffer for library info from current os + +g_libchecker_comp_status = {} # dict for libchecker compare result + +g_jsonfile_dict = {} +g_pkgstd_dict = {} +g_counter_flags = {} + +def get_platform_info(): + print("\033[1;30mStart APIChecker ---> LibChecker !!!\033[0m") + +def get_stdjsons_info(json_file_path): + with open(json_file_path) as f: + f_dict = json.load(f) + + global g_jsonfile_dict + g_jsonfile_dict = f_dict + lib_basedict = f_dict['libs']['category']['base']['packages'] + +# print(type(f_dict.keys())) +# print(f_dict) + print("\t\033[1;30mStandard Summary Info:\033[0m") + print("\t\t\033[1:30mserial number: %s\033[0m" % f_dict['std_description']['std_number']) + print("\t\t\033[1;30mfile name: %s\033[0m" % f_dict['std_description']['std_name']) + + print("\t\033[1;30mLibChecker Summary Info:\033[0m") + print("\t\t\033[1;30mcheck location: %s\033[0m" % f_dict['libs']['lib_location']) + +# print("Start Checking: .....: Chapter: %s Category: %s;" %(f_dict['libs']['category']['base']['description']['chapters_number'], f_dict['libs']['category']['base']['description']['chapters_Name'])) + +def libchecker_environment_init(): +# print("Enter function: libchecker_environment_init") + + global g_counter_flags + + g_counter_flags = {'pkg_counter': {'total': 0, 'passed': 0}, 'lib_counter': {'total': 0, 'passed': 0}} + + + get_platform_info() +# get_stdjsons_info('../Jsons/lib_list_1.0I-20220914-uos.json') + get_stdjsons_info('Jsons/lib_list_1.0I-20220914-uos.json') + +# gen_mainscrn_init() + +def check_per_pkg_info(src_pkgname): +# p_srcpkgnam = os.popen('apt-cache showsrc %s | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) +# srcpkgnam = p_srcpkgnam.read().rstrip('\n') +# p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache showsrc %s | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + global g_counter_flags + + g_counter_flags['pkg_counter']['total'] += 1 + + print("\t\t\033[34mimplement package info:\033[0m ") + + if (len(srcpkgver) == 0): + print("\t\t\t\t", "not found this package") + else: + print("\t\t\t\t\033[32msrc_pkgname\033[0m -> ", src_pkgname.ljust(20),"version -> ",srcpkgver) + print("\t\t\033[34mshared libraries info:\033[0m") + g_counter_flags['pkg_counter']['passed'] += 1 +# print("\t\tsections_number -->", g_jsonfile_dict[src_pkgname]['sections_number']) +# print(l_tmp_dict[key]['alias'][0]['name']) +#print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + + +# for list_item in g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['share_objs']['desktop'] +# print("\t\t\t\tlib_soname -> ", list_item,"; " "location -> ",check_sharelib_info('/lib', list_item)) + +def check_pkginfo_for_desktop(src_pkgname): + for src_pkgname in g_jsonfile_dict: + check_per_pkg_info(g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['alias'][0]['name']) +# print(g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['alias'][0]['name']) +# print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + # print(g_jsonfile_dict[src_pkgname]['libs']['alias'][0]['name']) + #print(g_jsonfile_dict[src_pkgname]) +# print(type(g_jsonfile_dict['libs'][src_pkgname])) +# print(g_jsonfile_dict['libs']['category']['base']['packages']['glibc']['alias'][0]['name']) +# print(src_pkgname) +# print(type(src_pkgname)) + + +g_lib_location_path = " " + +def check_sharelib_info(path_dir, lib_soname): + + global g_lib_location_path + g_lib_location_path = "0" + + global g_counter_flags + g_counter_flags['lib_counter']['total'] += 1 + + + for realpath, dirs, files in os.walk(path_dir): + if lib_soname in files: + full_path = os.path.join(path_dir, realpath, lib_soname) + g_lib_location_path = (os.path.normpath(os.path.abspath(full_path))) +# if len(g_lib_location_path) == "0": +# g_lib_location_path = "no exist" + + if g_lib_location_path == "0": + return "not exist" + else: + g_counter_flags['lib_counter']['passed'] += 1 + return "(\""+ g_lib_location_path + "\")" + +#def libchecker_checking_loop(): +def libchecker_checking_loop(): +# print("Enter function: libchecker_checking_loop") +# global g_jsonfile_dict + + del g_jsonfile_dict['libs']['category']['##章节名'] +# print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + print("") + print("\033[1;30mBeginning check at [",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"\033[0m]") + +# print('chapter:'.ljust(10),'name:'.ljust(20), 'level:'.ljust(5), 'version:'.ljust(5)) + + for chapter_class in g_jsonfile_dict['libs']['category']: + if chapter_class == 'base': + l_tmp_dict = g_jsonfile_dict['libs']['category']['base']['packages'] + del l_tmp_dict['##glibc'] + else: + l_tmp_dict = g_jsonfile_dict['libs']['category'][chapter_class]['packages'] + + for key in l_tmp_dict: + + # for key in l_tmp_dict: + print("\t\033[1;31mstart checking \033[0m", '<', "\033[1;30m", key,'>', "\033[0m") + print("\t\t\033[31msections_number -->\033[0m", l_tmp_dict[key]['sections_number']) +# print("\t\tlib_description -->", l_tmp_dict[key]['lib_description']) + print("\t\t\033[31mnecessity -->\033[0m", l_tmp_dict[key]['necessity']['desktop']) + print("\t\t\033[34mstandand reference info:\033[0m") + print("\t\t\t\t\033[36mstd_pkgname -> \033[0m" ,key.ljust(20),"version -> ", l_tmp_dict[key]['version']['desktop'].ljust(5)) + check_per_pkg_info(l_tmp_dict[key]['alias'][0]['name']) + + for list1_item in g_jsonfile_dict['libs']['category'][chapter_class]['packages'][key]['share_objs']['desktop']: + print("\t\t\t\t\033[35mlib_soname -> \033[0m", "\033[31m",list1_item, "\033[0m") + lib_result = check_sharelib_info('/lib', list1_item) + print("\t\t\t\t\033[36mlib_locate -> \033[0m", "\033[33m",lib_result, "\033[0m") + +# print(list1_item) +# check_sharelib_info('/lib', list1_item) +# check_sharelib_info('\lib', list2_item) +# print(l_tmp_dict[key]['sections_number'].center(8), ' ',key.ljust(20),l_tmp_dict[key]['necessity']['desktop']['level'].ljust(5),l_tmp_dict[key]['version']['desktop'].ljust(5)) +# check_per_pkg_info(l_tmp_dict[key]['alias'][0]['name']) + + +# print(key) + +# print(l_tmp_dict['glibc'].keys()) +# check_per_so_info() + + print("=============================================================================================================") + print("\033[1;30mEnd check at [",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"\033[0m]") + print("\tPackage:") + print("\t\t\033[1;30mTotal:\033[0m", g_counter_flags['pkg_counter']['total'], "| \033[1;32mPassed:\033[0m", g_counter_flags['pkg_counter']['passed'], "| \033[1;31mFailed:\033[0m", g_counter_flags['pkg_counter']['total'] - g_counter_flags['pkg_counter']['passed']) + print("\tLibrary:") +# print("\t\t\ttotal:", g_counter_flags['lib_counter']['total'], "| passed:", g_counter_flags['lib_counter']['passed']) + print("\t\t\033[1;30mTotal:\033[0m", g_counter_flags['lib_counter']['total'], "| \033[1;32mPassed:\033[0m", g_counter_flags['lib_counter']['passed'], "| \033[1;31mFailed:\033[0m", g_counter_flags['lib_counter']['total'] - g_counter_flags['lib_counter']['passed']) + print("=============================================================================================================") + +def read_pkginfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = l1[0]['version']['desktop'] + + return temp_dict + +## 2.1 read packages info from json file +def read_libinfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + return temp_dict + +def get_liblists_from_stdjson(json_file_path): + print("Enter function: get_liblists_from_stdjson(%s)" %(json_file_path)) + + global g_liblist_from_json + chapter_class = ['base', 'security', 'network', 'graphic', 'multimedia', 'print_scan', 'runtime_language', 'development', 'basic_calculation', 'storage', 'virtualization', 'high_availability'] + + with open(json_file_path) as f: + f_dict = json.load(f) + + temp_dict = {} # Store dict={packages:sonames} + temp_list = [] # Store list=[soanmes] + for i in chapter_class: + lib_basedict = f_dict['libs']['category'][i]['packages'] + if i == 'base': + del lib_basedict['##glibc'] + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + for key in temp_dict: + temp_list.extend(temp_dict[key]) + + g_liblist_from_json = temp_list + + return temp_list + + + + +## 2.2 read libraries info from json file +def read_libinfo_from_json(json_file_path): + # this function read library info from json file + # input: + # @ json_file_path + # output: + # @ g_libinfodict_from_json + # return: + # @ libinfo_dict + print("Enter function: read_libinfo_from_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + + libinfo_dict = {} + + for i in file_data['libraries']: + libinfo_dict[i['linkname']] = i['soname'] + + fobj.close() + + return libinfo_dict + +## 2.3 read metadata info from json file +def libchecker_read_stdjson(json_file_path): + print("Enter function: libchecker_read_stdjson_file(%s)" %(json_file_path)) + + global g_pkginfodict_from_json + global g_libinfodict_from_json + + g_pkginfodict_from_json = read_pkginfo_from_stdjson(json_file_path) + g_libinfodict_from_json = read_libinfo_from_stdjson(json_file_path) + +# print(g_pkginfodict_from_json) +# print(g_libinfodict_from_json) + +## 2.3 read metadata info from json file +def libchecker_read_std_json(json_file_path): + print("Enter function: libchecker_open_std_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + objs_dict = {} + + + for i in file_data['libs']['base']: + print(i) + print(type(file_data['libs']['base'][i])) + #print(file_data['libs']['base'][i]) +# objs_dict = file_data['libs']['base'][i] + objs_dict.update({ i : file_data['libs']['base'][i]}) + +# print(objs_dict) +# print(type(objs_dict)) +# print(len(objs_dict)) +# print(objs_dict.keys()) + +# j = 'gcc' +# print(objs_dict[j]['lib_name']) + + del objs_dict['##chapters_number'] + del objs_dict['chapters_number'] + del objs_dict['##glibc'] + + + for key in objs_dict: + print(key) + + #g_pkginfodict_from_json[key['lib_name']] = key['version'] # write pkginfo to dict: g_pkginfodict_from_json + aliasname = objs_dict[key]['aliasname'] + g_pkginfodict_from_json.update({ aliasname : objs_dict[key]['version']['desktop_version']}) # src package name : pkg version + +# print(objs_dict[key]['aliasname']) + g_bind_pkglib_from_json.update({ key : objs_dict[key]['desktop-share_objs']}) # src package name : library soname + + print(g_pkginfodict_from_json) + print(g_bind_pkglib_from_json) + + for i in g_bind_pkglib_from_json: + print(g_bind_pkglib_from_json[i]) + + fobj.close() + + +# print(f_dict['libs']['base']['glibc']['necessity'].keys()) +# print(f_dict["libchecker"][1]) +# print(f_dict["libchecker"][1]['name']) + +# 3. Find Meatdate Info from Current OS +## 3.1 get src package info +def get_srcname_from_os(): + # this function for get src package name from current os + # input: + # @ + # output: + # @ + # return: + # @ + print("Enter function: get_srcname_from_os") + +def get_srcver_form_srcname(src_pkgname): + # this function for get src pacgake version from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkgver + print("Enter function: get_srcver_from_srcname(%s)" %(src_pkgname)) + p_srcpkgver = os.popen('apt-cache showsrc %s | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + return srcpkgver + +def get_pkginfo_from_srcpkg(src_pkgname): + # this function for get src pacgake info from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkg_info_dict + print("Enter function: get_pkginfo_from_srcpkg(%s)" %(src_pkgname)) + p_srcpkgnam = os.popen('apt-cache show %s | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgnam = p_srcpkgnam.read().rstrip('\n') + p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache show %s | grep Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + srcpkg_info_dict = {} + srcpkg_info_dict = {srcpkgnam : srcpkgver} + + return srcpkg_info_dict + +def compare_version_serial_number(ver1, ver2): + # this function compare two version serial number only for number + # input: + # @ ver1, string [x.x.x.x],[x]:[0-999999] + # @ ver2, string [x.x.x.x],[x]:[0-999999] + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(ver1).split(".") + list2 = str(ver2).split(".") + for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)): + if int(list1[i]) == int(list2[i]): + pass + elif int(list1[i]) < int(list2[i]): + return "<" + else: + return ">" + if len(list1) == len(list2): + return "=" + elif len(list1) < len(list2): + return "<" + else: + return ">" + +def compare_library_version(str1, str2): + # this function compare soname for number + # input: + # @ str1 + # @ str2 + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(str1).split(".") + list2 = str(str2).split(".") + + if str1 == str2: + return "=" + elif str1 < str2: + return "<" + else: + return ">" + +## 3.2 get deb package info +def get_debpkg_from_srcpkg(src_pkgname): + # this function for get deb pacgakes from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ debpkgs + print("Enter function: get_debpkg_from_srcpkg(%s)" %(src_pkgname)) + p_debpkgs = os.popen('apt-cache showsrc %s | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(src_pkgname)) + debpkgs = p_debpkgs.read().split("\n")[0].split(", ") + p_debpkgs.close() + + return debpkgs + +## 3.3 get libraries info + ################################################################################ + # RealName # + # realname = libname.so.x.y.z # + # x: major version number # + # y: minor version number # + # z: release version number # + #------------------------------------------------------------------------------# + # SoName # + # soname = libname.so.x # + # x: major version number # + #------------------------------------------------------------------------------# + # LinkName # + # link = name # + ################################################################################ +### 3.3.1 get libraries realname from deb pakcgae +def get_realname_from_debpkg(deb_pkgname): + # this function for get all library realname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ realnames + print("Enter function: get_realname_from_deb(%s)" %(deb_pkgname)) + p_realnames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$" -e ".so\."' %(deb_pkgname)) + realnames = p_realnames.read().split('\n') + del realnames[len(realnames)-1] + p_realnames.close() + + return realnames + +def compare_realname_version(realname1, realname2): + # this function compare library realname + # input: + # @ realname1 + # @ realname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.2 get libraries soname from deb package +def get_soname_from_debpkg(deb_pkgname): + # this function for get all library soname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ sonames + print("Enter function: get_soname_from_deb(%s)" %(deb_pkgname)) + # p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep .so.[0-999]$' %(deb_pkgname)) + p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep -e .so.[0-999]$ -e .so$' %(deb_pkgname)) + sonames = p_sonames.read().split('\n') + del sonames[len(sonames)-1] + p_sonames.close() + + return sonames + +def compare_soname_version(soname1, soname2): + # this function compare library soname + # input: + # @ soname1 + # @ soname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.3 get libraries linkname from deb package +def get_linkname_from_debpkg(deb_pkgname): + # this function for get all library linkname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ linknames + print("Enter function: get_linkname_from_deb(%s)" %(deb_pkgname)) + p_linknames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$"' %(deb_pkgname)) + linknames = p_linknames.read().split('\n') + del linknames[len(linknames)-1] + p_linknames.close() + + return linknames + +def compare_linkname_version(linkname1, linkname2): + # this function compare library linkname + # input: + # @ linkname1 + # @ linkname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_linkname_version") + +def pick_linkname_from_soname(soname): + # this function pick up linkname from soname + # input: + # @ soname + # output: + # @ + # return: + # @ a linkname + print("Enter function: pick_linkname_from_soname(%s)" %(soname)) + + return (soname.split(".")[0] + ".so") + +### 3.3.4 get libraries realname from src package +def get_realname_from_srcpkg(src_pkgname): + print("Enter function: get_realname_from_srcpkg(%s)" %(src_pkgname)) + # this function for get all library realname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ realnames_list + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + realnames_list_orig = [] + realnames_list = [] + for i in debpkgs_list: + realnames_list_orig.extend(get_realname_from_debpkg(i)) + + for i in realnames_list_orig: + if i not in realnames_list: + realnames_list.append(i) + + realnames_list.sort() + + return realnames_list + +### 3.3.5 get libraries soname from src package +def get_soname_from_srcpkg(src_pkgname): + # this function for get all library soname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ sonames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + sonames_list_orig = [] + sonames_list = [] + for i in debpkgs_list: + sonames_list_orig.extend(get_soname_from_debpkg(i)) + + for i in sonames_list_orig: + if i not in sonames_list: + sonames_list.append(i) + + sonames_list.sort() + + return sonames_list + +### 3.3.6 get libraries linkname from src package +def get_linkname_from_srcpkg(src_pkgname): + # this function for get all library linkname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ linknames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + linknames_list_orig = [] + linknames_list = [] + for i in debpkgs_list: + linknames_list_orig.extend(get_linkname_from_debpkg(i)) + + for i in linknames_list_orig: + if i not in linknames_list: + linknames_list.append(i) + + linknames_list.sort() + + return linknames_list + +### 3.3.7 get package info from current os +def get_pkginfo_from_os(): + # this function for get pkackage info in current os by g_pkginfodict_from_json + # input: + # @ g_pkginfodict_from_json + # output: + # @ + # return: + # @ g_pkginfodict_from_os + print("Enter function: get_pkginfo_from_os") + print(g_pkginfodict_from_json) + for key in g_pkginfodict_from_json: + g_pkginfodict_from_os[key] = get_srcver_form_srcname(key) + + return g_pkginfodict_from_os + +### 3.3.8 get libraries info from current os (don't call this function !!!) +def get_libinfo_from_os(): + # this function for get library info in current os by g_libinfodict_from_json + # input: + # @ g_libinfodict_from_json + # output: + # @ + # return: + # @ g_libinfodict_from_os + print("Enter function: get_libinfo_from_os") + liblists = [] + g_libchecker_comp_status = g_libinfodict_from_json + + for key in g_pkginfodict_from_json: + lib_linkname_lists = get_linkname_from_srcpkg(key) + lib_soname_lists = get_soname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in lib_linkname_lists: + g_libinfodict_from_os[i] = max([s for s in lib_soname_lists if i in s]) + return g_libinfodict_from_os + +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +def get_liblists_from_os(): + print("Enter function: get_liblist_from_os") + global g_liblist_from_os + temp_list = [] + + for key in g_pkginfodict_from_json: + temp_list.extend(get_soname_from_srcpkg(key)) + + + g_liblist_from_os = temp_list + + return temp_list + + +def get_libinfo_from_os_by_srcpkg(): + print("Start Test") + print(g_libinfodict_from_json) + for key in g_pkginfodict_from_json: + g_libinfodict_from_os[key] = get_soname_from_srcpkg(key) + + global g_libchecker_comp_status + + l2 = [] + for key in g_libinfodict_from_json: + l2.extend(g_libinfodict_from_json[key]) + + for i in l2: + g_libchecker_comp_status[i] = "flase" + + print(l2) + print(g_libchecker_comp_status) + + print("Overring Test") + return g_libinfodict_from_os + + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() + +# 4. Compare Package and Libraries Info +## 4.1 comapre packages between os and json-dict g_pkginfodict_from_json +def get_pkg_compare_info(): + + # it always not equla, ex: lib1-1.0 vs lib1-1.0+deb10u1, so give up! + # only compare shared library object files ***.so + + print("Enter function: get_pkg_compare_info()") + +## 4.2 comapre librarie between os and json-dict g_libinfodict_from_json +def get_lib_compare_info(): + + # only compare soname by linkname + # only compare lib***.so.X, 'X' is a key value for compare, + # because for linkname:libc6.so, soname:libc.so.6, realname:libc-2.28 + # implement by function: libchecker_compare_metainfo() + + print("Enter function: get_lib_compare_info()") + +## 4.3 generate libraries compare status to a global dict +def libchecker_compare_metainfo(): + # this function get the result of libchecker compare + # input: + # @ g_pkginfodict_from_json + # @ g_libinfodict_from_json + # output: + # @ g_libchecker_comp_status + # return: + # @ + print("Enter function: libchecker_compare_metainfo()") + liblists = [] + global g_libchecker_comp_status + + # init the g_libchecker_comp_status[] to "false" + for key in g_libinfodict_from_json: + g_libchecker_comp_status[key] = "false" + + for key in g_pkginfodict_from_json: + liblists = get_linkname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in liblists: + if compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == ">" : + g_libchecker_comp_status[i] = "true" + elif compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == "=" : + g_libchecker_comp_status[i] = "true" + else: + g_libchecker_comp_status[i] = "false" + + return g_libchecker_comp_status + +def libchecker_compare_liblist(): + + global g_liblist_from_json + global g_liblist_from_os + + liblist_json = g_liblist_from_json + liblist_os = g_liblist_from_os + + print(liblist_json) + print(liblist_os) + + compare_dict = {} + + for i in liblist_json: + compare_dict[i] = "false" + + print(compare_dict) + + for i in liblist_json: + for j in liblist_os: +# if j >= i + compare_dict[i] = compare_library_version(i, j) + + return compare_dict + +# 5. Generate Output Result +## 5.1 generate a json file output +def gen_json_file(): + # this function generate a json file (for test) + # input: + # @ + # output: + # @ file: test.json + # return: + # @ + print("Enter function: gen_json_file()") + + article_info = {} + data = json.loads(json.dumps(article_info)) + + data['cmdchecker'] = 'none' + + libchecker = {'title': 'Python-base', 'publish_time':'2019-4-1', 'write':{}} + data['libchecker'] = libchecker + + sonames = {'name': 'lixiansheng', 'sex':'man', 'email':'xxx@gmail.com'} + data['libchecker']['sonames'] = sonames + + oschecker = json.dumps(data, ensure_ascii=False) + + with open("test.json","w") as f: + json.dump(oschecker,f,indent = 4) + +def libchecker_output_json_file(): + print("Enter function: libchecker_output_json_file()") + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + result_dict = libchecker_compare_liblist() + + for key in result_dict: + if result_dict[key] == 'false': +# mateinfo = {"name" : key, "version" : "no exist", "status" : "not exist" , "category" : "exist", "otherinfo" : "no exist"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'not exist', "category" : "library", "otherinfo" : "none"} + elif result_dict[key] == '<': +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "incompatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'incompatible', "category" : "library", "otherinfo" : "none"} + else: +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "compatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'compatible', "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Outputs/libchecker-output.json","w") as f: + json.dump(output_data,f) + + +def libchecker_json_file_output(): + # this function generate a json file for libchecker + # input: + # @ g_libinfodict_from_os + # @ g_libchecker_comp_status + # output: + # @ file: libchecker-output.json + # return: + # @ + print("Enter function: gen_json_file_output()") + # { + # "libchecker" { + # "linkname" : { + # "name" : "******" + # "version" : "******" + # "status" : "******" + # "category" : "******" + # "otherinfo" : "******" + # }, + # } + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + for key in g_libchecker_comp_status: + if key not in g_libinfodict_from_os: + mateinfo = {"name" : key, "version" : "no exist", "status" : "no exist" , "category" : "exist", "otherinfo" : "no exist"} + else: + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : g_libchecker_comp_status[key], "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Output/libchecker-output.json","w") as f: + json.dump(output_data,f) + +#print(get_realname_from_debpkg('libncurses5')) +#print(get_soname_from_debpkg('libncurses5')) +#print(get_linkname_from_debpkg('libncurses5')) +#print(get_debpkg_from_srcpkg('ncurses')) +#get_pkginfo_from_os('libc6') +#libchecker_read_json_file('std-lib.json') + +#gen_json_file() +#read_json_file('std-lib.json') +#read_json_file('libchecker-out.json') +#libchecker_json_file_output() +#print(compare_library_version("lib.so.6", "lib.so.6")) +#test_function() + +#for key in g_pkginfodict_from_json: +# liblists = get_linkname_from_srcpkg(key) +# for i in g_libinfodict_from_json.keys(): + +#read_json_file('../StdLists/lib_list_1.0I-20220826.json') + +#print(read_pkginfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#print(read_libinfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#libchecker_read_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')i + +##libchecker_read_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() +#libchecker_read_std_json('stdlists/lib_list_1.0I.json') +#def read_pkginfo_from_json(json_file_path): +#print(get_pkginfo_from_os()) +#print(get_libinfo_from_os()) + + +#print(get_libinfo_from_os_by_srcpkg()) +#print(g_libinfodict_from_json) +##get_liblists_from_os() +#print(get_liblists_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +##get_liblists_from_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') + +#print("g_liblist_from_json") +#print(g_liblist_from_json) +#print("g_liblist_from_os") +#print(g_liblist_from_os) + +##libchecker_compare_liblist() +##libchecker_output_json_file() + + +libchecker_environment_init() +libchecker_checking_loop() + +#check_sharelib_info('/lib', 'libanl.so.1' ) +check_sharelib_info('/lib', 'libedit.so.2' ) + +#print(g_jsonfile_dict['glibc']['share_objs']['desktop']) +# for list_item in g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['share_objs']['desktop'] diff --git a/LibChecker/lib_checker-version-03-english.py b/LibChecker/lib_checker-version-03-english.py new file mode 100755 index 0000000000000000000000000000000000000000..7e4a6f9360636f2796349ecb0c3d974550c8c9e9 --- /dev/null +++ b/LibChecker/lib_checker-version-03-english.py @@ -0,0 +1,1089 @@ +#!/usr/bin/python3 + +import argparse +import json +import os +import platform +import sys +import time + +#from Config import global_vars +#print(global_vars.get_value("g_ostype")) + + +class Logger(object): + def __init__(self, filename='default.log', stream=sys.stdout): + self.terminal = stream + self.log = open(filename, 'a') + + def write(self, message): + self.terminal.write(message) + self.log.write(message) + + def flush(self): + pass + + #print("Beginning check at [",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + +sys.stdout = Logger("Logs/libchecker-tmp.log", sys.stdout) +#sys.stderr = Logger("Logs/a.log_file", sys.stderr) + + +# 0. Global Resources Initialized +## 0.1 init dict and list data structures + +g_pkginfodict_from_json = {} # read pkacage info from json file +g_libinfodict_from_json = {} # read library info from json file +g_bind_pkglib_from_json = {} # bing package and library info +g_liblist_from_json = {} # bing package and library info + +g_pkginfodict_from_os = {} # dict buffer for package info from current os +g_libinfodict_from_os = {} # dict buffer for library info from current os +g_liblist_from_os = {} # dict buffer for library info from current os + +g_libchecker_comp_status = {} # dict for libchecker compare result + +g_jsonfile_dict = {} +g_pkgstd_dict = {} +g_counter_flags = {} +g_ostype = "desktop" + +def libchecker_over_jobs(): +# time_now = "none" + time_now = time.strftime("%Y-%m-%d_%H-%M-%S",time.localtime()) + log_file_name = "Logs/libchecker-" + time_now + ".log" + print(type(time_now)) + print(time_now) + print(log_file_name) + + os.system("cp Logs/libchecker-tmp.log Outputs/libchecker-output-result.txt") + os.rename("Logs/libchecker-tmp.log", log_file_name) + + +def get_platform_info(): + global g_ostype + print("Start APIChecker ---> LibChecker !!!") +# p_platform_info = os.popen('uname -a') +# print(p_platform_info) +# p_platform_info.close() + + print("\tPlatform Info:") + print("\t\t Name:",os.name) + print("\t\t System:",platform.system()) + print("\t\t Architecture:",platform.architecture()) + print("\t\t Machine:",platform.machine()) + print("\t\t Processor:",platform.processor()) + print("\t\t Release:",platform.release()) + print("\t\t Version:",platform.version()) + + if "desktop" in platform.release(): + g_os_type = "desktop" + else: + g_os_type = "server" + + print(g_os_type) +# print(platform_info) + +def get_stdjsons_info(json_file_path): + with open(json_file_path) as f: + f_dict = json.load(f) + + global g_jsonfile_dict + g_jsonfile_dict = f_dict + lib_basedict = f_dict['libs']['category']['base']['packages'] + +# print(type(f_dict.keys())) +# print(f_dict) + print("\tStandard Summary Info:") + print("\t\tserial number: %s" % f_dict['std_description']['std_number']) + print("\t\tfile name: %s" % f_dict['std_description']['std_name']) + + print("\tLibChecker Summary Info:") + print("\t\tcheck location: %s" % f_dict['libs']['lib_location']) + +# print("Start Checking: .....: Chapter: %s Category: %s;" %(f_dict['libs']['category']['base']['description']['chapters_number'], f_dict['libs']['category']['base']['description']['chapters_Name'])) + +def libchecker_environment_init(): +# print("Enter function: libchecker_environment_init") + + global g_counter_flags + + g_counter_flags = {'pkg_counter': {'total': 0, 'passed': 0}, 'lib_counter': {'total': 0, 'passed': 0}} + + + get_platform_info() +# get_stdjsons_info('../Jsons/lib_list_1.0I-20220914-uos.json') + get_stdjsons_info('Jsons/lib_list_1.0I-20220914-uos.json') + +# gen_mainscrn_init() + +def check_per_pkg_info(src_pkgname): +# p_srcpkgnam = os.popen('apt-cache showsrc %s | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) +# srcpkgnam = p_srcpkgnam.read().rstrip('\n') +# p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache showsrc %s | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + global g_counter_flags + + g_counter_flags['pkg_counter']['total'] += 1 + + print("\t\timplement package info: ") + + if (len(srcpkgver) == 0): + print("\t\t\t\t", "not found this package") + print("\t\tshared libraries info:") + else: + print("\t\t\t\tsrc_pkgname -> ", src_pkgname.ljust(20),"version -> ",srcpkgver) + print("\t\tshared libraries info:") + g_counter_flags['pkg_counter']['passed'] += 1 +# print("\t\tsections_number -->", g_jsonfile_dict[src_pkgname]['sections_number']) +# print(l_tmp_dict[key]['alias'][0]['name']) +#print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + + +# for list_item in g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['share_objs']['desktop'] +# print("\t\t\t\tlib_soname -> ", list_item,"; " "location -> ",check_sharelib_info('/lib', list_item)) + +def check_pkginfo_for_desktop(src_pkgname): + for src_pkgname in g_jsonfile_dict: + check_per_pkg_info(g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['alias'][0]['name']) +# print(g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['alias'][0]['name']) +# print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + # print(g_jsonfile_dict[src_pkgname]['libs']['alias'][0]['name']) + #print(g_jsonfile_dict[src_pkgname]) +# print(type(g_jsonfile_dict['libs'][src_pkgname])) +# print(g_jsonfile_dict['libs']['category']['base']['packages']['glibc']['alias'][0]['name']) +# print(src_pkgname) +# print(type(src_pkgname)) + + +g_lib_location_path = " " + +def check_sharelib_info(path_dir, lib_soname): + + global g_lib_location_path + g_lib_location_path = "0" + + global g_counter_flags + g_counter_flags['lib_counter']['total'] += 1 + + + for realpath, dirs, files in os.walk(path_dir): + if lib_soname in files: + full_path = os.path.join(path_dir, realpath, lib_soname) + g_lib_location_path = (os.path.normpath(os.path.abspath(full_path))) +# if len(g_lib_location_path) == "0": +# g_lib_location_path = "no exist" + + if g_lib_location_path == "0": + return "no exist" + else: + g_counter_flags['lib_counter']['passed'] += 1 + return "(\""+ g_lib_location_path + "\")" + +#def libchecker_checking_loop(): +def libchecker_checking_loop(): +# print("Enter function: libchecker_checking_loop") +# global g_jsonfile_dict + + del g_jsonfile_dict['libs']['category']['##章节名'] + +# print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + print("") + print("Beginning check at [",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + +# print('chapter:'.ljust(10),'name:'.ljust(20), 'level:'.ljust(5), 'version:'.ljust(5)) + + for chapter_class in g_jsonfile_dict['libs']['category']: + if chapter_class == 'base': + l_tmp_dict = g_jsonfile_dict['libs']['category']['base']['packages'] + del l_tmp_dict['##glibc'] + else: + l_tmp_dict = g_jsonfile_dict['libs']['category'][chapter_class]['packages'] + + for key in l_tmp_dict: + + # for key in l_tmp_dict: + print("\tstart checking ", '<', key,'>', ) + print("\t\tsections_number -->", l_tmp_dict[key]['sections_number'], key) +# print("\t\tlib_description -->", l_tmp_dict[key]['lib_description']) + + + print("\t\tnecessity -->", l_tmp_dict[key]['necessity'][g_ostype]) + print("\t\tstandand reference info:") + print("\t\t\t\tstd_pkgname -> " ,key.ljust(20),"version -> ", l_tmp_dict[key]['version'][g_ostype].ljust(5)) + if (len(l_tmp_dict[key]['version'][g_ostype]) == 0): + print("\t\timplement package info: ") + print("\t\t\t\t\"not find this package\" ") + else: + check_per_pkg_info(l_tmp_dict[key]['alias'][0]['name']) + + for list1_item in g_jsonfile_dict['libs']['category'][chapter_class]['packages'][key]['share_objs'][g_ostype]: + print("\t\t\t\tlib_soname -> ",list1_item, ) + lib_result = check_sharelib_info('/lib', list1_item) + print("\t\t\t\tlib_locate -> ",lib_result,) + +# print(list1_item) +# check_sharelib_info('/lib', list1_item) +# check_sharelib_info('\lib', list2_item) +# print(l_tmp_dict[key]['sections_number'].center(8), ' ',key.ljust(20),l_tmp_dict[key]['necessity']['desktop']['level'].ljust(5),l_tmp_dict[key]['version']['desktop'].ljust(5)) +# check_per_pkg_info(l_tmp_dict[key]['alias'][0]['name']) + + +# print(key) + +# print(l_tmp_dict['glibc'].keys()) +# check_per_so_info() + + print("=============================================================================================================") + print("End check at [",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) + print("\tPackage:") + print("\t\tTotal:", g_counter_flags['pkg_counter']['total'], "| Passed:", g_counter_flags['pkg_counter']['passed'], "| Failed:", g_counter_flags['pkg_counter']['total'] - g_counter_flags['pkg_counter']['passed']) + print("\tLibrary:") +# print("\t\t\ttotal:", g_counter_flags['lib_counter']['total'], "| passed:", g_counter_flags['lib_counter']['passed']) + print("\t\tTotal:", g_counter_flags['lib_counter']['total'], "| Passed:", g_counter_flags['lib_counter']['passed'], "| Failed:", g_counter_flags['lib_counter']['total'] - g_counter_flags['lib_counter']['passed']) + print("=============================================================================================================") + +def read_pkginfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = l1[0]['version']['desktop'] + + return temp_dict + +## 2.1 read packages info from json file +def read_libinfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + return temp_dict + +def get_liblists_from_stdjson(json_file_path): + print("Enter function: get_liblists_from_stdjson(%s)" %(json_file_path)) + + global g_liblist_from_json + chapter_class = ['base', 'security', 'network', 'graphic', 'multimedia', 'print_scan', 'runtime_language', 'development', 'basic_calculation', 'storage', 'virtualization', 'high_availability'] + + with open(json_file_path) as f: + f_dict = json.load(f) + + temp_dict = {} # Store dict={packages:sonames} + temp_list = [] # Store list=[soanmes] + for i in chapter_class: + lib_basedict = f_dict['libs']['category'][i]['packages'] + if i == 'base': + del lib_basedict['##glibc'] + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + for key in temp_dict: + temp_list.extend(temp_dict[key]) + + g_liblist_from_json = temp_list + + return temp_list + + + + +## 2.2 read libraries info from json file +def read_libinfo_from_json(json_file_path): + # this function read library info from json file + # input: + # @ json_file_path + # output: + # @ g_libinfodict_from_json + # return: + # @ libinfo_dict + print("Enter function: read_libinfo_from_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + + libinfo_dict = {} + + for i in file_data['libraries']: + libinfo_dict[i['linkname']] = i['soname'] + + fobj.close() + + return libinfo_dict + +## 2.3 read metadata info from json file +def libchecker_read_stdjson(json_file_path): + print("Enter function: libchecker_read_stdjson_file(%s)" %(json_file_path)) + + global g_pkginfodict_from_json + global g_libinfodict_from_json + + g_pkginfodict_from_json = read_pkginfo_from_stdjson(json_file_path) + g_libinfodict_from_json = read_libinfo_from_stdjson(json_file_path) + +# print(g_pkginfodict_from_json) +# print(g_libinfodict_from_json) + +## 2.3 read metadata info from json file +def libchecker_read_std_json(json_file_path): + print("Enter function: libchecker_open_std_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + objs_dict = {} + + + for i in file_data['libs']['base']: + print(i) + print(type(file_data['libs']['base'][i])) + #print(file_data['libs']['base'][i]) +# objs_dict = file_data['libs']['base'][i] + objs_dict.update({ i : file_data['libs']['base'][i]}) + +# print(objs_dict) +# print(type(objs_dict)) +# print(len(objs_dict)) +# print(objs_dict.keys()) + +# j = 'gcc' +# print(objs_dict[j]['lib_name']) + + del objs_dict['##chapters_number'] + del objs_dict['chapters_number'] + del objs_dict['##glibc'] + + + for key in objs_dict: + print(key) + + #g_pkginfodict_from_json[key['lib_name']] = key['version'] # write pkginfo to dict: g_pkginfodict_from_json + aliasname = objs_dict[key]['aliasname'] + g_pkginfodict_from_json.update({ aliasname : objs_dict[key]['version']['desktop_version']}) # src package name : pkg version + +# print(objs_dict[key]['aliasname']) + g_bind_pkglib_from_json.update({ key : objs_dict[key]['desktop-share_objs']}) # src package name : library soname + + print(g_pkginfodict_from_json) + print(g_bind_pkglib_from_json) + + for i in g_bind_pkglib_from_json: + print(g_bind_pkglib_from_json[i]) + + fobj.close() + + +# print(f_dict['libs']['base']['glibc']['necessity'].keys()) +# print(f_dict["libchecker"][1]) +# print(f_dict["libchecker"][1]['name']) + +# 3. Find Meatdate Info from Current OS +## 3.1 get src package info +def get_srcname_from_os(): + # this function for get src package name from current os + # input: + # @ + # output: + # @ + # return: + # @ + print("Enter function: get_srcname_from_os") + +def get_srcver_form_srcname(src_pkgname): + # this function for get src pacgake version from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkgver + print("Enter function: get_srcver_from_srcname(%s)" %(src_pkgname)) + p_srcpkgver = os.popen('apt-cache showsrc %s | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + return srcpkgver + +def get_pkginfo_from_srcpkg(src_pkgname): + # this function for get src pacgake info from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkg_info_dict + print("Enter function: get_pkginfo_from_srcpkg(%s)" %(src_pkgname)) + p_srcpkgnam = os.popen('apt-cache show %s | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgnam = p_srcpkgnam.read().rstrip('\n') + p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache show %s | grep Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + srcpkg_info_dict = {} + srcpkg_info_dict = {srcpkgnam : srcpkgver} + + return srcpkg_info_dict + +def compare_version_serial_number(ver1, ver2): + # this function compare two version serial number only for number + # input: + # @ ver1, string [x.x.x.x],[x]:[0-999999] + # @ ver2, string [x.x.x.x],[x]:[0-999999] + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(ver1).split(".") + list2 = str(ver2).split(".") + for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)): + if int(list1[i]) == int(list2[i]): + pass + elif int(list1[i]) < int(list2[i]): + return "<" + else: + return ">" + if len(list1) == len(list2): + return "=" + elif len(list1) < len(list2): + return "<" + else: + return ">" + +def compare_library_version(str1, str2): + # this function compare soname for number + # input: + # @ str1 + # @ str2 + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(str1).split(".") + list2 = str(str2).split(".") + + if str1 == str2: + return "=" + elif str1 < str2: + return "<" + else: + return ">" + +## 3.2 get deb package info +def get_debpkg_from_srcpkg(src_pkgname): + # this function for get deb pacgakes from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ debpkgs + print("Enter function: get_debpkg_from_srcpkg(%s)" %(src_pkgname)) + p_debpkgs = os.popen('apt-cache showsrc %s | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(src_pkgname)) + debpkgs = p_debpkgs.read().split("\n")[0].split(", ") + p_debpkgs.close() + + return debpkgs + +## 3.3 get libraries info + ################################################################################ + # RealName # + # realname = libname.so.x.y.z # + # x: major version number # + # y: minor version number # + # z: release version number # + #------------------------------------------------------------------------------# + # SoName # + # soname = libname.so.x # + # x: major version number # + #------------------------------------------------------------------------------# + # LinkName # + # link = name # + ################################################################################ +### 3.3.1 get libraries realname from deb pakcgae +def get_realname_from_debpkg(deb_pkgname): + # this function for get all library realname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ realnames + print("Enter function: get_realname_from_deb(%s)" %(deb_pkgname)) + p_realnames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$" -e ".so\."' %(deb_pkgname)) + realnames = p_realnames.read().split('\n') + del realnames[len(realnames)-1] + p_realnames.close() + + return realnames + +def compare_realname_version(realname1, realname2): + # this function compare library realname + # input: + # @ realname1 + # @ realname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.2 get libraries soname from deb package +def get_soname_from_debpkg(deb_pkgname): + # this function for get all library soname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ sonames + print("Enter function: get_soname_from_deb(%s)" %(deb_pkgname)) + # p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep .so.[0-999]$' %(deb_pkgname)) + p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep -e .so.[0-999]$ -e .so$' %(deb_pkgname)) + sonames = p_sonames.read().split('\n') + del sonames[len(sonames)-1] + p_sonames.close() + + return sonames + +def compare_soname_version(soname1, soname2): + # this function compare library soname + # input: + # @ soname1 + # @ soname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.3 get libraries linkname from deb package +def get_linkname_from_debpkg(deb_pkgname): + # this function for get all library linkname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ linknames + print("Enter function: get_linkname_from_deb(%s)" %(deb_pkgname)) + p_linknames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$"' %(deb_pkgname)) + linknames = p_linknames.read().split('\n') + del linknames[len(linknames)-1] + p_linknames.close() + + return linknames + +def compare_linkname_version(linkname1, linkname2): + # this function compare library linkname + # input: + # @ linkname1 + # @ linkname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_linkname_version") + +def pick_linkname_from_soname(soname): + # this function pick up linkname from soname + # input: + # @ soname + # output: + # @ + # return: + # @ a linkname + print("Enter function: pick_linkname_from_soname(%s)" %(soname)) + + return (soname.split(".")[0] + ".so") + +### 3.3.4 get libraries realname from src package +def get_realname_from_srcpkg(src_pkgname): + print("Enter function: get_realname_from_srcpkg(%s)" %(src_pkgname)) + # this function for get all library realname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ realnames_list + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + realnames_list_orig = [] + realnames_list = [] + for i in debpkgs_list: + realnames_list_orig.extend(get_realname_from_debpkg(i)) + + for i in realnames_list_orig: + if i not in realnames_list: + realnames_list.append(i) + + realnames_list.sort() + + return realnames_list + +### 3.3.5 get libraries soname from src package +def get_soname_from_srcpkg(src_pkgname): + # this function for get all library soname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ sonames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + sonames_list_orig = [] + sonames_list = [] + for i in debpkgs_list: + sonames_list_orig.extend(get_soname_from_debpkg(i)) + + for i in sonames_list_orig: + if i not in sonames_list: + sonames_list.append(i) + + sonames_list.sort() + + return sonames_list + +### 3.3.6 get libraries linkname from src package +def get_linkname_from_srcpkg(src_pkgname): + # this function for get all library linkname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ linknames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + linknames_list_orig = [] + linknames_list = [] + for i in debpkgs_list: + linknames_list_orig.extend(get_linkname_from_debpkg(i)) + + for i in linknames_list_orig: + if i not in linknames_list: + linknames_list.append(i) + + linknames_list.sort() + + return linknames_list + +### 3.3.7 get package info from current os +def get_pkginfo_from_os(): + # this function for get pkackage info in current os by g_pkginfodict_from_json + # input: + # @ g_pkginfodict_from_json + # output: + # @ + # return: + # @ g_pkginfodict_from_os + print("Enter function: get_pkginfo_from_os") + print(g_pkginfodict_from_json) + for key in g_pkginfodict_from_json: + g_pkginfodict_from_os[key] = get_srcver_form_srcname(key) + + return g_pkginfodict_from_os + +### 3.3.8 get libraries info from current os (don't call this function !!!) +def get_libinfo_from_os(): + # this function for get library info in current os by g_libinfodict_from_json + # input: + # @ g_libinfodict_from_json + # output: + # @ + # return: + # @ g_libinfodict_from_os + print("Enter function: get_libinfo_from_os") + liblists = [] + g_libchecker_comp_status = g_libinfodict_from_json + + for key in g_pkginfodict_from_json: + lib_linkname_lists = get_linkname_from_srcpkg(key) + lib_soname_lists = get_soname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in lib_linkname_lists: + g_libinfodict_from_os[i] = max([s for s in lib_soname_lists if i in s]) + return g_libinfodict_from_os + +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +def get_liblists_from_os(): + print("Enter function: get_liblist_from_os") + global g_liblist_from_os + temp_list = [] + + for key in g_pkginfodict_from_json: + temp_list.extend(get_soname_from_srcpkg(key)) + + + g_liblist_from_os = temp_list + + return temp_list + + +def get_libinfo_from_os_by_srcpkg(): + print("Start Test") + print(g_libinfodict_from_json) + for key in g_pkginfodict_from_json: + g_libinfodict_from_os[key] = get_soname_from_srcpkg(key) + + global g_libchecker_comp_status + + l2 = [] + for key in g_libinfodict_from_json: + l2.extend(g_libinfodict_from_json[key]) + + for i in l2: + g_libchecker_comp_status[i] = "flase" + + print(l2) + print(g_libchecker_comp_status) + + print("Overring Test") + return g_libinfodict_from_os + + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() + +# 4. Compare Package and Libraries Info +## 4.1 comapre packages between os and json-dict g_pkginfodict_from_json +def get_pkg_compare_info(): + + # it always not equla, ex: lib1-1.0 vs lib1-1.0+deb10u1, so give up! + # only compare shared library object files ***.so + + print("Enter function: get_pkg_compare_info()") + +## 4.2 comapre librarie between os and json-dict g_libinfodict_from_json +def get_lib_compare_info(): + + # only compare soname by linkname + # only compare lib***.so.X, 'X' is a key value for compare, + # because for linkname:libc6.so, soname:libc.so.6, realname:libc-2.28 + # implement by function: libchecker_compare_metainfo() + + print("Enter function: get_lib_compare_info()") + +## 4.3 generate libraries compare status to a global dict +def libchecker_compare_metainfo(): + # this function get the result of libchecker compare + # input: + # @ g_pkginfodict_from_json + # @ g_libinfodict_from_json + # output: + # @ g_libchecker_comp_status + # return: + # @ + print("Enter function: libchecker_compare_metainfo()") + liblists = [] + global g_libchecker_comp_status + + # init the g_libchecker_comp_status[] to "false" + for key in g_libinfodict_from_json: + g_libchecker_comp_status[key] = "false" + + for key in g_pkginfodict_from_json: + liblists = get_linkname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in liblists: + if compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == ">" : + g_libchecker_comp_status[i] = "true" + elif compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == "=" : + g_libchecker_comp_status[i] = "true" + else: + g_libchecker_comp_status[i] = "false" + + return g_libchecker_comp_status + +def libchecker_compare_liblist(): + + global g_liblist_from_json + global g_liblist_from_os + + liblist_json = g_liblist_from_json + liblist_os = g_liblist_from_os + + print(liblist_json) + print(liblist_os) + + compare_dict = {} + + for i in liblist_json: + compare_dict[i] = "false" + + print(compare_dict) + + for i in liblist_json: + for j in liblist_os: +# if j >= i + compare_dict[i] = compare_library_version(i, j) + + return compare_dict + +# 5. Generate Output Result +## 5.1 generate a json file output +def gen_json_file(): + # this function generate a json file (for test) + # input: + # @ + # output: + # @ file: test.json + # return: + # @ + print("Enter function: gen_json_file()") + + article_info = {} + data = json.loads(json.dumps(article_info)) + + data['cmdchecker'] = 'none' + + libchecker = {'title': 'Python-base', 'publish_time':'2019-4-1', 'write':{}} + data['libchecker'] = libchecker + + sonames = {'name': 'lixiansheng', 'sex':'man', 'email':'xxx@gmail.com'} + data['libchecker']['sonames'] = sonames + + oschecker = json.dumps(data, ensure_ascii=False) + + with open("test.json","w") as f: + json.dump(oschecker,f,indent = 4) + +def libchecker_output_json_file(): + print("Enter function: libchecker_output_json_file()") + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + result_dict = libchecker_compare_liblist() + + for key in result_dict: + if result_dict[key] == 'false': +# mateinfo = {"name" : key, "version" : "no exist", "status" : "no exist" , "category" : "exist", "otherinfo" : "no exist"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'no exist', "category" : "library", "otherinfo" : "none"} + elif result_dict[key] == '<': +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "incompatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'incompatible', "category" : "library", "otherinfo" : "none"} + else: +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "compatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'compatible', "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Outputs/libchecker-output.json","w") as f: + json.dump(output_data,f) + + +def libchecker_json_file_output(): + # this function generate a json file for libchecker + # input: + # @ g_libinfodict_from_os + # @ g_libchecker_comp_status + # output: + # @ file: libchecker-output.json + # return: + # @ + print("Enter function: gen_json_file_output()") + # { + # "libchecker" { + # "linkname" : { + # "name" : "******" + # "version" : "******" + # "status" : "******" + # "category" : "******" + # "otherinfo" : "******" + # }, + # } + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + for key in g_libchecker_comp_status: + if key not in g_libinfodict_from_os: + mateinfo = {"name" : key, "version" : "no exist", "status" : "no exist" , "category" : "exist", "otherinfo" : "no exist"} + else: + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : g_libchecker_comp_status[key], "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Output/libchecker-output.json","w") as f: + json.dump(output_data,f) + +#print(get_realname_from_debpkg('libncurses5')) +#print(get_soname_from_debpkg('libncurses5')) +#print(get_linkname_from_debpkg('libncurses5')) +#print(get_debpkg_from_srcpkg('ncurses')) +#get_pkginfo_from_os('libc6') +#libchecker_read_json_file('std-lib.json') + +#gen_json_file() +#read_json_file('std-lib.json') +#read_json_file('libchecker-out.json') +#libchecker_json_file_output() +#print(compare_library_version("lib.so.6", "lib.so.6")) +#test_function() + +#for key in g_pkginfodict_from_json: +# liblists = get_linkname_from_srcpkg(key) +# for i in g_libinfodict_from_json.keys(): + +#read_json_file('../StdLists/lib_list_1.0I-20220826.json') + +#print(read_pkginfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#print(read_libinfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#libchecker_read_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')i + +##libchecker_read_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() +#libchecker_read_std_json('stdlists/lib_list_1.0I.json') +#def read_pkginfo_from_json(json_file_path): +#print(get_pkginfo_from_os()) +#print(get_libinfo_from_os()) + + +#print(get_libinfo_from_os_by_srcpkg()) +#print(g_libinfodict_from_json) +##get_liblists_from_os() +#print(get_liblists_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +##get_liblists_from_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') + +#print("g_liblist_from_json") +#print(g_liblist_from_json) +#print("g_liblist_from_os") +#print(g_liblist_from_os) + +##libchecker_compare_liblist() +##libchecker_output_json_file() + + +libchecker_environment_init() +libchecker_checking_loop() +libchecker_over_jobs() + +#check_sharelib_info('/lib', 'libanl.so.1' ) + +#print(g_jsonfile_dict['glibc']['share_objs']['desktop']) +# for list_item in g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['share_objs']['desktop'] + diff --git a/LibChecker/lib_checker-version-04-zh.py b/LibChecker/lib_checker-version-04-zh.py new file mode 100755 index 0000000000000000000000000000000000000000..0603367330f5ff961fa10ab4238045ff955a7f98 --- /dev/null +++ b/LibChecker/lib_checker-version-04-zh.py @@ -0,0 +1,1088 @@ +#!/usr/bin/python3 + +import argparse +import json +import os +import platform +import sys +import time + +#from Config import global_vars +#print(global_vars.get_value("g_ostype")) + + +class Logger(object): + def __init__(self, filename='default.log', stream=sys.stdout): + self.terminal = stream + self.log = open(filename, 'a') + + def write(self, message): + self.terminal.write(message) + self.log.write(message) + + def flush(self): + pass + + #print("Beginning check at [",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + +sys.stdout = Logger("Logs/libchecker-tmp.log", sys.stdout) +#sys.stderr = Logger("Logs/a.log_file", sys.stderr) + + +# 0. Global Resources Initialized +## 0.1 init dict and list data structures + +g_pkginfodict_from_json = {} # read pkacage info from json file +g_libinfodict_from_json = {} # read library info from json file +g_bind_pkglib_from_json = {} # bing package and library info +g_liblist_from_json = {} # bing package and library info + +g_pkginfodict_from_os = {} # dict buffer for package info from current os +g_libinfodict_from_os = {} # dict buffer for library info from current os +g_liblist_from_os = {} # dict buffer for library info from current os + +g_libchecker_comp_status = {} # dict for libchecker compare result + +g_jsonfile_dict = {} +g_pkgstd_dict = {} +g_counter_flags = {} +g_ostype = "desktop" + +def libchecker_over_jobs(): +# time_now = "none" + time_now = time.strftime("%Y-%m-%d_%H-%M-%S",time.localtime()) + log_file_name = "Logs/libchecker-" + time_now + ".log" + + os.system("cp Logs/libchecker-tmp.log Outputs/libchecker-output-result.txt") + os.rename("Logs/libchecker-tmp.log", log_file_name) + + +def get_platform_info(): + global g_ostype + print("开始 OSAPI 检查 ") +# p_platform_info = os.popen('uname -a') +# print(p_platform_info) +# p_platform_info.close() + + print("\t系统平台信息:") +# print("\t\t 名称:",os.name) + print("\t\t 系统:",platform.system()) + print("\t\t 架构:",platform.architecture()) + print("\t\t 机器:",platform.machine()) + print("\t\t 版本:",platform.release()) + + if "desktop" in platform.release(): + g_os_type = "desktop" + else: + g_os_type = "server" + +# print(platform_info) + +def get_stdjsons_info(json_file_path): + with open(json_file_path) as f: + f_dict = json.load(f) + + global g_jsonfile_dict + g_jsonfile_dict = f_dict + lib_basedict = f_dict['libs']['category']['base']['packages'] + +# print(type(f_dict.keys())) +# print(f_dict) + print("\t标准简要信息:") + print("\t\t标准号: %s" % f_dict['std_description']['std_number']) + print("\t\t文件名: %s" % f_dict['std_description']['std_name']) + + print("\t库检查器信息:") + print("\t\t检查位置: %s" % f_dict['libs']['lib_location']) + +# print("Start Checking: .....: Chapter: %s Category: %s;" %(f_dict['libs']['category']['base']['description']['chapters_number'], f_dict['libs']['category']['base']['description']['chapters_Name'])) + +def libchecker_environment_init(): +# print("Enter function: libchecker_environment_init") + + global g_counter_flags + + g_counter_flags = {'pkg_counter': {'total': 0, 'passed': 0}, 'lib_counter': {'total': 0, 'passed': 0}} + + + get_platform_info() +# get_stdjsons_info('../Jsons/lib_list_1.0I-20220914-uos.json') + get_stdjsons_info('Jsons/lib_list_1.0I-20220914-uos.json') + +# gen_mainscrn_init() + +def check_per_pkg_info(src_pkgname): +# p_srcpkgnam = os.popen('apt-cache showsrc %s | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) +# srcpkgnam = p_srcpkgnam.read().rstrip('\n') +# p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache showsrc %s | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + global g_counter_flags + + g_counter_flags['pkg_counter']['total'] += 1 + + print("\t\t系统实现: ") + + if (len(srcpkgver) == 0): + print("\t\t\t\t", "没有发现") + print("\t\t共享库信息:") + else: + print("\t\t\t\t实现包名 -> ", src_pkgname.ljust(20),"实现版本 -> ",srcpkgver) + print("\t\t共享库信息:") + g_counter_flags['pkg_counter']['passed'] += 1 +# print("\t\tsections_number -->", g_jsonfile_dict[src_pkgname]['sections_number']) +# print(l_tmp_dict[key]['alias'][0]['name']) +#print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + + +# for list_item in g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['share_objs']['desktop'] +# print("\t\t\t\tlib_soname -> ", list_item,"; " "location -> ",check_sharelib_info('/lib', list_item)) + +def check_pkginfo_for_desktop(src_pkgname): + for src_pkgname in g_jsonfile_dict: + check_per_pkg_info(g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['alias'][0]['name']) +# print(g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['alias'][0]['name']) +# print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + # print(g_jsonfile_dict[src_pkgname]['libs']['alias'][0]['name']) + #print(g_jsonfile_dict[src_pkgname]) +# print(type(g_jsonfile_dict['libs'][src_pkgname])) +# print(g_jsonfile_dict['libs']['category']['base']['packages']['glibc']['alias'][0]['name']) +# print(src_pkgname) +# print(type(src_pkgname)) + + +g_lib_location_path = " " + +def check_sharelib_info(path_dir, lib_soname): + + global g_lib_location_path + g_lib_location_path = "0" + + global g_counter_flags + g_counter_flags['lib_counter']['total'] += 1 + + + for realpath, dirs, files in os.walk(path_dir): + if lib_soname in files: + full_path = os.path.join(path_dir, realpath, lib_soname) + g_lib_location_path = (os.path.normpath(os.path.abspath(full_path))) +# if len(g_lib_location_path) == "0": +# g_lib_location_path = "no exist" + + if g_lib_location_path == "0": + return "不存在" + else: + g_counter_flags['lib_counter']['passed'] += 1 + return "(\""+ g_lib_location_path + "\")" + +#def libchecker_checking_loop(): +def libchecker_checking_loop(): +# print("Enter function: libchecker_checking_loop") +# global g_jsonfile_dict + + del g_jsonfile_dict['libs']['category']['##章节名'] + +# print(g_jsonfile_dict['libs']['category']['base']['packages'].keys()) + print("") + print("开始检查: ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + +# print('chapter:'.ljust(10),'name:'.ljust(20), 'level:'.ljust(5), 'version:'.ljust(5)) + + for chapter_class in g_jsonfile_dict['libs']['category']: + if chapter_class == 'base': + l_tmp_dict = g_jsonfile_dict['libs']['category']['base']['packages'] + del l_tmp_dict['##glibc'] + else: + l_tmp_dict = g_jsonfile_dict['libs']['category'][chapter_class]['packages'] + + for key in l_tmp_dict: + + # for key in l_tmp_dict: + print("\t正在检查 ", '<', key,'>', "..." ) + print("\t\t章节:", l_tmp_dict[key]['sections_number'], key) +# print("\t\tlib_description -->", l_tmp_dict[key]['lib_description']) + + + print("\t\t级别:", l_tmp_dict[key]['necessity'][g_ostype]['level']) + print("\t\t标准约定:") + print("\t\t\t\t标准包名 -> " ,key.ljust(20),"标准版本 -> ", l_tmp_dict[key]['version'][g_ostype].ljust(5)) + if (len(l_tmp_dict[key]['version'][g_ostype]) == 0): + print("\t\t系统实现: ") + print("\t\t\t\t没有发现") + else: + check_per_pkg_info(l_tmp_dict[key]['alias'][0]['name']) +# for Alias name +# print(len(l_tmp_dict[key]['alias'])) +# for i in range(len(l_tmp_dict[key]['alias'])): +# print(i) +# print(get_srcver_form_srcname(l_tmp_dict[key]['alias'][i]['name'])) + + for list1_item in g_jsonfile_dict['libs']['category'][chapter_class]['packages'][key]['share_objs'][g_ostype]: + print("\t\t\t\t动态库名称 -> ",list1_item, ) + lib_result = check_sharelib_info('/lib', list1_item) + print("\t\t\t\t动态库位置 -> ",lib_result,) + +# print(list1_item) +# check_sharelib_info('/lib', list1_item) +# check_sharelib_info('\lib', list2_item) +# print(l_tmp_dict[key]['sections_number'].center(8), ' ',key.ljust(20),l_tmp_dict[key]['necessity']['desktop']['level'].ljust(5),l_tmp_dict[key]['version']['desktop'].ljust(5)) +# check_per_pkg_info(l_tmp_dict[key]['alias'][0]['name']) + + +# print(key) + +# print(l_tmp_dict['glibc'].keys()) +# check_per_so_info() + + print("=============================================================================================================") + print("结束检查 ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) + print("\t软件包:") + print("\t\t检查项:", g_counter_flags['pkg_counter']['total'], "| 已通过:", g_counter_flags['pkg_counter']['passed'], "| 未通过:", g_counter_flags['pkg_counter']['total'] - g_counter_flags['pkg_counter']['passed']) + print("\t动态库:") +# print("\t\t\ttotal:", g_counter_flags['lib_counter']['total'], "| passed:", g_counter_flags['lib_counter']['passed']) + print("\t\t检查项:", g_counter_flags['lib_counter']['total'], "| 已通过:", g_counter_flags['lib_counter']['passed'], "| 未通过:", g_counter_flags['lib_counter']['total'] - g_counter_flags['lib_counter']['passed']) + print("=============================================================================================================") + +def read_pkginfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = l1[0]['version']['desktop'] + + return temp_dict + +## 2.1 read packages info from json file +def read_libinfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + return temp_dict + +def get_liblists_from_stdjson(json_file_path): + print("Enter function: get_liblists_from_stdjson(%s)" %(json_file_path)) + + global g_liblist_from_json + chapter_class = ['base', 'security', 'network', 'graphic', 'multimedia', 'print_scan', 'runtime_language', 'development', 'basic_calculation', 'storage', 'virtualization', 'high_availability'] + + with open(json_file_path) as f: + f_dict = json.load(f) + + temp_dict = {} # Store dict={packages:sonames} + temp_list = [] # Store list=[soanmes] + for i in chapter_class: + lib_basedict = f_dict['libs']['category'][i]['packages'] + if i == 'base': + del lib_basedict['##glibc'] + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + for key in temp_dict: + temp_list.extend(temp_dict[key]) + + g_liblist_from_json = temp_list + + return temp_list + + + + +## 2.2 read libraries info from json file +def read_libinfo_from_json(json_file_path): + # this function read library info from json file + # input: + # @ json_file_path + # output: + # @ g_libinfodict_from_json + # return: + # @ libinfo_dict + print("Enter function: read_libinfo_from_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + + libinfo_dict = {} + + for i in file_data['libraries']: + libinfo_dict[i['linkname']] = i['soname'] + + fobj.close() + + return libinfo_dict + +## 2.3 read metadata info from json file +def libchecker_read_stdjson(json_file_path): + print("Enter function: libchecker_read_stdjson_file(%s)" %(json_file_path)) + + global g_pkginfodict_from_json + global g_libinfodict_from_json + + g_pkginfodict_from_json = read_pkginfo_from_stdjson(json_file_path) + g_libinfodict_from_json = read_libinfo_from_stdjson(json_file_path) + +# print(g_pkginfodict_from_json) +# print(g_libinfodict_from_json) + +## 2.3 read metadata info from json file +def libchecker_read_std_json(json_file_path): + print("Enter function: libchecker_open_std_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + objs_dict = {} + + + for i in file_data['libs']['base']: + print(i) + print(type(file_data['libs']['base'][i])) + #print(file_data['libs']['base'][i]) +# objs_dict = file_data['libs']['base'][i] + objs_dict.update({ i : file_data['libs']['base'][i]}) + +# print(objs_dict) +# print(type(objs_dict)) +# print(len(objs_dict)) +# print(objs_dict.keys()) + +# j = 'gcc' +# print(objs_dict[j]['lib_name']) + + del objs_dict['##chapters_number'] + del objs_dict['chapters_number'] + del objs_dict['##glibc'] + + + for key in objs_dict: + print(key) + + #g_pkginfodict_from_json[key['lib_name']] = key['version'] # write pkginfo to dict: g_pkginfodict_from_json + aliasname = objs_dict[key]['aliasname'] + g_pkginfodict_from_json.update({ aliasname : objs_dict[key]['version']['desktop_version']}) # src package name : pkg version + +# print(objs_dict[key]['aliasname']) + g_bind_pkglib_from_json.update({ key : objs_dict[key]['desktop-share_objs']}) # src package name : library soname + + print(g_pkginfodict_from_json) + print(g_bind_pkglib_from_json) + + for i in g_bind_pkglib_from_json: + print(g_bind_pkglib_from_json[i]) + + fobj.close() + + +# print(f_dict['libs']['base']['glibc']['necessity'].keys()) +# print(f_dict["libchecker"][1]) +# print(f_dict["libchecker"][1]['name']) + +# 3. Find Meatdate Info from Current OS +## 3.1 get src package info +def get_srcname_from_os(): + # this function for get src package name from current os + # input: + # @ + # output: + # @ + # return: + # @ + print("Enter function: get_srcname_from_os") + +def get_srcver_form_srcname(src_pkgname): + # this function for get src pacgake version from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkgver + print("Enter function: get_srcver_from_srcname(%s)" %(src_pkgname)) + p_srcpkgver = os.popen('apt-cache showsrc %s | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + return srcpkgver + +def get_pkginfo_from_srcpkg(src_pkgname): + # this function for get src pacgake info from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkg_info_dict + print("Enter function: get_pkginfo_from_srcpkg(%s)" %(src_pkgname)) + p_srcpkgnam = os.popen('apt-cache show %s | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgnam = p_srcpkgnam.read().rstrip('\n') + p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache show %s | grep Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + srcpkg_info_dict = {} + srcpkg_info_dict = {srcpkgnam : srcpkgver} + + return srcpkg_info_dict + +def compare_version_serial_number(ver1, ver2): + # this function compare two version serial number only for number + # input: + # @ ver1, string [x.x.x.x],[x]:[0-999999] + # @ ver2, string [x.x.x.x],[x]:[0-999999] + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(ver1).split(".") + list2 = str(ver2).split(".") + for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)): + if int(list1[i]) == int(list2[i]): + pass + elif int(list1[i]) < int(list2[i]): + return "<" + else: + return ">" + if len(list1) == len(list2): + return "=" + elif len(list1) < len(list2): + return "<" + else: + return ">" + +def compare_library_version(str1, str2): + # this function compare soname for number + # input: + # @ str1 + # @ str2 + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(str1).split(".") + list2 = str(str2).split(".") + + if str1 == str2: + return "=" + elif str1 < str2: + return "<" + else: + return ">" + +## 3.2 get deb package info +def get_debpkg_from_srcpkg(src_pkgname): + # this function for get deb pacgakes from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ debpkgs + print("Enter function: get_debpkg_from_srcpkg(%s)" %(src_pkgname)) + p_debpkgs = os.popen('apt-cache showsrc %s | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(src_pkgname)) + debpkgs = p_debpkgs.read().split("\n")[0].split(", ") + p_debpkgs.close() + + return debpkgs + +## 3.3 get libraries info + ################################################################################ + # RealName # + # realname = libname.so.x.y.z # + # x: major version number # + # y: minor version number # + # z: release version number # + #------------------------------------------------------------------------------# + # SoName # + # soname = libname.so.x # + # x: major version number # + #------------------------------------------------------------------------------# + # LinkName # + # link = name # + ################################################################################ +### 3.3.1 get libraries realname from deb pakcgae +def get_realname_from_debpkg(deb_pkgname): + # this function for get all library realname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ realnames + print("Enter function: get_realname_from_deb(%s)" %(deb_pkgname)) + p_realnames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$" -e ".so\."' %(deb_pkgname)) + realnames = p_realnames.read().split('\n') + del realnames[len(realnames)-1] + p_realnames.close() + + return realnames + +def compare_realname_version(realname1, realname2): + # this function compare library realname + # input: + # @ realname1 + # @ realname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.2 get libraries soname from deb package +def get_soname_from_debpkg(deb_pkgname): + # this function for get all library soname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ sonames + print("Enter function: get_soname_from_deb(%s)" %(deb_pkgname)) + # p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep .so.[0-999]$' %(deb_pkgname)) + p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep -e .so.[0-999]$ -e .so$' %(deb_pkgname)) + sonames = p_sonames.read().split('\n') + del sonames[len(sonames)-1] + p_sonames.close() + + return sonames + +def compare_soname_version(soname1, soname2): + # this function compare library soname + # input: + # @ soname1 + # @ soname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.3 get libraries linkname from deb package +def get_linkname_from_debpkg(deb_pkgname): + # this function for get all library linkname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ linknames + print("Enter function: get_linkname_from_deb(%s)" %(deb_pkgname)) + p_linknames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$"' %(deb_pkgname)) + linknames = p_linknames.read().split('\n') + del linknames[len(linknames)-1] + p_linknames.close() + + return linknames + +def compare_linkname_version(linkname1, linkname2): + # this function compare library linkname + # input: + # @ linkname1 + # @ linkname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_linkname_version") + +def pick_linkname_from_soname(soname): + # this function pick up linkname from soname + # input: + # @ soname + # output: + # @ + # return: + # @ a linkname + print("Enter function: pick_linkname_from_soname(%s)" %(soname)) + + return (soname.split(".")[0] + ".so") + +### 3.3.4 get libraries realname from src package +def get_realname_from_srcpkg(src_pkgname): + print("Enter function: get_realname_from_srcpkg(%s)" %(src_pkgname)) + # this function for get all library realname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ realnames_list + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + realnames_list_orig = [] + realnames_list = [] + for i in debpkgs_list: + realnames_list_orig.extend(get_realname_from_debpkg(i)) + + for i in realnames_list_orig: + if i not in realnames_list: + realnames_list.append(i) + + realnames_list.sort() + + return realnames_list + +### 3.3.5 get libraries soname from src package +def get_soname_from_srcpkg(src_pkgname): + # this function for get all library soname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ sonames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + sonames_list_orig = [] + sonames_list = [] + for i in debpkgs_list: + sonames_list_orig.extend(get_soname_from_debpkg(i)) + + for i in sonames_list_orig: + if i not in sonames_list: + sonames_list.append(i) + + sonames_list.sort() + + return sonames_list + +### 3.3.6 get libraries linkname from src package +def get_linkname_from_srcpkg(src_pkgname): + # this function for get all library linkname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ linknames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + linknames_list_orig = [] + linknames_list = [] + for i in debpkgs_list: + linknames_list_orig.extend(get_linkname_from_debpkg(i)) + + for i in linknames_list_orig: + if i not in linknames_list: + linknames_list.append(i) + + linknames_list.sort() + + return linknames_list + +### 3.3.7 get package info from current os +def get_pkginfo_from_os(): + # this function for get pkackage info in current os by g_pkginfodict_from_json + # input: + # @ g_pkginfodict_from_json + # output: + # @ + # return: + # @ g_pkginfodict_from_os + print("Enter function: get_pkginfo_from_os") + print(g_pkginfodict_from_json) + for key in g_pkginfodict_from_json: + g_pkginfodict_from_os[key] = get_srcver_form_srcname(key) + + return g_pkginfodict_from_os + +### 3.3.8 get libraries info from current os (don't call this function !!!) +def get_libinfo_from_os(): + # this function for get library info in current os by g_libinfodict_from_json + # input: + # @ g_libinfodict_from_json + # output: + # @ + # return: + # @ g_libinfodict_from_os + print("Enter function: get_libinfo_from_os") + liblists = [] + g_libchecker_comp_status = g_libinfodict_from_json + + for key in g_pkginfodict_from_json: + lib_linkname_lists = get_linkname_from_srcpkg(key) + lib_soname_lists = get_soname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in lib_linkname_lists: + g_libinfodict_from_os[i] = max([s for s in lib_soname_lists if i in s]) + return g_libinfodict_from_os + +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +def get_liblists_from_os(): + print("Enter function: get_liblist_from_os") + global g_liblist_from_os + temp_list = [] + + for key in g_pkginfodict_from_json: + temp_list.extend(get_soname_from_srcpkg(key)) + + + g_liblist_from_os = temp_list + + return temp_list + + +def get_libinfo_from_os_by_srcpkg(): + print("Start Test") + print(g_libinfodict_from_json) + for key in g_pkginfodict_from_json: + g_libinfodict_from_os[key] = get_soname_from_srcpkg(key) + + global g_libchecker_comp_status + + l2 = [] + for key in g_libinfodict_from_json: + l2.extend(g_libinfodict_from_json[key]) + + for i in l2: + g_libchecker_comp_status[i] = "flase" + + print(l2) + print(g_libchecker_comp_status) + + print("Overring Test") + return g_libinfodict_from_os + + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() + +# 4. Compare Package and Libraries Info +## 4.1 comapre packages between os and json-dict g_pkginfodict_from_json +def get_pkg_compare_info(): + + # it always not equla, ex: lib1-1.0 vs lib1-1.0+deb10u1, so give up! + # only compare shared library object files ***.so + + print("Enter function: get_pkg_compare_info()") + +## 4.2 comapre librarie between os and json-dict g_libinfodict_from_json +def get_lib_compare_info(): + + # only compare soname by linkname + # only compare lib***.so.X, 'X' is a key value for compare, + # because for linkname:libc6.so, soname:libc.so.6, realname:libc-2.28 + # implement by function: libchecker_compare_metainfo() + + print("Enter function: get_lib_compare_info()") + +## 4.3 generate libraries compare status to a global dict +def libchecker_compare_metainfo(): + # this function get the result of libchecker compare + # input: + # @ g_pkginfodict_from_json + # @ g_libinfodict_from_json + # output: + # @ g_libchecker_comp_status + # return: + # @ + print("Enter function: libchecker_compare_metainfo()") + liblists = [] + global g_libchecker_comp_status + + # init the g_libchecker_comp_status[] to "false" + for key in g_libinfodict_from_json: + g_libchecker_comp_status[key] = "false" + + for key in g_pkginfodict_from_json: + liblists = get_linkname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in liblists: + if compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == ">" : + g_libchecker_comp_status[i] = "true" + elif compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == "=" : + g_libchecker_comp_status[i] = "true" + else: + g_libchecker_comp_status[i] = "false" + + return g_libchecker_comp_status + +def libchecker_compare_liblist(): + + global g_liblist_from_json + global g_liblist_from_os + + liblist_json = g_liblist_from_json + liblist_os = g_liblist_from_os + + print(liblist_json) + print(liblist_os) + + compare_dict = {} + + for i in liblist_json: + compare_dict[i] = "false" + + print(compare_dict) + + for i in liblist_json: + for j in liblist_os: +# if j >= i + compare_dict[i] = compare_library_version(i, j) + + return compare_dict + +# 5. Generate Output Result +## 5.1 generate a json file output +def gen_json_file(): + # this function generate a json file (for test) + # input: + # @ + # output: + # @ file: test.json + # return: + # @ + print("Enter function: gen_json_file()") + + article_info = {} + data = json.loads(json.dumps(article_info)) + + data['cmdchecker'] = 'none' + + libchecker = {'title': 'Python-base', 'publish_time':'2019-4-1', 'write':{}} + data['libchecker'] = libchecker + + sonames = {'name': 'lixiansheng', 'sex':'man', 'email':'xxx@gmail.com'} + data['libchecker']['sonames'] = sonames + + oschecker = json.dumps(data, ensure_ascii=False) + + with open("test.json","w") as f: + json.dump(oschecker,f,indent = 4) + +def libchecker_output_json_file(): + print("Enter function: libchecker_output_json_file()") + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + result_dict = libchecker_compare_liblist() + + for key in result_dict: + if result_dict[key] == 'false': +# mateinfo = {"name" : key, "version" : "no exist", "status" : "no exist" , "category" : "exist", "otherinfo" : "no exist"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'no exist', "category" : "library", "otherinfo" : "none"} + elif result_dict[key] == '<': +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "incompatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'incompatible', "category" : "library", "otherinfo" : "none"} + else: +# mateinfo = {"name" : key, "version" : result_dict[key], "status" : "compatible", "category" : "library", "otherinfo" : "none"} + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : 'compatible', "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Outputs/libchecker-output.json","w") as f: + json.dump(output_data,f) + + +def libchecker_json_file_output(): + # this function generate a json file for libchecker + # input: + # @ g_libinfodict_from_os + # @ g_libchecker_comp_status + # output: + # @ file: libchecker-output.json + # return: + # @ + print("Enter function: gen_json_file_output()") + # { + # "libchecker" { + # "linkname" : { + # "name" : "******" + # "version" : "******" + # "status" : "******" + # "category" : "******" + # "otherinfo" : "******" + # }, + # } + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + for key in g_libchecker_comp_status: + if key not in g_libinfodict_from_os: + mateinfo = {"name" : key, "version" : "no exist", "status" : "no exist" , "category" : "exist", "otherinfo" : "no exist"} + else: + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : g_libchecker_comp_status[key], "category" : "library", "otherinfo" : "none"} + + #out_data_deep = {key : mateinfo} + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Output/libchecker-output.json","w") as f: + json.dump(output_data,f) + +#print(get_realname_from_debpkg('libncurses5')) +#print(get_soname_from_debpkg('libncurses5')) +#print(get_linkname_from_debpkg('libncurses5')) +#print(get_debpkg_from_srcpkg('ncurses')) +#get_pkginfo_from_os('libc6') +#libchecker_read_json_file('std-lib.json') + +#gen_json_file() +#read_json_file('std-lib.json') +#read_json_file('libchecker-out.json') +#libchecker_json_file_output() +#print(compare_library_version("lib.so.6", "lib.so.6")) +#test_function() + +#for key in g_pkginfodict_from_json: +# liblists = get_linkname_from_srcpkg(key) +# for i in g_libinfodict_from_json.keys(): + +#read_json_file('../StdLists/lib_list_1.0I-20220826.json') + +#print(read_pkginfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#print(read_libinfo_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +#libchecker_read_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')i + +##libchecker_read_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') +#print(g_pkginfodict_from_json) +#print(g_libinfodict_from_json) +#print(g_bind_pkglib_from_json) + +#g_pkginfodict_from_os = {} +#g_libinfodict_from_os = {} + +#g_libchecker_comp_status = {} +#print(get_realname_from_srcpkg('ncurses')) +#print(get_soname_from_srcpkg('ncurses')) +#print(get_linkname_from_srcpkg('ncurses')) +#print(read_pkginfo_from_json('std-lib.json')) +#print(read_libinfo_from_json('std-lib.json')) +#print(read_pkginfo_from_json('std-lib.json')) + +#get_libinfo_from_os() +#print(get_libinfo_from_os()) + +#pick_linkname_from_soname('ncurses') +#print(get_soname_from_srcpkg('ncurses')) +#print(pick_linkname_from_soname('ncurses.so.1.9')) +#print(compare_version_serial_number("1.4.3", "2.4.3")) +#libchecker_compare_metainfo() +#libchecker_read_std_json('stdlists/lib_list_1.0I.json') +#def read_pkginfo_from_json(json_file_path): +#print(get_pkginfo_from_os()) +#print(get_libinfo_from_os()) + + +#print(get_libinfo_from_os_by_srcpkg()) +#print(g_libinfodict_from_json) +##get_liblists_from_os() +#print(get_liblists_from_stdjson('../StdLists/lib_list_1.0I-20220830-uos.json')) +##get_liblists_from_stdjson('StdLists/lib_list_1.0I-20220830-uos.json') + +#print("g_liblist_from_json") +#print(g_liblist_from_json) +#print("g_liblist_from_os") +#print(g_liblist_from_os) + +##libchecker_compare_liblist() +##libchecker_output_json_file() + + +libchecker_environment_init() +libchecker_checking_loop() +libchecker_over_jobs() + +#check_sharelib_info('/lib', 'libanl.so.1' ) + +#print(g_jsonfile_dict['glibc']['share_objs']['desktop']) +# for list_item in g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['share_objs']['desktop'] + diff --git a/LibChecker/lib_checker-version-05-xiangyu.py b/LibChecker/lib_checker-version-05-xiangyu.py new file mode 100755 index 0000000000000000000000000000000000000000..f895a3936af85eba884f71d141c15a6b4a8788cd --- /dev/null +++ b/LibChecker/lib_checker-version-05-xiangyu.py @@ -0,0 +1,1169 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +# @Author : Wang Jinlong +# @Time : 2022/11/09 16:00 +# @File : Alpha OSAPIChecker Tools Source Code + +import argparse +import json +import os +import platform +import sys +import time + +# -1. Inherit arguments from CUI +# there are some arguments match with main program + ## --strategy: + ## --level: + ## --ostype: + ## --pkgmngr: + ## --json: +parser = argparse.ArgumentParser(description="This Progermm is a OSChecker", prog="OSChecker") +parser.add_argument('-s', '--strategy', action='store', type=str, help='Choice OSAPIChecker strategy: base,only-expand,with-expand', default="base") +parser.add_argument('-l', '--level', action='store', type=str, help='Choice OSAPIChecker level: l1,l2,l3,l1l2,l1l2l3', default="l1l2") +parser.add_argument('-t', '--ostype', action='store', type=str, help='OSType of current OS: desktop, server, embed,other', default="desktop") +parser.add_argument('-p', '--pkgmngr', action='store', type=str, help='Package Manager of current OS: apt-deb, yum-rpm, src-bin, other', default="apt-deb") +parser.add_argument('-j', '--json', action='store', type=str, help='Choice OSChecker Json templete file', required=False) # this line use for dect the json file. +args = parser.parse_args() # write arguments to struct + +g_inputstrategy = args.strategy +g_inputlevel = args.level +g_inputostype = args.ostype +g_inputpkgmngr = args.pkgmngr +g_inputjson = args.json + + +# option module import +if (g_inputpkgmngr == "apt-deb"): + import apt_pkg # import for apt-deb package management tools + + +# for logger handler +class Logger(object): + def __init__(self, filename='default.log', stream=sys.stdout): + self.terminal = stream + self.log = open(filename, 'a') + + def write(self, message): + self.terminal.write(message) + self.log.write(message) + + def flush(self): + pass + +sys.stdout = Logger("Logs/libchecker-tmp.log", sys.stdout) +#sys.stderr = Logger("Logs/a.log_file", sys.stderr) + +# 0. Global Resources Initialized +## 0.1 init dict and list data structures +g_pkginfodict_from_json = {} # read pkacage info from json file +g_libinfodict_from_json = {} # read library info from json file +g_bind_pkglib_from_json = {} # bing package and library info +g_liblist_from_json = {} # bing package and library info +g_pkginfodict_from_os = {} # dict buffer for package info from current os +g_libinfodict_from_os = {} # dict buffer for library info from current os +g_liblist_from_os = {} # dict buffer for library info from current os +g_libchecker_comp_status = {} # dict for libchecker compare result +g_jsonfile_dict = {} # a josn file struct +g_pkgstd_dict = {} # a dict store json node mata-date +g_counter_flags = {} # a conuter struct +g_storejsondict = {} +g_pkgversiodict = {} +g_lib_location_path = " " +g_notfind_set_flag = 0 # bool flag for find source package status +g_chapter_dict = {} +g_genresults_to_json = {} +g_subresults_to_json = {} +g_pkgflag_dict = {} +g_ostype = "desktop" # global magic string for OS type +g_pkgmgr = "apt-deb" # global magic string for OS type +g_test_dict = {} +g_test_list = [] + +## 0.2 a recycle call function for user +def libchecker_over_jobs(): + time_now = time.strftime("%Y-%m-%d_%H-%M-%S",time.localtime()) + log_file_name = "Logs/libchecker-" + time_now + ".log" + # os.system("cp Logs/libchecker-tmp.log Outputs/libchecker-output.txt") + os.rename("Logs/libchecker-tmp.log", log_file_name) +## 0.3 platform info +def get_env_info(): + print("系统信息:") + str1 = os.popen("cat /etc/os-release").read() + str2 = str1.split("\n") + for s1 in str2: + print("\t", s1) + +def get_platform_info(): + # global g_inputstrategy = args.strategy + # global g_inputlevel = args.level + # global g_inputostype = args.ostype + # global g_inputpkgmngr = args.pkgmngr + global g_ostype + print("开始 LibChecker 检查") + # p_platform_info = os.popen('uname -a') + # print(p_platform_info) + # p_platform_info.close() + + print("\t系统平台信息:") + # print("\t\t 名称:",os.name) + print("\t\t 系统:",platform.system()) + print("\t\t 架构:",platform.architecture()) + print("\t\t 机器:",platform.machine()) + print("\t\t 版本:",platform.release()) + + # if "desktop" in platform.release(): + # g_ostype = "desktop" + # else: + # g_ostype = "server" + g_ostype = g_inputostype + +def get_stdjsons_info(json_file_path): + with open(json_file_path) as f: + f_dict = json.load(f) + + global g_jsonfile_dict + g_jsonfile_dict = f_dict + lib_basedict = f_dict['libs']['category']['base']['packages'] + + print("标准信息:") + print("\t标准简要信息:") + print("\t\t标准号: %s" % f_dict['std_description']['std_number']) + print("\t\t文件名: %s" % f_dict['std_description']['std_name']) + print("\t库检查器信息:") + print("\t\t检查位置: %s" % f_dict['libs']['lib_location']) + + # print("Start Checking: .....: Chapter: %s Category: %s;" %(f_dict['libs']['category']['base']['description']['chapters_number'], f_dict['libs']['category']['base']['description']['chapters_Name'])) + +def libchecker_environment_init(): + global g_counter_flags + # g_inputstrategy = args.strategy + # g_inputlevel = args.level + # g_inputostype = args.ostype + # g_inputpkgmngr = args.pkgmngr + + g_counter_flags = {'pkg_counter': {'total': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} , 'passed': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'warning': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'failed': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} }, 'lib_counter': {'total': 0, 'passed': 0, 'warning': 0, 'failed': 0}} + + get_env_info() + + get_stdjsons_info('Jsons/lib_list.json') + + if (g_inputpkgmngr == "apt-deb"): + apt_pkg.init_system() + +def check_srcname(realname): + if(len(g_storejsondict[realname]['alias']) == 0): + return realname + else: + alias_list = g_storejsondict[realname]['alias'][0]['name'].split('/') + if(realname not in alias_list): + alias_list.append(realname) + + if (g_inputpkgmngr == "yum-rpm"): + for alias_tmp in alias_list: + l_1 = os.system('dnf info %s 2>/dev/null 1>/dev/null' %(alias_tmp)) + if(l_1 == 0): + break + return alias_tmp + else: + for alias_tmp in alias_list: + l_1 = os.popen('apt-cache showsrc %s 2>/dev/null | grep "^Version:"' %(alias_tmp)).read().split('\n') + if(len(l_1) != 0): + break + return alias_tmp + +def check_per_pkg_info(src_pkgname): + global g_notfind_set_flag + global g_genresults_to_json + global g_test_dict + + if(g_inputostype == "desktop"): + if (g_inputpkgmngr == "apt-deb"): + p_srcpkgver = os.popen('apt-cache showsrc %s 2>/dev/null | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + elif (g_inputpkgmngr == "yum-rpm"): + p_srcpkgver = os.popen('yum list %s 2>/dev/null | awk \'{print $2}\' | sed -n \'3p\' ' %(src_pkgname)) + elif(g_inputostype == "server"): + if (g_inputpkgmngr == "apt-deb"): + p_srcpkgver = os.popen('apt-cache showsrc %s 2>/dev/null | grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + elif (g_inputpkgmngr == "yum-rpm"): + p_srcpkgver = os.popen('yum list %s 2>/dev/null | awk \'{print $2}\' | sed -n \'3p\' ' %(src_pkgname)) + else: + print("Please input --ostype=[desktop,server,embde,...] and --pkgmngr=[apt-deb,yum-rpm,src-bin,...]") + + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + global g_counter_flags + + g_counter_flags['pkg_counter']['total']['all'] += 1 + + print("\t\t系统实现: ") + + if (len(srcpkgver) == 0): + print("\t\t\t\t没有发现") + g_notfind_set_flag = 1 + else: + print("\t\t\t\t实现包名 -> ", src_pkgname.ljust(20),"实现版本 -> ",srcpkgver) + + print("\t\t共享库信息:") + + g_counter_flags['pkg_counter']['passed']['all'] += 1 + +def check_pkginfo_for_desktop(src_pkgname): + for src_pkgname in g_jsonfile_dict: + check_per_pkg_info(g_jsonfile_dict['libs']['category']['base']['packages'][src_pkgname]['alias'][0]['name']) + +def check_sharelib_info(lib_soname): + + global g_lib_location_path + global g_counter_flags + g_lib_location_path = "0" + + global g_counter_flags + g_counter_flags['lib_counter']['total'] += 1 + l_list = ["/lib", "/lib64", "/usr/lib"] + + for path_tmp in l_list: + for realpath, dirs, files in os.walk(path_tmp): + if lib_soname in files: + full_path = os.path.join(path_tmp, realpath, lib_soname) + g_lib_location_path = (os.path.normpath(os.path.abspath(full_path))) + if g_lib_location_path != "0": + break + + if g_lib_location_path == "0": + return "not found" + else: + return g_lib_location_path + +def libchecker_checking_loop(): + global g_notfind_set_flag + global g_chapter_dict + global g_genresults_to_json + global g_subresults_to_json + global g_storejsondict + global g_test_list + global g_test_dict + global g_pkgflag_dict + + l_dict_to_json = {} + l_pkgresult_to_json = {} + + del g_jsonfile_dict['libs']['category']['##章节名'] + print("") + print("开始检查: ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + for chapter_class in g_jsonfile_dict['libs']['category']: + if chapter_class == 'base': + l_tmp_dict = g_jsonfile_dict['libs']['category']['base']['packages'] + del l_tmp_dict['##glibc'] + else: + l_tmp_dict = g_jsonfile_dict['libs']['category'][chapter_class]['packages'] + for key in l_tmp_dict: + g_chapter_dict.update({ key: l_tmp_dict[key]['sections_number']}) + if (args.level == "l1"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L1"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l2"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L2"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l3"): + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict[key] = l_tmp_dict[key] + elif (args.level == "l1l2"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l1l3"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L2"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l2l3"): + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L1"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + elif (args.level == "l1l2l3"): + g_storejsondict = l_tmp_dict + else: + g_storejsondict[key] = l_tmp_dict[key] + if (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L3"): + g_storejsondict.pop(key) + elif (l_tmp_dict[key]['necessity'][g_ostype]['level'] == "L0"): + g_storejsondict.pop(key) + print("[Warnning]: Invalid input options, execute use default options \"--strate=base --levle=l1l2\"") + + for key4 in g_storejsondict: + g_test_dict.update({key4 : "wwww"}) + l_dict_to_json={'Level': 'gen', 'Shared library':'gen', 'Required version': 'gen', 'Binary package':'gen'} + g_genresults_to_json.update({ key4 : l_dict_to_json }) + + with open("Outputs/libchecker-output.json","w") as f: + json.dump(g_genresults_to_json,f) + + for last_key in g_storejsondict: + l_pkgresult_to_json.clear() + + #向json文件写入库包级别 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_level = json.load(fr) + json_level[last_key]['Level'] = g_storejsondict[last_key]['necessity'][g_inputostype]['level'] + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_level,fw,ensure_ascii=False,indent=4) + #向json文件写入库包需求版本 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_required_ver = json.load(fr) + json_required_ver[last_key]['Required version'] = g_storejsondict[last_key]['version'][g_inputostype] + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_required_ver,fw,ensure_ascii=False,indent=4) + + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L1"): + g_counter_flags['pkg_counter']['total']['l1'] += 1 + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L2"): + g_counter_flags['pkg_counter']['total']['l2'] += 1 + if (g_storejsondict[last_key]['necessity'][g_ostype]['level'] == "L3"): + g_counter_flags['pkg_counter']['total']['l3'] += 1 + print("\t正在检查 ", '<',last_key,'>', "...") + print("\t\t标准约定:") + print("\t\t\t\t从属章节 -> ", g_chapter_dict[last_key].ljust(20), "兼容级别 -> ", g_storejsondict[last_key]['necessity'][g_ostype]['level'].ljust(20)) + print("\t\t\t\t标准包名 -> " ,last_key.ljust(20),"标准版本 -> ", g_storejsondict[last_key]['version'][g_ostype].ljust(20)) + g_pkgversiodict[g_storejsondict[last_key]['lib_name']] = g_storejsondict[last_key]['version'][g_ostype] + if (len(g_storejsondict[last_key]['version'][g_ostype]) == 0): + print("\t\t系统实现:") + print("\t\t\t\t没有发现") + else: + check_per_pkg_info(check_srcname(last_key)) + g_subresults_to_json.clear() + if (g_notfind_set_flag == 1 ): + g_counter_flags['pkg_counter']['failed']['all'] += 1 + g_notfind_set_flag = 0 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_so = json.load(fr) + json_so[last_key]['Shared library'] = "-" + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_so,fw,ensure_ascii=False,indent=4) + with open("Outputs/libchecker-output.json", 'r') as fr: + json_local_ver = json.load(fr) + json_local_ver[last_key]['Binary package'] = "-" + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_local_ver,fw,ensure_ascii=False,indent=4) + continue + else: + for list1_item in g_storejsondict[last_key]['share_objs'][g_ostype]: + print("\t\t\t\t名称 -> ",list1_item) + print("\t\t\t\t\t标准约定 -> ",list1_item, ) + lib_result = check_sharelib_info(list1_item) + print("\t\t\t\t\t系统存在 -> ",lib_result, ) + temp_libsoname = lib_result.split('/')[-1] + if (lib_result == "not found"): + print("\t\t\t\t\t检测结果 -> 未检测到存在") + g_subresults_to_json[list1_item] = {'status': 'not found', 'path':'-'} + g_counter_flags['lib_counter']['failed'] += 1 + else: + print("\t\t\t\t\t检测结果 -> ", compare_library_version(temp_libsoname, str(list1_item))) + if (compare_library_version(temp_libsoname, str(list1_item)) == "equal" ): + g_counter_flags['lib_counter']['passed'] += 1 + g_subresults_to_json[list1_item] = {'status': 'compatible', 'path':lib_result} + elif (compare_library_version(temp_libsoname, str(list1_item)) == "smaller" ): + g_counter_flags['lib_counter']['failed'] += 1 + g_subresults_to_json[list1_item] = {'status': 'incompatible', 'path':lib_result} + else: + g_counter_flags['lib_counter']['warning'] += 1 + g_subresults_to_json[list1_item] = {'status': 'compatible bigger', 'path':lib_result} + + #Traverse the binary package of the source package + if (g_inputpkgmngr == "yum-rpm"): + binary_list = get_rpmpkg_from_srcpkg(last_key) + else: + binary_list = get_debpkg_from_srcpkg(last_key) + + for binary_name in binary_list: + if (g_inputpkgmngr == "yum-rpm"): + pkg_install_status = os.system('rpm -qi %s 2>/dev/null 1>/dev/null' %(binary_name)) + if (pkg_install_status == 0): + ver_required = g_storejsondict[last_key]['version'][g_inputostype] #获取要求的库包版本 + ver_local = os.popen('rpm -qi %s 2>/dev/null | grep "Version\|Release" | awk -F" " \'{print $3}\' | sed \':label;N;s/\\n/-/;t label\'' %(binary_name)).read().rstrip('\n') #获取本地库包版本 + if (get_rpmpkg_ver_contrast(ver_local, ver_required) == "compatible"): + l_pkgresult_to_json[binary_name] = {'status': 'compatible', 'local version': ver_local} + elif (get_rpmpkg_ver_contrast(ver_local, ver_required) == "incompatible"): + l_pkgresult_to_json[binary_name] = {'status': 'incompatible', 'local version': ver_local} + else: + pkg_install_status = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $1}\' | head -n 1' %(str(binary_name), str(binary_name))).read().rstrip('\n') + if (pkg_install_status == "ii"): + ver_required = g_storejsondict[last_key]['version'][g_inputostype] #获取要求的库包版本 + ver_local = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $3}\' | head -n 1' %(binary_name, binary_name)).read().rstrip('\n') #获取本地库包版本 + if (get_debpkg_ver_contrast(ver_local, ver_required) == "compatible"): + l_pkgresult_to_json[binary_name] = {'status': 'compatible', 'local version': ver_local} + elif (get_debpkg_ver_contrast(ver_local, ver_required) == "incompatible"): + l_pkgresult_to_json[binary_name] = {'status': 'incompatible', 'local version': ver_local} + else: + continue + + #向json文件写入共享库兼容信息 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_so = json.load(fr) + json_so[last_key]['Shared library'] = g_subresults_to_json + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_so,fw,ensure_ascii=False,indent=4) + #向json文件写入库包本地版本 + with open("Outputs/libchecker-output.json", 'r') as fr: + json_local_ver = json.load(fr) + json_local_ver[last_key]['Binary package'] = l_pkgresult_to_json + with open("Outputs/libchecker-output.json", 'w+') as fw: + json.dump(json_local_ver,fw,ensure_ascii=False,indent=4) + + print("=============================================================================================================") + print("结束检查 ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) + print("") + print("\t检查策略:", "\"", "--strategy =",args.strategy, "--level =",args.level, "--ostype =", args.ostype, "--pkgmngr =", args.pkgmngr, "\"") + print("") + print("\t软件包:") + print("\t\t总计:", g_counter_flags['pkg_counter']['total']['all'], "{" ,"l1->",g_counter_flags['pkg_counter']['total']['l1'],";", "l2->", g_counter_flags['pkg_counter']['total']['l2'], ";", "l3->", g_counter_flags['pkg_counter']['total']['l3'], "}") + print("\t\t通过:", g_counter_flags['pkg_counter']['passed']['all']) + print("\t\t警告:", g_counter_flags['pkg_counter']['warning']['all']) + print("\t\t报错:", g_counter_flags['pkg_counter']['failed']['all']) + print("\t动态库:") + print("\t\t总计:", g_counter_flags['lib_counter']['total']) + print("\t\t通过:", g_counter_flags['lib_counter']['passed']) + print("\t\t警告:", g_counter_flags['lib_counter']['warning']) + print("\t\t报错:", g_counter_flags['lib_counter']['failed']) + print("=============================================================================================================") + +def get_debpkg_ver_contrast(ver_local, ver_required): + # --compare-version ver_local op ver_required + # op: lt le eq ne ge gt + # sn: < <= == != >= > + compare_result = os.system('dpkg --compare-versions %s ge %s' %(str(ver_local), str(ver_required))) + if(compare_result == 0): + return "compatible" + else: + return "incompatible" + +def get_rpmpkg_ver_contrast(ver_local, ver_required): + # compare ver_local op ver_required + if ver_local < ver_required: + return "incompatible" + else: + return "compatible" + +def read_pkginfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] +# lib_basedict = f_dict['libs']['category']['security']['packages'] +# lib_basedict = f_dict['libs']['category']['network']['packages'] +# lib_basedict = f_dict['libs']['category']['graphic']['packages'] +# lib_basedict = f_dict['libs']['category']['multimedia']['packages'] +# lib_basedict = f_dict['libs']['category']['print_scan']['packages'] +# lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] +# lib_basedict = f_dict['libs']['category']['development']['packages'] +# lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] +# lib_basedict = f_dict['libs']['category']['storage']['packages'] +# lib_basedict = f_dict['libs']['category']['virtualization']['packages'] +# lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = l1[0]['version']['desktop'] + + return temp_dict + +## 2.1 read packages info from json file +def read_libinfo_from_stdjson(json_file_path): + # this function read package info from json file + # input: + # @ json_file_path + # output: + # @ g_pkginfodict_from_json + # return: + # @ pkginfo_dict + print("Enter function: read_pkginfo_from_json(%s)" %(json_file_path)) + + with open(json_file_path) as f: + f_dict = json.load(f) + + lib_basedict = f_dict['libs']['category']['base']['packages'] + # lib_basedict = f_dict['libs']['category']['security']['packages'] + # lib_basedict = f_dict['libs']['category']['network']['packages'] + # lib_basedict = f_dict['libs']['category']['graphic']['packages'] + # lib_basedict = f_dict['libs']['category']['multimedia']['packages'] + # lib_basedict = f_dict['libs']['category']['print_scan']['packages'] + # lib_basedict = f_dict['libs']['category']['runtime_language']['packages'] + # lib_basedict = f_dict['libs']['category']['development']['packages'] + # lib_basedict = f_dict['libs']['category']['basic_calculation']['packages'] + # lib_basedict = f_dict['libs']['category']['storage']['packages'] + # lib_basedict = f_dict['libs']['category']['virtualization']['packages'] + # lib_basedict = f_dict['libs']['category']['high_availability']['packages'] + + del lib_basedict['##glibc'] + + temp_dict = {} + + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + return temp_dict + +def get_liblists_from_stdjson(json_file_path): + print("Enter function: get_liblists_from_stdjson(%s)" %(json_file_path)) + + global g_liblist_from_json + chapter_class = ['base', 'security', 'network', 'graphic', 'multimedia', 'print_scan', 'runtime_language', 'development', 'basic_calculation', 'storage', 'virtualization', 'high_availability'] + + with open(json_file_path) as f: + f_dict = json.load(f) + + temp_dict = {} # Store dict={packages:sonames} + temp_list = [] # Store list=[soanmes] + for i in chapter_class: + lib_basedict = f_dict['libs']['category'][i]['packages'] + if i == 'base': + del lib_basedict['##glibc'] + for i in lib_basedict: + l1 = lib_basedict[i]['alias'] + d1 = lib_basedict[i]['share_objs'] + for i in range(len(l1)): + temp_dict[l1[0]['name']] = d1['desktop'] + + for key in temp_dict: + temp_list.extend(temp_dict[key]) + + g_liblist_from_json = temp_list + + return temp_list + + + + +## 2.2 read libraries info from json file +def read_libinfo_from_json(json_file_path): + # this function read library info from json file + # input: + # @ json_file_path + # output: + # @ g_libinfodict_from_json + # return: + # @ libinfo_dict + print("Enter function: read_libinfo_from_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + + libinfo_dict = {} + + for i in file_data['libraries']: + libinfo_dict[i['linkname']] = i['soname'] + + fobj.close() + + return libinfo_dict + +## 2.3 read metadata info from json file +def libchecker_read_stdjson(json_file_path): + print("Enter function: libchecker_read_stdjson_file(%s)" %(json_file_path)) + + global g_pkginfodict_from_json + global g_libinfodict_from_json + + g_pkginfodict_from_json = read_pkginfo_from_stdjson(json_file_path) + g_libinfodict_from_json = read_libinfo_from_stdjson(json_file_path) + +# print(g_pkginfodict_from_json) +# print(g_libinfodict_from_json) + +## 2.3 read metadata info from json file +def libchecker_read_std_json(json_file_path): + print("Enter function: libchecker_open_std_json(%s)" %(json_file_path)) + fobj = open(json_file_path) + + file_data = json.load(fobj) + objs_dict = {} + + + for i in file_data['libs']['base']: + print(i) + print(type(file_data['libs']['base'][i])) + #print(file_data['libs']['base'][i]) +# objs_dict = file_data['libs']['base'][i] + objs_dict.update({ i : file_data['libs']['base'][i]}) + +# print(objs_dict) +# print(type(objs_dict)) +# print(len(objs_dict)) +# print(objs_dict.keys()) + +# j = 'gcc' +# print(objs_dict[j]['lib_name']) + + del objs_dict['##chapters_number'] + del objs_dict['chapters_number'] + del objs_dict['##glibc'] + + + for key in objs_dict: + print(key) + + aliasname = objs_dict[key]['aliasname'] + g_pkginfodict_from_json.update({ aliasname : objs_dict[key]['version']['desktop_version']}) # src package name : pkg version + + g_bind_pkglib_from_json.update({ key : objs_dict[key]['desktop-share_objs']}) # src package name : library soname + + print(g_pkginfodict_from_json) + print(g_bind_pkglib_from_json) + + for i in g_bind_pkglib_from_json: + print(g_bind_pkglib_from_json[i]) + + fobj.close() + +# 3. Find Meatdate Info from Current OS +## 3.1 get src package info +def get_srcname_from_os(): + # this function for get src package name from current os + # input: + # @ + # output: + # @ + # return: + # @ + print("Enter function: get_srcname_from_os") + +def get_srcver_form_srcname(src_pkgname): + # this function for get src pacgake version from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkgver + print("Enter function: get_srcver_from_srcname(%s)" %(src_pkgname)) + p_srcpkgver = os.popen('apt-cache showsrc %s 2>/dev/null| grep \^Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + return srcpkgver + +def get_pkginfo_from_srcpkg(src_pkgname): + # this function for get src pacgake info from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ srcpkg_info_dict + print("Enter function: get_pkginfo_from_srcpkg(%s)" %(src_pkgname)) + p_srcpkgnam = os.popen('apt-cache show %s 2>/dev/null | grep Package | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgnam = p_srcpkgnam.read().rstrip('\n') + p_srcpkgnam.close() + p_srcpkgver = os.popen('apt-cache show %s 2>/dev/null | grep Version | cut -d '"\ "' -f 2 ' %(src_pkgname)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + + srcpkg_info_dict = {} + srcpkg_info_dict = {srcpkgnam : srcpkgver} + + return srcpkg_info_dict + +def compare_version_serial_number(ver1, ver2): + # this function compare two version serial number only for number + # input: + # @ ver1, string [x.x.x.x],[x]:[0-999999] + # @ ver2, string [x.x.x.x],[x]:[0-999999] + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + list1 = str(ver1).split(".") + list2 = str(ver2).split(".") + for i in range(len(list1)) if len(list1) < len(list2) else range(len(list2)): + if int(list1[i]) == int(list2[i]): + pass + elif int(list1[i]) < int(list2[i]): + return "<" + else: + return ">" + if len(list1) == len(list2): + return "=" + elif len(list1) < len(list2): + return "<" + else: + return ">" + +def compare_library_version(str1, str2): + # this function compare soname for number + # input: + # @ str1 + # @ str2 + # output: + # @ + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < +# list1 = str(str1).split(".") +# list2 = str(str2).split(".") + + + if str1 == str2: + return "equal" + elif str(str1) < str(str2): + return "smaller" + else: + return "bigger" + +## 3.2 get deb package info +def get_debpkg_from_srcpkg(src_pkgname): + # this function for get deb pacgakes from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ debpkgs + p_debpkgs = os.popen('apt-cache showsrc %s 2>/dev/null | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(src_pkgname)) + debpkgs = p_debpkgs.read().split("\n")[0].split(", ") + p_debpkgs.close() + + return debpkgs + +def get_rpmpkg_from_srcpkg(src_pkgname): + # this function for get rpm pacgakes from package name in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ debpkgs + + p_rpmpkgs = os.popen('dnf info | grep -B 5 -E "%s.*.src.rpm" | grep "名称" | awk -F" " \'{ print $3 }\' | sort -n | uniq | sed \':label;N;s/\\n/ /;t label\'' %(src_pkgname)) + debpkgs = p_rpmpkgs.read().split("\n")[0].split(" ") + p_rpmpkgs.close() + + return debpkgs + +## 3.3 get libraries info + ################################################################################ + # RealName # + # realname = libname.so.x.y.z # + # x: major version number # + # y: minor version number # + # z: release version number # + #------------------------------------------------------------------------------# + # SoName # + # soname = libname.so.x # + # x: major version number # + #------------------------------------------------------------------------------# + # LinkName # + # link = name # + ################################################################################ +### 3.3.1 get libraries realname from deb pakcgae +def get_realname_from_debpkg(deb_pkgname): + # this function for get all library realname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ realnames + print("Enter function: get_realname_from_deb(%s)" %(deb_pkgname)) + p_realnames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$" -e ".so\."' %(deb_pkgname)) + realnames = p_realnames.read().split('\n') + del realnames[len(realnames)-1] + p_realnames.close() + + return realnames + +def compare_realname_version(realname1, realname2): + # this function compare library realname + # input: + # @ realname1 + # @ realname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.2 get libraries soname from deb package +def get_soname_from_debpkg(deb_pkgname): + # this function for get all library soname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ sonames + print("Enter function: get_soname_from_deb(%s)" %(deb_pkgname)) + # p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep .so.[0-999]$' %(deb_pkgname)) + p_sonames = os.popen('apt-file list %s |rev | grep .os | cut -d / -f 1 | rev | sort | grep -e .so.[0-999]$ -e .so$' %(deb_pkgname)) + sonames = p_sonames.read().split('\n') + del sonames[len(sonames)-1] + p_sonames.close() + + return sonames + +def compare_soname_version(soname1, soname2): + # this function compare library soname + # input: + # @ soname1 + # @ soname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_soname_version") + +### 3.3.3 get libraries linkname from deb package +def get_linkname_from_debpkg(deb_pkgname): + # this function for get all library linkname from one deb in current os + # input: + # @ deb_pkgname + # output: + # @ + # return: + # @ linknames + print("Enter function: get_linkname_from_deb(%s)" %(deb_pkgname)) + p_linknames = os.popen('apt-file list %s | rev | cut -d / -f 1 | rev | grep -e "\.so$"' %(deb_pkgname)) + linknames = p_linknames.read().split('\n') + del linknames[len(linknames)-1] + p_linknames.close() + + return linknames + +def compare_linkname_version(linkname1, linkname2): + # this function compare library linkname + # input: + # @ linkname1 + # @ linkname2 + # output: + # @ + # return: + # @ + print("Enter function: compare_linkname_version") + +def pick_linkname_from_soname(soname): + # this function pick up linkname from soname + # input: + # @ soname + # output: + # @ + # return: + # @ a linkname + print("Enter function: pick_linkname_from_soname(%s)" %(soname)) + + return (soname.split(".")[0] + ".so") + +### 3.3.4 get libraries realname from src package +def get_realname_from_srcpkg(src_pkgname): + print("Enter function: get_realname_from_srcpkg(%s)" %(src_pkgname)) + # this function for get all library realname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ realnames_list + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + realnames_list_orig = [] + realnames_list = [] + for i in debpkgs_list: + realnames_list_orig.extend(get_realname_from_debpkg(i)) + + for i in realnames_list_orig: + if i not in realnames_list: + realnames_list.append(i) + + realnames_list.sort() + + return realnames_list + +### 3.3.5 get libraries soname from src package +def get_soname_from_srcpkg(src_pkgname): + # this function for get all library soname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ sonames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + sonames_list_orig = [] + sonames_list = [] + for i in debpkgs_list: + sonames_list_orig.extend(get_soname_from_debpkg(i)) + + for i in sonames_list_orig: + if i not in sonames_list: + sonames_list.append(i) + + sonames_list.sort() + + return sonames_list + +### 3.3.6 get libraries linkname from src package +def get_linkname_from_srcpkg(src_pkgname): + # this function for get all library linkname from src pkgname in current os + # input: + # @ src_pkgname + # output: + # @ + # return: + # @ linknames_list + print("Enter function: get_soname_from_srcpkg(%s)" %(src_pkgname)) + debpkgs_list = get_debpkg_from_srcpkg(src_pkgname) + linknames_list_orig = [] + linknames_list = [] + for i in debpkgs_list: + linknames_list_orig.extend(get_linkname_from_debpkg(i)) + + for i in linknames_list_orig: + if i not in linknames_list: + linknames_list.append(i) + + linknames_list.sort() + + return linknames_list + +### 3.3.7 get package info from current os +def get_pkginfo_from_os(): + # this function for get pkackage info in current os by g_pkginfodict_from_json + # input: + # @ g_pkginfodict_from_json + # output: + # @ + # return: + # @ g_pkginfodict_from_os + print("Enter function: get_pkginfo_from_os") + print(g_pkginfodict_from_json) + for key in g_pkginfodict_from_json: + g_pkginfodict_from_os[key] = get_srcver_form_srcname(key) + + return g_pkginfodict_from_os + +### 3.3.8 get libraries info from current os (don't call this function !!!) +def get_libinfo_from_os(): + # this function for get library info in current os by g_libinfodict_from_json + # input: + # @ g_libinfodict_from_json + # output: + # @ + # return: + # @ g_libinfodict_from_os + print("Enter function: get_libinfo_from_os") + liblists = [] + g_libchecker_comp_status = g_libinfodict_from_json + + for key in g_pkginfodict_from_json: + lib_linkname_lists = get_linkname_from_srcpkg(key) + lib_soname_lists = get_soname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in lib_linkname_lists: + g_libinfodict_from_os[i] = max([s for s in lib_soname_lists if i in s]) + return g_libinfodict_from_os + +def get_liblists_from_os(): + print("Enter function: get_liblist_from_os") + global g_liblist_from_os + temp_list = [] + + for key in g_pkginfodict_from_json: + temp_list.extend(get_soname_from_srcpkg(key)) + + + g_liblist_from_os = temp_list + + return temp_list + + +def get_libinfo_from_os_by_srcpkg(): + print("Start Test") + print(g_libinfodict_from_json) + for key in g_pkginfodict_from_json: + g_libinfodict_from_os[key] = get_soname_from_srcpkg(key) + + global g_libchecker_comp_status + + l2 = [] + for key in g_libinfodict_from_json: + l2.extend(g_libinfodict_from_json[key]) + + for i in l2: + g_libchecker_comp_status[i] = "flase" + + print(l2) + print(g_libchecker_comp_status) + + print("Overring Test") + return g_libinfodict_from_os + +# 4. Compare Package and Libraries Info +## 4.1 comapre packages between os and json-dict g_pkginfodict_from_json +def get_pkg_compare_info(): + # it always not equla, ex: lib1-1.0 vs lib1-1.0+deb10u1, so give up! + # only compare shared library object files ***.so + + print("Enter function: get_pkg_compare_info()") + +## 4.2 comapre librarie between os and json-dict g_libinfodict_from_json +def get_lib_compare_info(): + # only compare soname by linkname + # only compare lib***.so.X, 'X' is a key value for compare, + # because for linkname:libc6.so, soname:libc.so.6, realname:libc-2.28 + # implement by function: libchecker_compare_metainfo() + + print("Enter function: get_lib_compare_info()") + +## 4.3 generate libraries compare status to a global dict +def libchecker_compare_metainfo(): + # this function get the result of libchecker compare + # input: + # @ g_pkginfodict_from_json + # @ g_libinfodict_from_json + # output: + # @ g_libchecker_comp_status + # return: + # @ + print("Enter function: libchecker_compare_metainfo()") + liblists = [] + global g_libchecker_comp_status + + for key in g_libinfodict_from_json: + g_libchecker_comp_status[key] = "false" + + for key in g_pkginfodict_from_json: + liblists = get_linkname_from_srcpkg(key) + for i in g_libinfodict_from_json.keys(): + if i in liblists: + if compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == ">" : + g_libchecker_comp_status[i] = "true" + elif compare_library_version(g_libinfodict_from_os[i], g_libinfodict_from_json[i]) == "=" : + g_libchecker_comp_status[i] = "true" + else: + g_libchecker_comp_status[i] = "false" + + return g_libchecker_comp_status + +def libchecker_compare_liblist(): + + global g_liblist_from_json + global g_liblist_from_os + + liblist_json = g_liblist_from_json + liblist_os = g_liblist_from_os + + print(liblist_json) + print(liblist_os) + + compare_dict = {} + + for i in liblist_json: + compare_dict[i] = "false" + + print(compare_dict) + + for i in liblist_json: + for j in liblist_os: + compare_dict[i] = compare_library_version(i, j) + + return compare_dict + +# 5. Generate Output Result +## 5.1 generate a json file output +def gen_json_file(): + # this function generate a json file (for test) + # input: + # @ + # output: + # @ file: test.json + # return: + # @ + print("Enter function: gen_json_file()") + + article_info = {} + data = json.loads(json.dumps(article_info)) + + data['cmdchecker'] = 'none' + + libchecker = {'title': 'Python-base', 'publish_time':'2019-4-1', 'write':{}} + data['libchecker'] = libchecker + + sonames = {'name': 'lixiansheng', 'sex':'man', 'email':'xxx@gmail.com'} + data['libchecker']['sonames'] = sonames + + oschecker = json.dumps(data, ensure_ascii=False) + + with open("test.json","w") as f: + json.dump(oschecker,f,indent = 4) + +def libchecker_output_json_file(): + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + out_data_deep = {} + output_data = {"LibChecker Result" : g_genresults_to_json} + json_output = json.dumps(out_data_deep, ensure_ascii = False) + + with open("Outputs/libchecker-output.json","w") as f: + json.dump(output_data,f) + +def libchecker_json_file_output(): + # this function generate a json file for libchecker + # input: + # @ g_libinfodict_from_os + # @ g_libchecker_comp_status + # output: + # @ file: libchecker-output.json + # return: + # @ + print("Enter function: gen_json_file_output()") + + output_info = {} + output_data = json.loads(json.dumps(output_info)) + + mateinfo = {} + out_data_deep = {} + + for key in g_libchecker_comp_status: + if key not in g_libinfodict_from_os: + mateinfo = {"name" : key, "version" : "no exist", "status" : "no exist" , "category" : "exist", "otherinfo" : "no exist"} + else: + mateinfo = {"name" : pick_linkname_from_soname(key), "version" : key, "status" : g_libchecker_comp_status[key], "category" : "library", "otherinfo" : "none"} + + out_data_deep.update({key : mateinfo}) + output_data = {"libchecker": out_data_deep} + + json_output = json.dumps(output_data, ensure_ascii = False) + + with open("Output/libchecker-output.json","w") as f: + json.dump(output_data,f) + +libchecker_environment_init() +libchecker_checking_loop() + +libchecker_over_jobs() diff --git a/LibChecker/lib_checker.py b/LibChecker/lib_checker.py new file mode 100755 index 0000000000000000000000000000000000000000..2fbd56e75c9bb284da3ea17d7bbdecec93a876e3 --- /dev/null +++ b/LibChecker/lib_checker.py @@ -0,0 +1,581 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +# @Author : Wang Jinlong +# @Time : 2022/11/09 16:00 +# @File : Alpha OSAPIChecker Tools Source Code + +import argparse +import json +import os +import platform +import sys +import time +import subprocess + +# -1. Inherit arguments from CUI +# there are some arguments match with main program + ## --strategy: + ## --level: + ## --ostype: + ## --pkgmngr: + ## --json: +parser = argparse.ArgumentParser(description="This Progermm is a OSChecker", prog="OSChecker") +parser.add_argument('-s', '--strategy', action='store', type=str, help='Choice OSAPIChecker strategy: basic,expansion,with-expand', default="basic") +parser.add_argument('-l', '--level', action='store', type=str, help='Choice OSAPIChecker level: l1,l2,l3,l1l2,l1l2l3', default="l1l2") +parser.add_argument('-t', '--ostype', action='store', type=str, help='OSType of current OS: desktop, server', default="desktop") +parser.add_argument('-p', '--pkgmngr', action='store', type=str, help='Package Manager of current OS: apt-deb, yum-rpm', default="apt-deb") +parser.add_argument('-o', '--organize', action='store', type=str, help='Choice Organize or Company') +parser.add_argument('-j', '--json', action='store', type=str, help='Choice OSChecker Json templete file', required=False) # this line use for dect the json file. +parser.add_argument('-T', '--timetmp', action='store', type=str) +args = parser.parse_args() # write arguments to struct + +g_inputstrategy = args.strategy +g_inputlevel = args.level +g_inputostype = args.ostype +g_inputpkgmngr = args.pkgmngr +g_inputorganize = args.organize +g_inputjson = args.json + +g_time_stamp = args.timetmp +g_cpu_type = os.popen('uname -m').read().rstrip('\n') +g_output_filename = "Outputs/libchecker-output_" + g_cpu_type + "_" + g_time_stamp + ".json" +g_output_logname = "Logs/libchecker_" + g_time_stamp + ".log" + +# for logger handler +class Logger(object): + def __init__(self, filename='default.log', stream=sys.stdout): + self.terminal = stream + self.log = open(filename, 'a') + + def write(self, message): + self.terminal.write(message) + self.log.write(message) + + def flush(self): + pass + +sys.stdout = Logger("Logs/libchecker-tmp.log", sys.stdout) +#sys.stderr = Logger("Logs/a.log_file", sys.stderr) + +g_jsonfile_dict = {} # a josn file struct +g_counter_flags = {} # a conuter struct +g_storejsondict = {} +g_genresults_to_json = {} + +## 0.2 a recycle call function for user +def libchecker_over_jobs(): + os.rename("Logs/libchecker-tmp.log", g_output_logname) + +## 0.3 platform info +def get_env_info(): + print("系统信息:") + str1 = os.popen("cat /etc/os-release").read() + str2 = str1.split("\n") + for s1 in str2: + print("\t", s1) + +def get_stdjsons_info(json_file_path): + with open(json_file_path) as f: + f_dict = json.load(f) + + global g_jsonfile_dict + g_jsonfile_dict = f_dict + + print("标准信息:") + print("\t标准简要信息:") + print("\t\t标准号: %s" % f_dict['std_description']['std_number']) + print("\t\t文件名: %s" % f_dict['std_description']['std_name']) + print("\t库检查器信息:") + print("\t\t检查位置: %s" % f_dict['libs']['lib_location']) + +def libchecker_environment_init(): + global g_counter_flags + + #g_counter_flags = {'pkg_counter': {'total': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} , 'passed': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'warning': {'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0}, 'failed': {'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0} }, 'lib_counter': {'total': 0, 'passed': 0, 'warning': 0, 'failed': 0}} + g_counter_flags = { + 'pkg_counter': { + 'total': { + 'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + } , + 'passed': { + 'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + }, + 'warning': { + 'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + }, + 'failed': { + 'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + } + }, + 'lib_counter': { + 'total': { + 'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + } , + 'passed': { + 'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + }, + 'warning': { + 'all': 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + }, + 'failed': { + 'all' : 0, 'l1' : 0, 'l2' : 0, 'l3' : 0 + } + } + } + + get_env_info() + get_stdjsons_info('Jsons/lib_list.json') + +def get_src_alias_list (dict_name, l_realname): + l_list_src = [] + + l_alias_version = '-' + l_alias_name = '-' + l_src_dict = {} + + l_src_dict.update({l_realname: {'version': dict_name[l_realname]['version'][g_inputostype]}}) + if(len(dict_name[l_realname]['alias']) >= 0): + for i in range(0, len(dict_name[l_realname]['alias'])): + l_alias_name = dict_name[l_realname]['alias'][i]['name'] + if (l_alias_name != l_realname): + l_alias_version = dict_name[l_realname]['alias'][i]['version'][g_inputostype] + l_src_dict.update({l_alias_name: {'version': l_alias_version}}) + + return l_src_dict + +def check_per_pkg_info(dict_name, l_src_name): + global g_notfind_set_flag + global g_counter_flags + srcpkgver = [] + + if (g_inputpkgmngr == "apt-deb"): + l_search_pname = os.popen('apt-cache showsrc %s 2>/dev/null | grep ^Package: | awk -F": " \'{print $2}\'' %(l_src_name)) + l_pname = l_search_pname.read().split("\n")[0] + l_search_pname.close() + if(l_pname == l_src_name): + p_srcpkgver = os.popen('apt-cache showsrc %s 2>/dev/null | grep \^Version | cut -d '"\ "' -f 2 ' %(l_src_name)) + srcpkgver = p_srcpkgver.read().rstrip('\n') + p_srcpkgver.close() + elif (g_inputpkgmngr == "yum-rpm"): + cmd="rpm -qa --queryformat=\"%{SOURCERPM}\\n\" 2>/dev/null | grep ^" + l_src_name + " | uniq" + p_srcpkgver = subprocess.getstatusoutput(cmd) + src_list = p_srcpkgver[1].split('\n') + if (len(src_list) != 0): + for x in range(0, len(src_list)): + s_str=l_src_name + "-" + if (len(src_list[x].split(s_str)) > 1): + if (src_list[x].split(s_str)[1][0].isdigit()): + srcpkgver = src_list[x].split(s_str)[1].split('-')[0] + #srcpkgver = src_list[x].split(s_str)[1].split('.src.rpm')[0] + else: + srcpkgver = src_list + + + print("\t\t系统实现: ") + if (len(srcpkgver) == 0): + print("\t\t\t\t未发现 -> ", l_src_name.ljust(20)) + return None + else: + print("\t\t\t\t实现包名 -> ", l_src_name.ljust(20),"实现版本 -> ",srcpkgver) + return l_src_name + +##====查询共享库路径信息====## +def check_sharelib_info(lib_soname): + + global g_lib_location_path + g_lib_location_path = "0" + + l_list = ["/lib", "/lib64", "/usr/lib", "/usr/lib64"] + + for path_tmp in l_list: + for realpath, dirs, files in os.walk(path_tmp): + if lib_soname in files: + full_path = os.path.join(path_tmp, realpath, lib_soname) + g_lib_location_path = (os.path.normpath(os.path.abspath(full_path))) + break + + if g_lib_location_path != "0": + break + + if g_lib_location_path == "0": + return "not found" + else: + return g_lib_location_path + +def get_packages_binary_info (dict_name, key): + l_src_list_update = [] + l_list_binary_name = [] + l_dict_alias_info = {} + l_dict_src_info = {} + + global g_counter_flags + + l_dict_src_info = get_src_alias_list (dict_name, key) + for l in l_dict_src_info: + src_name_status = check_per_pkg_info(dict_name, l) + if (src_name_status != None): + l_list_binary_name = get_all_binary_list (l) + if(len(l_list_binary_name) != 0): + l_dict_binary_name = {} + for j in range(0, len(l_list_binary_name)): + l_local_version = {} + l_dict_binary_name.update({l_list_binary_name[j]: {'status':'-','version':'-'}}) + if (g_inputpkgmngr == "yum-rpm"): + l_local_version = get_rpmpkg_local_version(l_list_binary_name[j], l_dict_src_info[l]['version']) + else: + l_local_version = get_debpkg_local_version(l_list_binary_name[j], l_dict_src_info[l]['version']) + l_dict_binary_name.update({l_list_binary_name[j]: l_local_version}) + l_dict_alias_info[l] = l_dict_binary_name + + old_failed_num = g_counter_flags['pkg_counter']['failed']['all'] + for p_a in l_dict_alias_info: + for p_b in l_dict_alias_info[p_a]: + if (l_dict_alias_info[p_a][p_b]['status'] == "incompatible"): + g_counter_flags['pkg_counter']['failed']['all'] += 1 + if (dict_name[key]['necessity'][g_inputostype]['level'].lower() == "l1" ): + g_counter_flags['pkg_counter']['failed']['l1'] += 1 + elif (dict_name[key]['necessity'][g_inputostype]['level'].lower() == "l2" ): + g_counter_flags['pkg_counter']['failed']['l2'] += 1 + elif (dict_name[key]['necessity'][g_inputostype]['level'].lower() == "l3" ): + g_counter_flags['pkg_counter']['failed']['l3'] += 1 + break + new_failed_num = g_counter_flags['pkg_counter']['failed']['all'] + if (new_failed_num > old_failed_num): + break + + with open(g_output_filename, 'r') as fr: + json_alias_info = json.load(fr) + json_alias_info[key]['Binary package'] = l_dict_alias_info + with open(g_output_filename, 'w+') as fw: + json.dump(json_alias_info,fw,ensure_ascii=False,indent=4) + +##====主函数====## +def libchecker_checking_loop(): + global g_genresults_to_json + global g_storejsondict + + l_strategy_list = ['basic', 'expansion', 'with-expand'] + + del g_jsonfile_dict['libs']['category']['##章节名'] + print("") + print("开始检查: ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),"") + for chapter_class in g_jsonfile_dict['libs']['category']: + l_tmp_dict = {} + if chapter_class == 'base': + l_tmp_dict = g_jsonfile_dict['libs']['category']['base']['packages'] + del l_tmp_dict['##glibc'] + else: + l_tmp_dict = g_jsonfile_dict['libs']['category'][chapter_class]['packages'] + for key in l_tmp_dict: + l_level = l_tmp_dict[key]['necessity'][g_inputostype]['level'].lower() + l_strategy = l_tmp_dict[key]['necessity'][g_inputostype]['options'] + if (l_level in g_inputlevel): + if (g_inputstrategy == "with-expand") or (g_inputstrategy == l_strategy): + g_storejsondict[key] = l_tmp_dict[key] + + for key4 in g_storejsondict: + l_dict_to_json={'Level': 'gen', 'Shared library':'gen', 'Required version': 'gen', 'Binary package':'gen'} + g_genresults_to_json.update({ key4 : l_dict_to_json }) + + with open(g_output_filename,"w") as f: + json.dump(g_genresults_to_json,f) + + for last_key in g_storejsondict: + print("=============================================================================================================") + print("\t正在检查 ", '<',last_key,'>', "...") + print("\t\t标准约定:") + print("\t\t\t\t从属章节 -> ", g_storejsondict[last_key]['sections_number'].ljust(20), "兼容级别 -> ", g_storejsondict[last_key]['necessity'][g_inputostype]['level'].ljust(20)) + print("\t\t\t\t标准包名 -> " ,last_key.ljust(20),"标准版本 -> ", g_storejsondict[last_key]['version'][g_inputostype].ljust(20)) + + with open(g_output_filename, 'r') as fr: + json_level = json.load(fr) + json_level[last_key]['Level'] = g_storejsondict[last_key]['necessity'][g_inputostype]['level'] + json_level[last_key]['Required version'] = g_storejsondict[last_key]['version'][g_inputostype] + with open(g_output_filename, 'w+') as fw: + json.dump(json_level,fw,ensure_ascii=False,indent=4) + + g_counter_flags['pkg_counter']['total']['all'] += 1 + if (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l1" ): + g_counter_flags['pkg_counter']['total']['l1'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l2" ): + g_counter_flags['pkg_counter']['total']['l2'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l3" ): + g_counter_flags['pkg_counter']['total']['l3'] += 1 + + get_packages_binary_info (g_storejsondict, last_key) + + print("\t\t共享库信息:") + l_subresults_to_json = {} + for list1_item in g_storejsondict[last_key]['share_objs'][g_inputostype]: + print("\t\t\t\t名称 -> ",list1_item) + print("\t\t\t\t\t标准约定 -> ",list1_item) + lib_result = check_sharelib_info(list1_item) + print("\t\t\t\t\t系统存在 -> ",lib_result) + temp_libsoname = lib_result.split('/')[-1] + if (lib_result == "not found"): + print("\t\t\t\t\t文件所属 -> ", None) + print("\t\t\t\t\t检测结果 -> 未检测到存在") + l_subresults_to_json.update({list1_item: {'status': 'not found', 'path':'-', 'belongs':'None'}}) + if (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l1" ): + g_counter_flags['lib_counter']['failed']['l1'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l2" ): + g_counter_flags['lib_counter']['failed']['l2'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l3" ): + g_counter_flags['lib_counter']['failed']['l3'] += 1 + else: + if (g_inputpkgmngr == "yum-rpm"): + l_file_belongs = get_rpm_file_belongs_package(lib_result) + else: + l_file_belongs = get_deb_file_belongs_package(lib_result) + print("\t\t\t\t\t文件所属 -> ", l_file_belongs) + l_check_version = compare_library_version(temp_libsoname, str(list1_item)) + if (l_check_version == "equal") or (l_check_version == "bigger"): + #g_counter_flags['lib_counter']['passed'] += 1 + l_subresults_to_json.update({list1_item: {'status': 'compatible', 'path':lib_result, 'belongs':l_file_belongs}}) + if (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l1" ): + g_counter_flags['lib_counter']['passed']['l1'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l2" ): + g_counter_flags['lib_counter']['passed']['l2'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l3" ): + g_counter_flags['lib_counter']['passed']['l3'] += 1 + else: + #g_counter_flags['lib_counter']['failed'] += 1 + l_subresults_to_json.update({list1_item: {'status': 'incompatible', 'path':lib_result, 'belongs':l_file_belongs}}) + if (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l1" ): + g_counter_flags['lib_counter']['failed']['l1'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l2" ): + g_counter_flags['lib_counter']['failed']['l2'] += 1 + elif (g_storejsondict[last_key]['necessity'][g_inputostype]['level'].lower() == "l3" ): + g_counter_flags['lib_counter']['failed']['l3'] += 1 + + print("\t\t\t\t\t检测结果 -> ", l_check_version) + + with open(g_output_filename, 'r') as fr: + json_so = json.load(fr) + json_so[last_key]['Shared library'] = l_subresults_to_json + with open(g_output_filename, 'w+') as fw: + json.dump(json_so,fw,ensure_ascii=False,indent=4) + + ## 软件包 + g_counter_flags['pkg_counter']['passed']['all'] = g_counter_flags['pkg_counter']['total']['all'] - g_counter_flags['pkg_counter']['failed']['all'] + g_counter_flags['pkg_counter']['passed']['l1'] = g_counter_flags['pkg_counter']['total']['l1'] - g_counter_flags['pkg_counter']['failed']['l1'] + g_counter_flags['pkg_counter']['passed']['l2'] = g_counter_flags['pkg_counter']['total']['l2'] - g_counter_flags['pkg_counter']['failed']['l2'] + g_counter_flags['pkg_counter']['passed']['l3'] = g_counter_flags['pkg_counter']['total']['l3'] - g_counter_flags['pkg_counter']['failed']['l3'] + + ## 动态库 + g_counter_flags['lib_counter']['passed']['all'] = g_counter_flags['lib_counter']['passed']['l1'] + g_counter_flags['lib_counter']['passed']['l2'] + g_counter_flags['lib_counter']['passed']['l3'] + g_counter_flags['lib_counter']['failed']['all'] = g_counter_flags['lib_counter']['failed']['l1'] + g_counter_flags['lib_counter']['failed']['l2'] + g_counter_flags['lib_counter']['failed']['l3'] + g_counter_flags['lib_counter']['total']['l1'] = g_counter_flags['lib_counter']['passed']['l1'] + g_counter_flags['lib_counter']['failed']['l1'] + g_counter_flags['lib_counter']['total']['l2'] = g_counter_flags['lib_counter']['passed']['l2'] + g_counter_flags['lib_counter']['failed']['l2'] + g_counter_flags['lib_counter']['total']['l3'] = g_counter_flags['lib_counter']['passed']['l3'] + g_counter_flags['lib_counter']['failed']['l3'] + g_counter_flags['lib_counter']['total']['all'] = g_counter_flags['lib_counter']['passed']['all'] + g_counter_flags['lib_counter']['failed']['all'] + + print("=============================================================================================================") + print("结束检查 ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) + print("") + print("\t检查策略:", "\"", "--strategy =",args.strategy, "--level =",args.level, "--ostype =", args.ostype, "--pkgmngr =", args.pkgmngr, "--organize =", args.organize, "\"") + print("") + print("\t软件包:") + print(("\t\t总计: %s" %(g_counter_flags['pkg_counter']['total']['all'])).ljust(10), ("(L1--->%s," %(g_counter_flags['pkg_counter']['total']['l1'])).ljust(10), ("L2--->%s," %(g_counter_flags['pkg_counter']['total']['l2'])).ljust(10), ("L3--->%s)" %(g_counter_flags['pkg_counter']['total']['l3'])).ljust(10)) + print(("\t\t通过: %s" %(g_counter_flags['pkg_counter']['passed']['all'])).ljust(10), ("(L1--->%s," %(g_counter_flags['pkg_counter']['passed']['l1'])).ljust(10), ("L2--->%s," %(g_counter_flags['pkg_counter']['passed']['l2'])).ljust(10), ("L3--->%s)" %(g_counter_flags['pkg_counter']['passed']['l3'])).ljust(10)) + print(("\t\t报错: %s" %(g_counter_flags['pkg_counter']['failed']['all'])).ljust(10), ("(L1--->%s," %(g_counter_flags['pkg_counter']['failed']['l1'])).ljust(10), ("L2--->%s," %(g_counter_flags['pkg_counter']['failed']['l2'])).ljust(10), ("L3--->%s)" %(g_counter_flags['pkg_counter']['failed']['l3'])).ljust(10)) + print("\t动态库:") + print(("\t\t总计: %s" %(g_counter_flags['lib_counter']['total']['all'])).ljust(10), ("(L1--->%s," %(g_counter_flags['lib_counter']['total']['l1'])).ljust(10), ("L2--->%s," %(g_counter_flags['lib_counter']['total']['l2'])).ljust(10), ("L3--->%s)" %(g_counter_flags['lib_counter']['total']['l3'])).ljust(10)) + print(("\t\t通过: %s" %(g_counter_flags['lib_counter']['passed']['all'])).ljust(10), ("(L1--->%s," %(g_counter_flags['lib_counter']['passed']['l1'])).ljust(10), ("L2--->%s," %(g_counter_flags['lib_counter']['passed']['l2'])).ljust(10), ("L3--->%s)" %(g_counter_flags['lib_counter']['passed']['l3'])).ljust(10)) + print(("\t\t报错: %s" %(g_counter_flags['lib_counter']['failed']['all'])).ljust(10), ("(L1--->%s," %(g_counter_flags['lib_counter']['failed']['l1'])).ljust(10), ("L2--->%s," %(g_counter_flags['lib_counter']['failed']['l2'])).ljust(10), ("L3--->%s)" %(g_counter_flags['lib_counter']['failed']['l3'])).ljust(10)) + print("") + print("=============================================================================================================") + +##====deb查询文件所属二进制包====## +def get_deb_file_belongs_package(l_deb_file_name): + # this function for get deb pacgakes to which the file belongs + # input: + # @ l_deb_file_name + # return: + # @ l_deb_binary_name + # 真实路径(排除链接文件) + #l_deb_realpath = os.path.realpath(l_deb_file_name) + #l_file_belongs_deb = os.popen('dpkg -S %s 2>/dev/null | awk -F": " \'{print $1}\'' %(l_deb_realpath)) + #l_belongs_deb = l_file_belongs_deb.read().rsplit('\n')[0] + #l_file_belongs_deb.close() + # 查询到的路径(查询到的第一个) + 真实路径 + l_deb_realpath = os.path.realpath(l_deb_file_name) + l_file_belongs_status = subprocess.getstatusoutput('dpkg -S %s 2>/dev/null | awk -F": " \'{print $1}\'' %(l_deb_file_name)) + l_belongs_status = l_file_belongs_status[0] + l_belongs_info = l_file_belongs_status[1] + if (len(l_belongs_info) == 0): + l_real_belongs_status = subprocess.getstatusoutput('dpkg -S %s 2>/dev/null | awk -F": " \'{print $1}\'' %(l_deb_realpath)) + if (len(l_real_belongs_status[1]) != 0): + l_belongs_info = l_real_belongs_status[1] + #print("status:", l_belongs_status , "info:" , l_belongs_info) + #print("len(info):", len(l_belongs_info)) + + l_belongs_deb = l_belongs_info + + if (len(l_belongs_deb) == 0): + l_belongs_deb = "None" + + return l_belongs_deb + +##====rpm查询文件所属二进制包====## +def get_rpm_file_belongs_package(l_rpm_file_name): + # this function for get rpm pacgakes to which the file belongs + # input: + # @ l_deb_file_name + # return: + # @ l_rpm_binary_name + l_rpm_realpath = os.path.realpath(l_rpm_file_name) + l_file_belongs_rpm = subprocess.getstatusoutput('rpm -qf %s 2>/dev/null ' %(l_rpm_realpath)) + + if (l_file_belongs_rpm[0] != 0): + l_belongs_rpm = "None" + else: + l_belongs_rpm = l_file_belongs_rpm [1] + + return l_belongs_rpm + +##====deb对比版本大小====## +def get_debpkg_ver_contrast(l_local_ver, l_required_ver): + # --compare-version ver_local op ver_required + # op: lt le eq ne ge gt + # sn: < <= == != >= > + compare_result = os.system('dpkg --compare-versions %s ge %s' %(str(l_local_ver), str(l_required_ver))) + if(compare_result == 0): + return "compatible" + else: + return "incompatible" + +##====rpm对比版本大小====## +def get_rpmpkg_ver_contrast(l_local_ver, l_required_ver): + # compare ver_local op ver_required + compare_result = subprocess.getstatusoutput('rpmdev-vercmp %s %s 2>/dev/null ' %(str(l_local_ver), str(l_required_ver))) + if (compare_result[0] == 0): + return "compatible" + elif (compare_result[0] == 11): + return "compatible" + else: + return "incompatible" + + #if l_local_ver < l_required_ver: + # return "incompatible" + #else: + # return "compatible" + +##====比较共享库版本大小====## +def compare_library_version(l_local_ver, l_required_ver): + # this function compare soname for number + # input: + # @ l_local_ver + # @ l_required_ver + # return: + # @ ret: string: > + # @ ret: string: = + # @ ret: string: < + if l_local_ver == l_required_ver: + return "equal" + elif str(l_local_ver) < str(l_required_ver): + return "smaller" + else: + return "bigger" + +def get_all_binary_list (l_srcname): + if (g_inputpkgmngr == "yum-rpm"): + l_list_binary_name = get_rpmpkg_from_srcpkg(l_srcname) + else: + l_list_binary_name = get_debpkg_from_srcpkg(l_srcname) + return l_list_binary_name + +## 3.2 get deb package info +##====apt获取二进制包列表====## +def get_debpkg_from_srcpkg(l_deb_srcname): + # this function for get deb pacgakes from package name in current os + # input: + # @ l_deb_srcname + # return: + # @ l_list_debpkgs + l_list_debpkgs = [] + l_list_debpkgs.clear() + + l_package_name = os.popen('apt-cache showsrc %s 2>/dev/null | grep ^Package: | awk -F": " \'{print $2}\'' %(l_deb_srcname)) + l_pname = l_package_name.read().split("\n")[0] + l_package_name.close() + if(l_pname == l_deb_srcname): + l_debpkgs = os.popen('apt-cache showsrc %s 2>/dev/null | grep Binary | cut -d '"\:"' -f 2- | cut -d '"\ "' -f 2- ' %(l_deb_srcname)) + l_list_debpkgs = l_debpkgs.read().split("\n")[0].split(", ") + l_debpkgs.close() + + return l_list_debpkgs + +##====yum获取二进制包列表====## +def get_rpmpkg_from_srcpkg(l_rpm_srcname): + # this function for get rpm pacgakes from package name in current os + # input: + # @ l_rpm_srcname + # return: + # @ l_list_rpmpkgs + #l_rpmpkgs = os.popen('dnf info | grep -B 5 -E "%s.*.src.rpm" | grep "Name" | awk -F" " \'{ print $3 }\' | sort -n | uniq | sed \':label;N;s/\\n/ /;t label\'' %(l_rpm_srcname)) + #l_list_rpmpkgs = l_rpmpkgs.read().split("\n")[0].split(" ") + #l_rpmpkgs.close() + l_rpmpkgs = subprocess.getstatusoutput("dnf repoquery -q --queryformat \"%%{sourcerpm} %%{name}\"| grep -E \"^%s-[0-9]\" | awk '{print $2}'" %(l_rpm_srcname)) + l_list_rpmpkgs = l_rpmpkgs[1].split("\n") + #print (l_list_rpmpkgs) + + return l_list_rpmpkgs + +##====deb获取二进制包版本====## +def get_debpkg_local_version(l_deb_binary_name, l_req_version): + # this function for get deb pacgakes local verison + # input: + # @ l_deb_binary_name + # return: + # @ l_ver_local + l_ver = "-" + l_status = "-" + binary_info = {} + + l_file_deb_install_status = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $1}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_deb_install_status = l_file_deb_install_status.read().rstrip('\n') + l_file_deb_install_status.close() + + if(l_deb_install_status != "ii"): + l_status = "not installed" + l_ver = "-" + else: + l_file_ver_local = os.popen('dpkg -l %s 2>/dev/null| grep %s 2>/dev/null | awk -F" " \'{print $3}\' | head -n 1' %(l_deb_binary_name, l_deb_binary_name)) + l_ver = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + l_status = get_debpkg_ver_contrast(l_ver, l_req_version) + binary_info = {'status':l_status, 'version': l_ver} + + return binary_info + +##====rpm获取二进制包版本====## +def get_rpmpkg_local_version(l_rpm_binary_name, l_req_version): + # this function for get rpm pacgakes local verison + # input: + # @ l_rpm_binary_name + # return: + # @ l_ver_local + l_ver_local = "-" + l_status = "-" + binary_info = {} + + l_rpm_install_status = os.system('rpm -qi %s 2>/dev/null 1>/dev/null' %(l_rpm_binary_name)) + if (l_rpm_install_status == 0): + #l_file_ver_local = os.popen('rpm -qi %s 2>/dev/null | grep "Version\|Release" | awk -F" " \'{print $3}\' | sed \':label;N;s/\\n/-/;t label\'' %(l_rpm_binary_name)) + l_file_ver_local = os.popen('rpm -qa --queryformat="%%{VERSION}\n" %s 2>/dev/null ' %(l_rpm_binary_name)) + l_ver = l_file_ver_local.read().rstrip('\n') + l_file_ver_local.close() + l_status = get_rpmpkg_ver_contrast(l_ver, l_req_version) + else: + l_status = "not installed" + l_ver = "-" + binary_info = {'status':l_status, 'version': l_ver} + + return binary_info + + +libchecker_environment_init() +libchecker_checking_loop() +libchecker_over_jobs() diff --git a/Logs/.gitkeep b/Logs/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/OSAPIChecker.py b/OSAPIChecker.py new file mode 100755 index 0000000000000000000000000000000000000000..0664953330d0e8c5f4b1654ba1978a7e7e780902 --- /dev/null +++ b/OSAPIChecker.py @@ -0,0 +1,212 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +import argparse +import os +import json +import sys +import platform +import logging +import time +import getpass + +timestamp = int(time.time()) +#import tkinter # for graphical user interface + +# import libchecker # import libhecker module +# import cmdchecker # import cmdchecker module +# import fschecker # import fschecker module + +# 0. Global Init +parser = argparse.ArgumentParser(description="This Progermm is OSChecker", prog="OSChecker") + +# --channel: +# cmdchecker +# libchecker +# fschecker +parser.add_argument('-c', '--channel', action='store', type=str, help='Choice OSAPIChecker channels: libchecker,cmdchecker,fschecker,servicechecker,all', default="all") + +# --strategy: +# base (default) +# only-expand +# with-expand +parser.add_argument('-s', '--strategy', action='store', type=str, help='Choice OSAPIChecker strategy: basic,expansion,with-expand', default="basic") + +# --level: +# l1 +# l2 +# l3 +# l1l2 (default) +# l1l2l3 +parser.add_argument('-l', '--level', action='store', type=str, help='Choice OSAPIChecker level like: l1,l2,l3,l1l2,l1l2l3', default="l1l2") + +# --ostype: +# desktop +# service +# embed +# other +parser.add_argument('-t', '--ostype', action='store', type=str, help='OSType of current OS: desktop, server', default="desktop") + +# --pkgmngr: +# apt-deb +# yum-rpm +# other +parser.add_argument('-p', '--pkgmngr', action='store', type=str, help='Package Manager of current OS: apt-deb, yum-rpm', default="apt-deb") + +# --stdjson: +# +#parser.add_argument('-j', '--stdjson', action='store', type=str, help='Choice OSAPIChecker standard json templete file', required=True) + +parser.add_argument('-o', '--organize', action='store', type=str, help='Choice Organize', default="") + +parser.add_argument('-R', '--reports', action='store_true', help='Generate Reports') +# --ostype: +# desktop +# service +# embed + +args = parser.parse_args() + +l_file_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(timestamp)) +l_arch_name = os.popen("uname -m").read().rstrip("\n") + +# 1. Input Valid Check +def input_valid_check(): + print("|************************ 操作系统软件兼容性应用编程接口检查工具 ************************|") + +# 2. Check Environment Info +def gen_envinfo_json(): + l_organize = args.organize + l_osname = platform.system() + l_osversion = platform.version() + l_osmachine = platform.machine() + l_osarchitecture = platform.architecture() + l_osprocessor = platform.processor() + l_kernel = os.popen("uname -r").read().rstrip("\n") + l_compver = os.popen("gcc --version | awk 'NR==1'").read().rstrip("\n") + l_pythonver = os.popen("python3 --version").read().rstrip("\n") + l_meminfo = os.popen("free -g | grep Mem | awk '{print $2}'").read().rstrip("\n") + "G" + l_firmwareinfo = os.popen("dmidecode -s bios-version").read().rstrip("\n") + l_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) + l_disk = os.popen("lsblk -d -n | awk '{print $4}'").read().rstrip("\n") + + #l_envinfodict = {"测试对象" : {"系统名称" : l_osname, "版本" : l_osversion}, "送测单位" : l_organize , "系统环境" : {"内核版本" : l_kernel , "编译器版本" : l_compver , "Python版本" : l_pythonver} , "环境配置" : {"机器型号" : l_osmachine , "CPU指令集" : l_osmachine , "CPU型号" : l_osprocessor , "内存" : l_meminfo , "硬盘" : l_disk, "固件" : l_firmwareinfo} , "测试工具" : {"名称" : "OSAPIChecker", "版本" : "1.0.0" } , "测试时间" : l_time } + l_envinfodict = {"测试对象" : {"系统名称" : l_osname, "版本" : l_osversion}, "送测单位" : l_organize , "系统环境" : {"内核版本" : l_kernel , "编译器版本" : l_compver , "Python版本" : l_pythonver} , "环境配置" : {"CPU指令集" : l_osmachine , "CPU型号" : l_osprocessor , "内存" : l_meminfo , "硬盘" : l_disk, "固件" : l_firmwareinfo} , "测试工具" : {"名称" : "OSAPIChecker", "版本" : "1.0.0" } , "测试时间" : l_time } + + env_file_name = "Outputs/environments-info_%s.json" %(l_file_time) + #with open("Outputs/environments-info.json","w+") as fw: + with open(env_file_name,"w+") as fw: + json.dump(l_envinfodict,fw,ensure_ascii=False,indent=4) + +def checker_call_handler(channel): + if (channel == "libchecker"): + print("进入 LibChecker 处理程序 . . .") + s_str = args.strategy + l_str = args.level + os_str = args.ostype + pkg_str = args.pkgmngr + org_str = args.organize + + if ((s_str != "basic") and (s_str != "expansion") and (s_str != "with-expand")): + print ("Error: -s or --strategy 参数指定错误") + return 2 + + level_list=['l1', 'l2', 'l3', 'l1l2', 'l1l3', 'l2l3', 'l1l2l3', 'l2l1', 'l3l1', 'l3l2', 'l1l3l2', 'l2l1l3', 'l2l3l1', 'l3l1l2', 'l3l2l1'] + if l_str not in level_list: + print ("Error: -l or --level 参数指定错误") + return 2 + + if ((os_str != "desktop") and (os_str != "server")): + print ("Error: -t or --ostype 参数指定错误") + return 2 + + if ((pkg_str != "apt-deb") and (pkg_str != "yum-rpm")): + print ("Error: -p or --pkgmngr 参数指定错误") + return 2 + + os.system('python3 LibChecker/lib_checker.py --strategy=%s --level=%s --ostype=%s --pkgmngr=%s --organize=%s --timetmp=%s' %(s_str, l_str, os_str, pkg_str, org_str, l_file_time)) + + + elif (channel == "cmdchecker"): + print("进入 CmdChecker 处理程序 . . .") + + os.system('python3 CmdChecker/cmd_checker.py') + + elif (channel == "fschecker"): + print("进入 FsChecker 处理程序 . . .") + + os.system('python3 FsChecker/fs_checker.py') + + + elif (channel == "servicechecker"): + print("进入 ServiceChecker 处理程序 . . .") + + login_name = getpass.getuser() + if (login_name != "root"): + os.system('sudo python3 ServiceChecker/service_checker.py') + else: + os.system('python3 ServiceChecker/service_checker.py') + + + else: + print("Invalid Options, please input --channel=[cmdchecker|fschecker|libchecker]") + +def report_pdf_service(channel): + os.system('sudo reports/reboot-pdf.sh %s %s' %(channel, l_file_time)) + +def report_pdf_shell(channel): + os.system('reports/report-pdf.sh %s %s' %(channel, l_file_time)) + +# 3. PDF Report files +def generate_report(channel): + if ((channel == "all") or (channel == "servicechecker")): + print ("会重启(包含servicechecker模块)") + report_pdf_service(channel) + elif ((channel == "libchecker") or (channel == "cmdchecker") or (channel == "fschecker")): + print ("不重启,单独程序:", channel) + report_pdf_shell(channel) + + +def main_loop(): + gen_envinfo_json() + if (args.channel == "all"): + checker_call_handler("libchecker") + checker_call_handler("cmdchecker") + checker_call_handler("fschecker") + if(args.reports): + generate_report(args.channel) + else: + print ("NO Report Generation") + checker_call_handler("servicechecker") + else: + if ((args.channel != "libchecker") and (args.channel != "cmdchecker") and (args.channel != "fschecker") and (args.channel != "servicechecker")): + print ("Error: -c or --channel 参数指定错误") + return 2 + if (args.channel == "servicechecker"): + if(args.reports): + generate_report(args.channel) + else: + print ("NO Report Generation") + checker_call_handler(args.channel) + else: + checker_call_handler(args.channel) + if(args.reports): + generate_report(args.channel) + else: + print ("NO Report Generation") + +# 4. Draw Graphics +def draw_main_gui(): + top = tkinter.Tk() + top.mainloop() + + +# Main entry point +if __name__ == '__main__': + try: + input_valid_check() + main_loop() +# draw_main_gui() + except Exception as e: + print(e) + + diff --git a/Outputs/.gitkeep b/Outputs/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/README.md b/README.md index a873bb28fcc9f2f2e851bd4e264437171c2f6648..4b32768816030501acde4e579014902ab2306668 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,48 @@ Operating system API compliance check tool. #### 使用说明 -1. xxxx -2. xxxx -3. xxxx +0. OSAPIChecker +![alpha](Docs/01-GUIs/alpha-01.png) + +1. LibChecker + + 1. 基本用法 + + ```shell + # 1. /etc/apt/source.list 下打开 deb-src. + # 2. 执行 sudo apt update. + # 3. (OSAPIChecker)/$: ./OSAPIChecker.py --channel=libchecker [--strategy=base --level=l1l2] + # 4. LibChecker 执行的日志位于: (OSAPIChecker)/Logs 下, 输出结果存放于: (OSAPIChecker)/Outputs 下. + ``` + 2. 典型示例 + ```shell + # 1. (OSAPIChecker)/$: ./OSAPIChecker.py --channel=libchecker --strategy=base --level=l1l2 --ostype=desktop --pkgmngr=apt-deb --organize=统信软件 + # 2. (OSAPIChecker)/$: ./OSAPIChecker.py --channel=libchecker --strategy=base --level=l1l2 --ostype=server --pkgmngr=yum-rpm --organize=统信软件 + ``` + +2. FsChecker + + 1. 桌面版的使用 + + ```shell + # 对 U 系列 + # 1. /etc/apt/source.list 下打开 deb-src. + # 2. 执行 sudo apt update. + # 3. (OSAPIChecker)/$: ./OSAPIChecker.py --channel=fschecker + ``` + +3. CmdChecker + + 1. 桌面版的使用 + + ```shell + # 对 U 系列 + # 1. /etc/apt/source.list 下打开 deb-src. + # 2. 执行 sudo apt update. + # 3. (OSAPIChecker)/$: ./OSAPIChecker.py --channel=cmdchecker + ``` + + #### 参与贡献 diff --git "a/ServiceChecker/ServiceChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" "b/ServiceChecker/ServiceChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" new file mode 100644 index 0000000000000000000000000000000000000000..ada952a8bdd6b0975b5a91b87f4a39863abe6f2d --- /dev/null +++ "b/ServiceChecker/ServiceChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" @@ -0,0 +1,50 @@ +# ServiceChecker +Servicechecker 是一款检查操作系统管理软件systemd是否符合标准的快捷工具 +## 环境要求 +python 3.7+ +golang 1.13+ + + +## 使用方法 +1. 使用root用户执行该模块 + +2. 进入ServiceChecker主目录 +cd ServiceChecker + +3. 使用python3执行ServiceChecker检查工具 +python3 service_checker.py + +## 检查内容 +1. 检查系统systemd版本; +2. 目前自定义service、path、socket、timer、swap、target等单元配置文件,检查目标检测单元的起停及自定义配置功能实现; +3. 自定义开机自启动服务(enable)及开机禁止启动服务(disable),重启环境后验证其功能。 + + +## 结果说明 +1. 工具生成检测结果路径为:Outputs/service_result.json; +2. 目标单元检测通过为:'pass',检测失败为:'fail',检测结果示例如下: + + + { + "Path Unit": { --Path单元检测 + "Check result": "pass/fail" + }, + "Socket Unit": { --Socket单元检测 + "Check result": "pass/fail" + }, + "Timer Unit": { --Timer单元检测 + "Check result": "pass/fail" + }, + "Swap Unit": { --Swap单元检测 + "Check result": "pass/fail" + }, + "Target Unit": { --Target单元检测 + "Check result": "pass/fail" + }, + "Service enable": { --自定义开机自启动服务 + "Check result": "pass/fail" + }, + "Service disable": { --自定义开机禁止启动服务 + "Check result": "pass/fail" + } + } diff --git a/ServiceChecker/__init__.py b/ServiceChecker/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/ServiceChecker/__pycache__/__init__.cpython-37.pyc b/ServiceChecker/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e1eb5a8821aff3d589a0f98175521796fa94695 Binary files /dev/null and b/ServiceChecker/__pycache__/__init__.cpython-37.pyc differ diff --git a/ServiceChecker/config/lib.sh b/ServiceChecker/config/lib.sh new file mode 100644 index 0000000000000000000000000000000000000000..d8d5b1f6ad5e09cebbb3cc27ebdd6840f77a0a97 --- /dev/null +++ b/ServiceChecker/config/lib.sh @@ -0,0 +1,23 @@ +#!/bin/echo + +function log_info() +{ + echo -e "[`date +%Y-%m-%d\ %T`] INFO: $@" +} + +function log_warn() +{ + echo -e "\033[33m"[`date +%Y-%m-%d\ %T`] WARNING: $@" \033[0m" +} + +function log_error() +{ + echo -e "\033[31m"[`date +%Y-%m-%d\ %T`] ERROR: $@" \033[0m" + exit 1 +} + +function log_debug() +{ + [ "$DEBUG" == "yes" ] && echo "[`date +%Y-%m-%d\ %T`] DEBUG: $@" + echo -n "" +} \ No newline at end of file diff --git a/ServiceChecker/config/logger.conf b/ServiceChecker/config/logger.conf new file mode 100644 index 0000000000000000000000000000000000000000..958efab3e8f23f6aa239ba2e134cfbfd183d93c3 --- /dev/null +++ b/ServiceChecker/config/logger.conf @@ -0,0 +1,43 @@ +#logger.conf +############################################### +[loggers] +keys=root,OSAPIChecker,test + +[logger_root] +level=INFO +handlers=stdout +qualname=root + +[logger_OSAPIChecker] +level=DEBUG +handlers=rotate_file +qualname=OSAPIChecker + +[logger_test] +level=DEBUG +handlers=stdout +qualname=test +propagate=0 + +############################################### +[handlers] +keys=stdout,rotate_file + +[handler_stdout] +class=StreamHandler +level=INFO +formatter=common +args=(sys.stdout,) + +[handler_rotate_file] +class=handlers.RotatingFileHandler +level=DEBUG +formatter=common + +############################################### +[formatters] +keys=common + +[formatter_common] +format=[%(asctime)s] %(filename)16s[line:%(lineno)4d] %(levelname)7s: %(message)s +#datefmt=%a, %d %b %Y %H:%M:%S diff --git a/ServiceChecker/config/verify_result.json b/ServiceChecker/config/verify_result.json new file mode 100644 index 0000000000000000000000000000000000000000..6101329853902d3c9e8a36e6c6ec1c00f70b6a6d --- /dev/null +++ b/ServiceChecker/config/verify_result.json @@ -0,0 +1,34 @@ +{ + "start": { + "Path Unit": { + "test": "journalctl -u service_verify_path.service", + "str": "Deactivated successfully" + }, + "Socket Unit": { + "test": "journalctl -u service_verify_server.service", + "str": "Verify socket client" + }, + "Timer Unit": { + "test": "journalctl -u service_verify_timer.service", + "str": "Deactivated successfully" + }, + "Swap Unit": { + "test": "journalctl -u swapfile.swap", + "str": "Activated swap /swapfile" + }, + "Target Unit": { + "test": "runlevel", + "str": "3 1" + } + }, + "reboot": { + "Service enable": { + "test": "systemctl list-unit-files --type=service |grep verify_reboot.service", + "str": "enabled" + }, + "Service disable": { + "test": "systemctl list-unit-files --type=service |grep service_verify_disable.service", + "str": "disabled" + } + } +} \ No newline at end of file diff --git a/ServiceChecker/path/service_verify_path.path b/ServiceChecker/path/service_verify_path.path new file mode 100644 index 0000000000000000000000000000000000000000..a3d0af7f7b2bfa21085e6c729d5580a0e221bd16 --- /dev/null +++ b/ServiceChecker/path/service_verify_path.path @@ -0,0 +1,10 @@ +[Unit] +Description=Detect systemd Path + +[Path] +PathChanged=/opt/tem_monitor +MakeDirectory=yes +Unit=service_verify_path.service + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/ServiceChecker/path/service_verify_path.service b/ServiceChecker/path/service_verify_path.service new file mode 100644 index 0000000000000000000000000000000000000000..2ca75c6d67b32eca666f7184135aa11bb57160c7 --- /dev/null +++ b/ServiceChecker/path/service_verify_path.service @@ -0,0 +1,11 @@ +[Unit] +Description=Detect systemd Path service + +[Service] +Type=oneshot +ExecStart=/bin/bash -c "echo [`date`] /opt/tem_monitor 目录下文件发生了变化。 >> /opt/tem_monitor/test_path.log" +StandardOutput=syslog +StandardError=inherit + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/ServiceChecker/service/service_verify_disable.service b/ServiceChecker/service/service_verify_disable.service new file mode 100644 index 0000000000000000000000000000000000000000..61e8db544661902d37dca641c8d5548ef45a55f9 --- /dev/null +++ b/ServiceChecker/service/service_verify_disable.service @@ -0,0 +1,11 @@ +[Unit] +Description=verify disable function service + +[Service] +Type=oneshot +ExecStart=/bin/bash -c "echo [`date`] service_verify_disable.service 已执行。 >> /opt/tem_monitor/test_disable.log" +StandardOutput=syslog +StandardError=inherit + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/ServiceChecker/service_checker.py b/ServiceChecker/service_checker.py new file mode 100644 index 0000000000000000000000000000000000000000..200514d2c93285f0e6308f8643f3c06b47171fd6 --- /dev/null +++ b/ServiceChecker/service_checker.py @@ -0,0 +1,160 @@ +import json +import logging +import os +import re +import stat +import sys +import argparse + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from ServiceChecker.utils.shell import shell_cmd +from ServiceChecker.utils.logger import init_logger + +logger = logging.getLogger('OSAPIChecker') + + +def init_args(): + """ + init args + :return: + """ + parser = argparse.ArgumentParser() + + parser.add_argument("-m", "--model", type=str, dest="verify_model", default="", help="service verify model") + + return parser.parse_args() + + +class ServiceChecker(object): + + def __init__(self): + self.systemd_path = "/usr/lib/systemd/system" + self.dir_path = os.path.realpath(os.path.join(os.path.dirname(__file__))) + self.sh_path = os.path.join(self.dir_path, "service_verify.sh") + self.log_path = os.path.join(os.path.dirname(self.dir_path), 'Logs/service_checker.log') + self.reboot = "verify_reboot.service" + + @staticmethod + def verify_service(): + cmd = ["systemctl", "--version"] + ret, out, err = shell_cmd(cmd) + if not ret: + if err: + logger.debug(f"Systemd 版本检查信息失败!{err}") + if out: + logger.info(f"Systemd 版本检查信息为:\n{out.splitlines()[0]}") + + @staticmethod + def export_verify_result(path, result): + + with open(path, "w", encoding='utf-8') as f: + json.dump(result, f, indent=4) + + def service_register_check(self, model='start'): + result_path = os.path.join(os.path.dirname(self.dir_path), 'Outputs/service_result.json') + os.chmod(self.sh_path, stat.S_IXUSR) + + try: + os.system(f"/bin/bash {self.sh_path} {model} 2>&1 | tee -a {self.log_path}") + if model == "start": + result = {} + start_result = self.verify_all_item(model, result) + + self.export_verify_result(result_path, start_result) + + elif model == "reboot": + logger.info("service_checker 检测完成!") + with open(result_path, "r") as f: + start_result = json.load(f) + + final_result = self.verify_all_item(model, start_result) + self.export_verify_result(result_path, final_result) + + self.clear_environment('clear') + except Exception as err: + logger.error(f"检测过程出现错误:{err}") + + def clear_environment(self, clear): + """ + 关闭并删除测试单元自定义配置文件,恢复测试环境初始配置 + """ + try: + os.system(f"/bin/bash {self.sh_path} {clear}") + except Exception as err: + logger.error(f"删除reboot.service错误:{err}") + + def get_verify_result_config(self): + verify_path = os.path.join(self.dir_path, 'config/verify_result.json') + with open(verify_path, "r") as rf: + verify_config = json.load(rf) + + return verify_config + + def verify_all_item(self, model, result): + """ + 根据model来对所有systemd的待检测单元进行检测结果校验,输出汇总结果。 + @param model: 区分重启前(start)及重启后(reboot)检测的Unit. + @param result: 检测结果 + @return: 检测结果 + """ + v_config = self.get_verify_result_config() + verify_item = v_config.get(model) + result_str = "Check result" + for unit, test_config in verify_item.items(): + result.setdefault(unit, {}) + verify_shell = test_config.get('test') + verify_str = test_config.get('str') + ret, out, err = shell_cmd(verify_shell.split()) + if not ret and out: + unit_result = result.get(unit) + if model == 'reboot': + status_row = out.split('\n')[1] + status = status_row.split()[1] + if status == verify_str: + unit_result.setdefault(result_str, 'pass') + else: + unit_result.setdefault(result_str, 'fail') + else: + match = re.search(verify_str, out) + if match: + unit_result.setdefault(result_str, 'pass') + else: + unit_result.setdefault(result_str, 'fail') + else: + result.get(unit).setdefault(result_str, 'fail') + logger.debug(f"验证检测单元输出信息错误:{err}") + + return result + + def collect_runlevel_target(self): + run_level_cmd = ['find', self.systemd_path, '-name', "runlevel*.target"] + ret, out, err = shell_cmd(run_level_cmd) + if not ret: + if err: + logger.debug("systemd所有运行级别target文件查询失败") + if out: + run_level_contents = '' + for line in out.split('\n'): + if not line: + continue + target_file = os.readlink(line) + run_level_contents += f"{os.path.dirname(line)} -> {target_file}\n" + logger.info(f"查询运行级别传统runlevel与对应target信息如下:\n{run_level_contents.rstrip()}") + else: + logger.debug("没有查询到systemd运行级别信息") + + +if __name__ == "__main__": + init_logger() + + args = init_args() + service_checker = ServiceChecker() + # 首次调用该模块执行部分 + if not args.verify_model: + service_checker.verify_service() + service_checker.service_register_check() + # 系统重启后检测待测功能 + elif args.verify_model == "reboot": + service_checker.service_register_check(model=args.verify_model) + else: + logger.error("参数输入有误。") diff --git a/ServiceChecker/service_verify.sh b/ServiceChecker/service_verify.sh new file mode 100644 index 0000000000000000000000000000000000000000..2e93c30ae9ad2569f668c65a8cad3d92ee8f2ca9 --- /dev/null +++ b/ServiceChecker/service_verify.sh @@ -0,0 +1,336 @@ +#!/bin/bash + +dir_path=$( + cd "$(dirname "$0")" + pwd +) +. ${dir_path}/config/lib.sh +dir_systemd=/usr/lib/systemd/system +monitor_path=/opt/tem_monitor +apply_path=/usr/libexec/service_checker +path_file=${dir_path}/path +socket_file=${dir_path}/socket +timer_file=${dir_path}/timer +service_file=${dir_path}/service +swap_file=${dir_path}/swap + +function generator_enable_service() { +echo "[Unit] +Description=service verify reboot + +[Service] +Type=oneshot +ExecStart=python3 ${dir_path}/service_checker.py -m reboot +ExecStop=/bin/bash -c "echo Stop verify_reboot.servic" + +[Install] +WantedBy=multi-user.target" >${dir_systemd}/verify_reboot.service + +} + +function mv_register_file() { + log_info "开始注册所有systemd检测单元文件..." + + if [[ ! -d ${dir_systemd} ]]; then + log_error "Have not found systemd service work directory: ${dir_systemd},please check your system." + fi + + # 创建开机自启动reboot service单元配置文件 + generator_enable_service + + if [[ -d ${path_file} ]]; then + cp ${path_file}/service_verify_path.service ${dir_systemd} && + cp ${path_file}/service_verify_path.path ${dir_systemd} + else + log_warn "Service path file directory not exist, can not copy register file." + fi + + if [[ -d ${socket_file} ]]; then + cp ${socket_file}/service_verify_client.service ${dir_systemd} && + cp ${socket_file}/service_verify_server.service ${dir_systemd} && + cp ${socket_file}/service_verify_server.socket ${dir_systemd} + else + log_warn "Service socket file directory not exist, can not copy register file." + fi + + if [[ -d ${timer_file} ]]; then + cp ${timer_file}/service_verify_timer.service ${dir_systemd} && + cp ${timer_file}/service_verify_timer.timer ${dir_systemd} + else + log_warn "Service timer file directory not exist, can not copy register file." + fi + + if [[ -d ${service_file} ]]; then + cp ${service_file}/service_verify_disable.service ${dir_systemd} + else + log_warn "Service file directory not exist, can not copy register file." + fi + + if [[ -d ${swap_file} ]]; then + cp ${swap_file}/swapfile.swap ${dir_systemd} + else + log_warn "Service swap file directory not exist, can not copy register file." + fi + + go version >/dev/null 2>&1 + if [ $? -ne 0 ]; then + log_info "正在安装golang,请等待..." + sudo yum install -y golang >/dev/null 2>&1 + if [ $? -ne 0 ]; then + log_error "自动安装失败,请先安装golang。" + fi + log_info "golang 安装完成!" + fi + + cd ${socket_file} + # install go-systemd库 activation + export GO111MODULE=auto + # git clone https://github.com/coreos/go-systemd.git ~/go/src/github.com/coreos/go-systemd + go get github.com/coreos/go-systemd/activation >/dev/null 2>&1 + if [ $? -ne 0 ]; then + go env -w GOPROXY=https://goproxy.cn,direct + go env -w GOPRIVATE=git.mycompany.com,github.com/my/private + + go get github.com/coreos/go-systemd/activation >/dev/null 2>&1 + fi + + go build service_client.go + go build service_server.go + + if [[ ! -d ${apply_path} ]]; then + mkdir -p ${apply_path} + fi + cp service_client ${apply_path} + cp service_server ${apply_path} + + log_info "添加待测试systemd配置文件完成。" +} + +function verify_service() { + + systemctl enable verify_reboot.service + log_info "设置service_reboot服务开机自启动。" + + systemctl disable service_verify_disable.service + log_info "设置service_disable服务禁止开机自启动。" + + # 添加或修改配置文件后,需要重新加载 + systemctl daemon-reload + if [ $? -eq 0 ]; then + log_info "'systemctl daemon-reload' 重新加载配置文件成功。\n" + fi + + # 验证path服务功能 + verify_path +} + +function verify_path() { + # 启动目录监控服务 + log_info "***** 启动service_verify_path单元 *****" + systemctl start service_verify_path.path + if [ $? -ne 0 ]; then + log_warn "path 单元启动失败。" + fi + log_info "查看path单元服务状态:\n`systemctl status service_verify_path.path`" + if [[ ! -d $monitor_path ]]; then + mkdir $monitor_path + fi + cd $monitor_path + if [[ -f test_path.log ]]; then + rm -f test_path.log + fi + + touch tem_verify.txt + log_info "在${monitor_path}目录下添加一个临时文件." + + sleep 2 + if [[ -f test_path.log ]]; then + log_info "第一次查看path服务输出内容为:\n$(cat test_path.log)" + sleep 5 + rm -f tem_verify.txt + log_info "在${monitor_path}目录下删除该临时文件." + sleep 2 + log_info "第二次查看path服务输出内容为:\n$(cat test_path.log)" + else + log_warn "***** path单元功能验证失败 *****\n" + fi + log_info "***** path单元功能验证成功 *****\n" + + # 验证socket服务功能 + verify_socket +} + +function verify_socket() { + # 启动客户端服务,强依赖服务端服务 + log_info "***** 启动service_verify_socket单元 *****" + + systemctl start service_verify_client.service + if [ $? -ne 0 ]; then + log_warn "socket 客户端服务启动失败。" + fi + log_info "查看客户端服务状态:\n`systemctl status service_verify_client.service`" + + log_info "请等待socket单元测试应用运行..." + sleep 10 + log_info "显示客户端服务通信日志信息:\n$(journalctl -u service_verify_client.service -n 5)" + log_info "显示服务端服务通信日志信息:\n$(journalctl -u service_verify_server.service -n 3)" + + journalctl -u service_verify_client.service -n 5 | grep "Verify socket server" >/dev/null 2>&1 && + journalctl -u service_verify_server.service -n 3 | grep "Verify socket client" >/dev/null 2>&1 + if [ $? -eq 0 ]; then + log_info "***** socket单元功能验证成功 *****\n" + else + log_warn "***** socket单元功能验证失败 *****\n" + fi + + # 验证timer单元功能 + verify_timer +} + +function verify_timer() { + + # 启动timer定时单元 + log_info "***** 启动service_verify_timer单元 *****" + systemctl start service_verify_timer.timer + + if [ $? -eq 0 ]; then + log_info "service_verify_timer.timer单元启动成功,等待定时服务启动..." + else + log_warn "service_verify_timer.timer单元启动失败。" + fi + + log_info "查看timer单元服务状态:\n`systemctl status service_verify_timer.timer`" + + sleep 70 + if [[ -f ${monitor_path}/test_timer.log ]]; then + log_info "service_verify_timer.service服务启动输出为:\n$(cat ${monitor_path}/test_timer.log)" + log_info "***** timer单元功能验证成功 *****\n" + else + log_warn "***** timer单元功能验证失败 *****\n" + fi + + # 创建交换文件作为交换分区 + verify_swap + +} + + +function verify_swap() { + log_info "***** 验证swap单元 *****" + log_info "创建一个交换文件(swapfile):" + dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress + if [ $? -ne 0 ]; then + log_warn "创建交换文件失败。" + fi + # 防止交换文件全局可读 + chmod 600 /swapfile + + mkswap /swapfile + # 重启后会启动/swapfile交换分区 + # sed -i '$ a\# /etc/fstab\n/swapfile none swap defaults 0 0' /etc/fstab + + systemctl start swapfile.swap + if [ $? -eq 0 ]; then + log_info "成功启动swap单元。" + else + log_warn "启动swap单元失败" + fi + + log_info "查看swap单元服务状态:\n`systemctl status swapfile.swap`" + + log_info "查看交换空间使用详细信息:" + swapon --show + if [ $? -eq 0 ]; then + log_info "***** swap单元功能验证成功 *****\n" + else + log_warn "***** swap单元功能验证失败 *****\n" + fi + + # 测试及修改默认target + verify_target +} + +function verify_target() { + log_info "***** 开始验证target单元 *****" + log_info "查询所有运行级别传统runlevel与对应target信息如下:\n $(ls -al ${dir_systemd}/runlevel*.target | awk -F " " '{print $9 $10 $11}')" + + log_info "查看当前系统默认target为: $(systemctl get-default)" + + systemctl isolate rescue.target + if [ $? -eq 0 ]; then + sleep 2 + log_info "切换当前运行级别至单用户模式(rescue.target)成功,runlevel信息为:`runlevel`" + log_info "***** target单元功能验证成功 *****" + else + log_warn "切换至单用户级别失败" + log_warn "***** target单元功能验证失败 *****" + fi + + # 重启系统 + log_info "请等待3秒后将重启系统...\n" + sleep 3 + reboot +} + + + +function verify_reboot_service() { + log_info "***** 开机自启动服务单元(service_verify_reboot.service)执行成功!*****" + + log_info "查询service_disable服务设置开机启动状态为:`systemctl list-unit-files --type=service|grep service_verify_disable.service|awk -F " " '{print $2}'`" + if [ -f ${monitor_path}/test_disable.log ]; then + log_warn "***** 禁止开机自启动服务单元执行失败!*****" + else + log_info "***** 禁止开机自启动服务单元(service_verify_disable.service)执行成功!*****" + fi + +} + + +function clear_environment() { + + systemctl stop swapfile.swap + systemctl stop service_verify_server.socket + systemctl stop service_verify_server.service + systemctl stop service_verify_timer.timer + systemctl stop service_verify_path.path + systemctl stop service_verify_disable.service + + # 删除交换文件 + rm -f /swapfile + + rm -rf ${monitor_path} + rm -rf ${apply_path} + rm -rf /run/service_checker + rm -f ${socket_file}/service_client + rm -f ${socket_file}/service_server + find ${dir_systemd} -name "service_verify*" | xargs rm -f + rm -f ${dir_systemd}/swapfile.swap + + export GO111MODULE="" + + systemctl stop verify_reboot.service && + rm -f ${dir_systemd}/verify_reboot.service + +} + +# 执行入口 +case $1 in +start) + # 将所有注册文件移动到指定工作目录下 + mv_register_file + # 检测所有待测单元 + verify_service + ;; +reboot) + # 验证重启系统后部分功能 + verify_reboot_service + ;; +clear) + # 清理环境 + clear_environment + ;; +*) + echo 'unknown comand,try again start or reboot' + ;; +esac diff --git a/ServiceChecker/socket/service_client.go b/ServiceChecker/socket/service_client.go new file mode 100644 index 0000000000000000000000000000000000000000..442a6b3682de3ab567b6000a5edd835f61f84ade --- /dev/null +++ b/ServiceChecker/socket/service_client.go @@ -0,0 +1,49 @@ +package main + +import ( + "os" + "net" + "fmt" + "flag" + "bufio" + "strings" +) + +func main() { + fmt.Println("The client is starting..."); + var unix bool + flag.BoolVar(&unix, "unix", false, " unix 'address' as a path for service") + flag.Usage = func() { + fmt.Fprintf(flag.CommandLine.Output(), "Usage: %s [-unix] address\n", os.Args[0]) + flag.PrintDefaults() + os.Exit(0) + } + flag.Parse() + addr := flag.Arg(0) + if addr == "" { + flag.Usage() + } else { + fmt.Println("Connect server by:" + addr) + } + conn, e := net.Dial("unix", addr) + if e != nil { + fmt.Println("Client net.Dial error:" + e.Error()) + } + defer conn.Close() + read := bufio.NewReader(conn) + var content string = "Verify socket client" + for { + fmt.Print("Client input content: " + content + "\n") + conn.Write([]byte(content + "\n")) + returnData, e := read.ReadString('\n') + if e != nil { + fmt.Println("Client read string error:" + e.Error()) + break + } + fmt.Println("Client receive:" + returnData) + if strings.Contains(returnData, "server"){ + fmt.Println("The client is end!") + break + } + } +} diff --git a/ServiceChecker/socket/service_server.go b/ServiceChecker/socket/service_server.go new file mode 100644 index 0000000000000000000000000000000000000000..e744ee8f993f2d6c3eea820382beb55973c70983 --- /dev/null +++ b/ServiceChecker/socket/service_server.go @@ -0,0 +1,57 @@ +package main + +import ( + "fmt" + "bufio" + "net" + "strings" + "github.com/coreos/go-systemd/activation" +) + +func handle(conn net.Conn) { + var res_content string = "Verify socket server" + defer conn.Close() + for { + receives := bufio.NewReader(conn) + receiveData, e := receives.ReadString('\n') + if e != nil { + fmt.Printf("read from conn failed, error:%v\n", e) + break + } + fmt.Printf("Server receive: %v\n", receiveData) + _, e = conn.Write([]byte(res_content + "\n")) + if e != nil { + fmt.Printf("Write from conn failed, error:%v\n", e) + break + } + if strings.Contains(receiveData, "client") { + fmt.Println("service server end!") + break + } + } +} + +func main() { + fmt.Println("service server start...") + objListener, e := activation.ListenersWithNames() + if e != nil { + fmt.Println("Could not get listening sockets: ", e.Error()) + return + } + if listen, exists := objListener["service_verify_server.socket"]; exists { + var socketListener net.Listener + socketListener = listen[0] + defer socketListener.Close() + for { + conn, e := socketListener.Accept() + if e != nil { + fmt.Printf("receive failed, error:%v\n", e) + continue + } + go handle(conn) + } + } else { + fmt.Println("Service_verify_server.socket not exists.") + return + } +} diff --git a/ServiceChecker/socket/service_verify_client.service b/ServiceChecker/socket/service_verify_client.service new file mode 100644 index 0000000000000000000000000000000000000000..38656ca576c243e4908788087683f6fe7563b49d --- /dev/null +++ b/ServiceChecker/socket/service_verify_client.service @@ -0,0 +1,13 @@ +[Unit] +Description=Detect client service +Requires=service_verify_server.socket +After=multi-user.target service_verify_server.socket + +[Service] +Type=simple +PrivateTmp=true +ExecStart=/usr/libexec/service_checker/service_client -unix /run/service_checker/job.socket +Restart=on-failure + +[Install] +WantedBy=service_verify_server.service diff --git a/ServiceChecker/socket/service_verify_server.service b/ServiceChecker/socket/service_verify_server.service new file mode 100644 index 0000000000000000000000000000000000000000..126bc4f7ca7ac58de6e74a0c2f720ffab7d1796f --- /dev/null +++ b/ServiceChecker/socket/service_verify_server.service @@ -0,0 +1,12 @@ +[Unit] +Description=Detect server service +After=multi-user.target + +[Service] +Type=simple +ExecStart=/usr/libexec/service_checker/service_server +WorkingDirectory=/usr/libexec/service_checker/ +Restart=on-failure + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/ServiceChecker/socket/service_verify_server.socket b/ServiceChecker/socket/service_verify_server.socket new file mode 100644 index 0000000000000000000000000000000000000000..38f02cc050e018052c6bbca585042d8e496492e4 --- /dev/null +++ b/ServiceChecker/socket/service_verify_server.socket @@ -0,0 +1,10 @@ +[Unit] +Description=Detect server socket + +[Socket] +Service=service_verify_server.service +ListenStream=/run/service_checker/job.socket +Accept=no + +[Install] +WantedBy=sockets.target \ No newline at end of file diff --git a/ServiceChecker/swap/swapfile.swap b/ServiceChecker/swap/swapfile.swap new file mode 100644 index 0000000000000000000000000000000000000000..8d0eea4c0c47fa072413d6bf5953aee5043bb550 --- /dev/null +++ b/ServiceChecker/swap/swapfile.swap @@ -0,0 +1,7 @@ +[Unit] +Documentation=man:fstab(5) man:systemd-fstab-generator(8) +SourcePath=/etc/fstab + +[Swap] +What=/swapfile +TimeoutSec=2min \ No newline at end of file diff --git a/ServiceChecker/timer/service_verify_timer.service b/ServiceChecker/timer/service_verify_timer.service new file mode 100644 index 0000000000000000000000000000000000000000..809bb341e1dcc13423a39aa00158c304be7428d7 --- /dev/null +++ b/ServiceChecker/timer/service_verify_timer.service @@ -0,0 +1,5 @@ +[Unit] +Description=Detect systemd timer service + +[Service] +ExecStart=/bin/bash -c "echo [`date`] service_verify_timer has been executed. >> /opt/tem_monitor/test_timer.log" \ No newline at end of file diff --git a/ServiceChecker/timer/service_verify_timer.timer b/ServiceChecker/timer/service_verify_timer.timer new file mode 100644 index 0000000000000000000000000000000000000000..61397264ed4d8c8e8cdb476d98acfaff7e735413 --- /dev/null +++ b/ServiceChecker/timer/service_verify_timer.timer @@ -0,0 +1,9 @@ +[Unit] +Description=Detect systemd Timer + +[Timer] +OnActiveSec=5s +Unit=service_verify_timer.service + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/ServiceChecker/utils/__pycache__/logger.cpython-37.pyc b/ServiceChecker/utils/__pycache__/logger.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..174263b9af3b9b0a7c98b014c9f4f45b0a664170 Binary files /dev/null and b/ServiceChecker/utils/__pycache__/logger.cpython-37.pyc differ diff --git a/ServiceChecker/utils/__pycache__/shell.cpython-37.pyc b/ServiceChecker/utils/__pycache__/shell.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1357e928f011a25dc8b15bca604c9301be22cc05 Binary files /dev/null and b/ServiceChecker/utils/__pycache__/shell.cpython-37.pyc differ diff --git a/ServiceChecker/utils/logger.py b/ServiceChecker/utils/logger.py new file mode 100644 index 0000000000000000000000000000000000000000..79554ee5b13928dcac4c6010e97c6bd14768f9e7 --- /dev/null +++ b/ServiceChecker/utils/logger.py @@ -0,0 +1,15 @@ +import os +import logging.config + + +def init_logger(): + """ + 初始化logger + :return: + """ + own_path = os.path.realpath(os.path.dirname(os.path.dirname(__file__))) + conf_path = os.path.join(own_path, "config/logger.conf") + defaults = {} + defaults.setdefault('args', str((os.path.join(os.path.dirname(own_path), 'Logs/service_checker.log'), 'a+', + 50 * 1024 * 1024, 5))) + logging.config.fileConfig(conf_path, defaults=defaults) diff --git a/ServiceChecker/utils/shell.py b/ServiceChecker/utils/shell.py new file mode 100644 index 0000000000000000000000000000000000000000..95179179ece24b9c371ff726714793fd74071a14 --- /dev/null +++ b/ServiceChecker/utils/shell.py @@ -0,0 +1,16 @@ + +import subprocess + + +def shell_cmd(cmd_list, inmsg=None): + """ + :param cmd_list: + :param inmsg: + :return: + """ + p = subprocess.Popen(cmd_list, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if inmsg: + p.stdin.write(inmsg) + out, err = p.communicate() + + return p.returncode, out.decode("utf-8", errors="ignore"), err.decode("utf-8", errors="ignore") \ No newline at end of file diff --git a/reports/reboot-pdf.sh b/reports/reboot-pdf.sh new file mode 100755 index 0000000000000000000000000000000000000000..13d4faddcc0fbb627c2b16d7cc61621788d58832 --- /dev/null +++ b/reports/reboot-pdf.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +checker=$1 +time_tmp=$2 +if [ ${checker} = "" ];then + echo "ERROR" + return 2 +elif [ ${time_tmp} = "" ];then + echo "ERROR" + return 2 +fi + +real_p=$(realpath $0) +dir=${real_p%/*} +dir_systemd=/usr/lib/systemd/system + +function generator_enable_service() { +echo "[Unit] +Description=service verify reboot +After=verify_reboot.service + +[Service] +Type=oneshot +ExecStart=${dir}/report-pdf.sh ${checker} ${time_tmp} + +[Install] +WantedBy=multi-user.target" >${dir_systemd}/report_pdf.service + +} + +function config_sudo_passwd() { + sed -i '$ a\%sudo ALL=(ALL:ALL) NOPASSWD:ALL' /etc/sudoers + systemctl daemon-reload + systemctl enable report_pdf.service +} +generator_enable_service +config_sudo_passwd diff --git a/reports/report-pdf.sh b/reports/report-pdf.sh new file mode 100755 index 0000000000000000000000000000000000000000..ecb0d0c1755a708ca2bdd609ac2c8a5bfba6a1be --- /dev/null +++ b/reports/report-pdf.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +checker=$1 +time_tmp=$2 +if [ ${checker} = "" ];then + echo "ERROR" + return 2 +elif [ ${time_tmp} = "" ];then + echo "ERROR" + return 2 +fi + +dir=$(echo $(realpath $0 | awk -F'reports' '{print $1}')) +dir_systemd=/usr/lib/systemd/system + +s_arch=$(uname -m) +result_file="result_${checker}_${time_tmp}.pdf" +env_file="environments-info_${time_tmp}.json" +lib_file="libchecker-output_${s_arch}_${time_tmp}.json" +cmd_file="cmd_${time_tmp}.json" +fs_file="fs_${time_tmp}.json" +service_file="service_result.json" +cmd_line="" + +function generate_reports() { + echo "生成报告:result_${checker}_${time_tmp}.pdf" + if [ -f ${dir}/Outputs/${env_file} ];then + cmd_line="${cmd_line} -e $dir/Outputs/${env_file}" + fi + + if [ -f ${dir}/Outputs/${lib_file} ];then + cmd_line="${cmd_line} -l $dir/Outputs/${lib_file}" + fi + + if [ -f ${dir}/Outputs/${cmd_file} ];then + cmd_line="${cmd_line} -c $dir/Outputs/${cmd_file}" + fi + + if [ -f ${dir}/Outputs/${fs_file} ];then + cmd_line="${cmd_line} -f $dir/Outputs/${fs_file}" + fi + + if [ "${checker}" == "all" ] || [ "${checker}" == "servicechecker" ];then + if [ -f ${dir}/Outputs/${service_file} ];then + cmd_line="${cmd_line} -s $dir/Outputs/${service_file}" + fi + fi + if [ "${cmd_line}" == "" ];then + echo "not found ${checker} output file" >> $dir/Logs/pdf_${time_tmp}.log 2>&1 + else + cd $dir/GenReport + echo "Generate reports" >> $dir/Logs/pdf_${time_tmp}.log 2>&1 + ./pdf.py -r $dir/Outputs/${result_file} ${cmd_line} >> $dir/Logs/pdf_${time_tmp}.log 2>&1 + fi +} + +function recovery_configure (){ + sed -i '/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/d' /etc/sudoers + systemctl disable report_pdf.service + rm -f ${dir_systemd}/report_pdf.service + systemctl daemon-reload + systemctl stop report_pdf.service +} + +if [ ${checker} == "libchecker" ] || [ ${checker} == "cmdchecker" ] || [ ${checker} == "fschecker" ] ;then + generate_reports +elif [ ${checker} == "servicechecker" ] || [ ${checker} == "all" ];then + while [ -e ${dir_systemd}/verify_reboot.service ] + do + str_status=$(systemctl status verify_reboot.service | grep Active | awk '{print $2}') + if [ "${str_status}" == "failed" ] || [ "${str_status}" == "inactive" ];then + break + fi + sleep 5 + done + generate_reports + recovery_configure +fi