#!/usr/bin/env python

import argparse
import json
import os
import shlex
import subprocess
import sys

def main(argv):
    parser = argparse.ArgumentParser(description="Inventory for local RPM installed host")
    parser.add_argument("--list", action="store_true", help="Verbose output")
    parser.add_argument('--host', help="Get host variables")
    parser.add_argument("subjects", nargs="*", default=shlex.split(os.environ.get("TEST_SUBJECTS", "")))
    opts = parser.parse_args()

    try:
        if opts.host:
            data = host(opts.host)
        else:
            data = list(opts.subjects)
        sys.stdout.write(json.dumps(data, indent=4, separators=(',', ': ')))
    except RuntimeError, ex:
        sys.stderr.write("{0}: {1}\n".format(os.path.basename(sys.argv[0]), str(ex)))
        return 1

    return 0

def list(subjects):
    rpms = [ ]
    hosts = [ ]
    variables = { }
    for subject in subjects:
        if subject.endswith(".rpm"):
            rpms.append(subject)
    if rpms:
        vars = host(rpms)
        if vars:
            hosts.append("rpms")
            variables["rpms"] = vars
    return { "subjects": { "hosts": hosts, "vars": { } }, "localhost": { "hosts": hosts, "vars": { } }, "_meta": { "hostvars": variables } }

def host(rpms):
    null = open(os.devnull, 'w')

    # The variables
    variables = {
        "ansible_connection": "local"
    }

    try:
        tty = os.open("/dev/tty", os.O_WRONLY)
        os.dup2(tty, 2)
    except OSError:
        tty = None
        pass

    install = [ "/usr/bin/yum", "-y", "install" ] + rpms

    try:
        subprocess.check_call(install, stdout=sys.stderr.fileno())
    except subprocess.CalledProcessError:
        raise RuntimeError("could not install rpms: {0}".format(rpms))

    return variables

if __name__ == '__main__':
    sys.exit(main(sys.argv))
