| #!/usr/bin/python3 | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| import subprocess | |
| depLibraries = [ | |
| "bzip2", | |
| "gzip", | |
| "unzip", | |
| "openssh-clients", | |
| "nfs-utils", | |
| "wget", | |
| "ws-commons-util", | |
| "commons-dbcp", | |
| "commons-collections", | |
| "commons-httpclient", | |
| "jpackage-utils", | |
| "mysql-connector-python3", | |
| "python-paramiko", | |
| "ipmitool", | |
| "commons-httpclient", | |
| "commons-collections", | |
| "commons-pool", | |
| "commons-dbcp", | |
| "jakarta-commons-logging", | |
| "java-*-openjdk", | |
| ] | |
| def runCmd(cmds): | |
| process = subprocess.Popen( | |
| " ".join(cmds), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE | |
| ) | |
| stdout, stderr = process.communicate() | |
| if process.returncode != 0: | |
| raise Exception(stderr.decode("utf-8")) | |
| return stdout.decode("utf-8") | |
| def getDependentLibraryInfo(): | |
| def getVersion(res, pkgname): | |
| start = False | |
| for l in res.split("\n"): | |
| if "Installed Packages" in l: | |
| start = True | |
| continue | |
| if not start: | |
| continue | |
| (key, value) = l.split(":", 2) | |
| key = key.strip() | |
| value = value.strip() | |
| if key == "Name" and "*" not in pkgname and pkgname not in value: | |
| print( | |
| "Required package name %s doesn't equal to package %s installed" | |
| % (pkgname, value) | |
| ) | |
| return "UNKNOWN" | |
| if "Version" in key: | |
| return value | |
| if "Description" in key: | |
| return "UNKNOWN" # we hit the end | |
| return "UNKNOWN" | |
| libraryMap = {} | |
| for l in depLibraries: | |
| cmd = ["yum", "info", '"%s"' % l] | |
| try: | |
| result = runCmd(cmd) | |
| version = getVersion(result, l) | |
| libraryMap[l] = version | |
| except Exception as e: | |
| print("When finding %s, encounters %s" % (l, e)) | |
| continue | |
| return libraryMap | |
| def arrangeOutPut(libraryMap): | |
| msg = [ | |
| "\n\n\nBelow is the checking list of library version that CloudStack depends on:" | |
| ] | |
| for l in depLibraries: | |
| if l in libraryMap: | |
| entry = "%-40s: %s" % (l, libraryMap[l]) | |
| else: | |
| entry = "%-40s: %s" % (l, "UNKNOWN") | |
| msg.append(entry) | |
| print("\n".join(msg)) | |
| if __name__ == "__main__": | |
| pythonDepLibraries = ["python", "python3"] | |
| relver = runCmd(["rpm", "-q", "centos-release"]) | |
| if ( | |
| relver.startswith("centos-release-") | |
| and int(relver[len("centos-release-")]) >= 8 | |
| ): | |
| pythonDepLibraries = ["python2", "python36"] | |
| depLibraries = pythonDepLibraries + depLibraries | |
| arrangeOutPut(getDependentLibraryInfo()) |