#!/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())
