#!/usr/bin/python
# 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 = ['python', 'bzip2', 'gzip', 'unzip', 'openssh-clients', 'nfs-utils', 'wget', 'tomcat6', 'ws-commons-util', 'commons-dbcp',
                'commons-collections', 'commons-httpclient', 'jpackage-utils', 'MySQL-python', '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)
    return stdout


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, 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 libraryMap.has_key(l):
            entry = "%-40s:    %s"%(l, libraryMap[l])
        else:
            entry = "%-40s:    %s"%(l, 'UNKNOWN')
        msg.append(entry)
    print '\n'.join(msg)
        
if __name__ == '__main__':
    arrangeOutPut(getDependentLibraryInfo())
