#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4

import jsonrpc
import sys
import ConfigParser

config_path='/etc/dassadmin/ldapsync.conf'


def opsi_connect(url):
    proxy = jsonrpc.ServiceProxy(url)
    return proxy


def opsi_products_on_client(proxy, client):
    h = proxy.productOnClient_getHashes( [], { "clientId": client })
    return h

def opsi_product_on_depot(proxy, product, depot):
    h = proxy.productOnDepot_getHashes( [], { "depotId": depot, "productId": product })
    if h is None or len(h) == 0:
        return None
    return h[0]


def compare_versions(depot_version, depot_package_version, installed_version, package_version):
    return depot_version == installed_version and depot_package_version == package_version


if __name__ == "__main__":
    short = False
    check = False

    if len(sys.argv)<3:
        print "Usage: %s [-qQ] <client name> <depot_name>" % sys.argv[0]
        sys.exit(3)

    if sys.argv[1] == "-q":
        short = True
        sys.argv.pop(1)
    if sys.argv[1] == "-Q":
        short = True
        check = True
        sys.argv.pop(1)

    client_name = sys.argv[1]
    depot_name = sys.argv[2]
    config = ConfigParser.ConfigParser()
    config.read(config_path)
    opsi_url = config.get("opsi", "rpcUrl")

    proxy = opsi_connect(opsi_url)
 
    products = opsi_products_on_client(proxy, client_name)

    mouldy_packages = []

    for p in products:
        product_id = p['productId']
        installed_version = None
        package_version = None
        try:
            installed_version = p['productVersion']
            package_version = p['packageVersion']
        except:
            pass
        depot_product = opsi_product_on_depot(proxy,product_id,depot_name)
        depot_version = depot_product['productVersion']
        depot_package_version = depot_product['packageVersion']

        needs_update = not compare_versions(depot_version, depot_package_version, installed_version, package_version)
        if needs_update:
            update_flag = '*'
            mouldy_packages.append(product_id)
        else:
            update_flag = ''

        # print product_id, "installed:",installed_version, package_version, "depot:",depot_version,depot_package_version
        if not short:
            print "%1s %-20s    installed: %16s %8s    depot: %16s %8s" % (update_flag, product_id, installed_version, package_version, depot_version,depot_package_version)
    if check:
        if len(mouldy_packages) > 0:
            print "WARNING: not up-to-date", ",".join(mouldy_packages)
            sys.exit(1)
        else:
            print "OK"
 
    elif len(mouldy_packages) > 0:
        if not short:
            print
        print len(mouldy_packages),"products are not up-to-date"
        sys.exit(1)
