#!/usr/bin/python
from MetaConf.optionparser import *
from MetaConf import *
import logging
import sys, os
import pwd

AUTHOR  = "Gustavo Niemeyer <niemeyer@conectiva.com>"
VERSION = "1.3.1"

def parse_options():
    parser = OptionParser("%prog [OPTIONS] <confname> ... "
                          "[<parm>=<value> ...]",
                          version="%prog "+VERSION)
    parser.add_option("-f", "--file", dest="conffile", metavar="FILE",
                      help="configuration file (default is "
                           "~/.metaconf/config or /etc/metaconf)")
    parser.add_option("-l", "--list", dest="listmode", action="store_true",
                      help="list available configurations")
    parser.add_option("--dryrun", dest="dryrun", action="store_true",
                      help="do not commit changes to the system")
    parser.add_option("--log", dest="loglevel", metavar="LEVEL",
                      help="set logging level to LEVEL (debug, info, "
                           "warning, error)", default="warning")
    opts, args = parser.parse_args()
    opts.args = [x for x in args if not '=' in x]
    opts.parms = {}
    for arg in [x for x in args if x not in opts.args]:
        key, value = arg.split('=', 1)
        opts.parms[key] = value
    return opts

def genlist(element):
    for child in element:
        if (child.tag.lower() == "config" and child.get("name") and
            child.get("list") not in ("false", "0")):
            print child.get("name")
        elif child.tag.lower() == "metaconf":
            genlist(child)

def main():
    opts = parse_options()
    logger.setLevel(logging.getLevelName(opts.loglevel.upper()))
    logger.info("starting metaconf")
    # Get the right $HOME, even when using sudo.
    if os.getuid() == 0:
        os.environ["HOME"] = pwd.getpwuid(0)[5]
    try:
        root = getroot(opts)
        if opts.listmode:
            genlist(root)
        elif not execute([], root, opts):
            sys.exit(1)
    except Error, e:
        logger.error(str(e))
        logger.info("finishing metaconf with error")
        sys.exit(1)
    logger.info("finishing metaconf")

if __name__ == "__main__":
    main()

# vim:et:ts=4:sw=4
