#!/usr/bin/python2

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 = gethost(opts.host)
        else:
            data = getlist(opts.subjects)
        sys.stdout.write(json.dumps(data, indent=4, separators=(',', ': ')))
    except RuntimeError as ex:
        sys.stderr.write("{0}: {1}\n".format(os.path.basename(sys.argv[0]), str(ex)))
        return 1

    return 0


def getlist(subjects):
    repos = []
    rpms = []
    hosts = []
    variables = {}

    for subject in subjects:
        if subject.endswith(".rpm"):
            rpms.append(subject)
        elif isrepo(subject):
            repos.append(subject)

    if repos or rpms:
        vars = gethost(repos, rpms)
        if vars:
            hosts.append("rpms")
            variables["rpms"] = vars

    return { "subjects": { "hosts": hosts, "vars": { } }, "localhost": { "hosts": hosts, "vars": { } }, "_meta": { "hostvars": variables } }


def gethost(repos, 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

    # enable any provided repos first so RPMs can pull dependencies from them if needed
    for repo in repos:
        addrepo = ["/usr/bin/yum", "config-manager", "--add-repo", repo]
        try:
            subprocess.check_call(addrepo, stdout=sys.stderr.fileno())
        except subprocess.CalledProcessError:
            raise RuntimeError("could not add repo: {0}".format(repo))

    if rpms:
        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


def isrepo(subject):
    return os.path.isfile(os.path.join(subject, "repodata", "repomd.xml"))


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