#! /usr/bin/env python
# vim: fdm=marker

if __name__ != "__main__":
    exit(0)

import sys, os

def usage():
    str ="usage: mkve-config get <name> <section> <key>\n"
    str+="       mkve-config set <name> <section> <key> <value>\n"
    sys.stderr.write(str)
    exit(1)

def die(s):
    sys.stderr.write("mkve-config: error: %s\n" %s)
    exit(1)

class InfoFile: # {{{

    class Error(Exception): pass

    def __init__(self, name):
        self.__name = name
        self.__sections = {}

        try:
            if os.access(name, os.F_OK): self.__read()
        except IOError, e:
            raise InfoFile.Error("can't open source file %s: %s" %(name, e))

    def get(self, section, key):
        if not self.__sections.has_key(section):
            raise InfoFile.Error("no such section: %s" %section)
        if not self.__sections[section].has_key(key):
            raise InfoFile.Error("section '%s' isn't containing key '%s'" %(section, key))
        return self.__sections[section][key]

    def set(self, section, key, value):
        if not self.__sections.has_key(section):
            self.__sections[section] = {}
        self.__sections[section][key] = value

    def sync(self, name=''):
        name = name or self.__name
        s = ''
        for sect_name in self.__sections.keys():
            s += "[%s]\n" %(sect_name)

            sect = self.__sections[sect_name]
            for k in sect.keys():
                s += '%s=%s\n' %(k, sect[k])
        try:
            f = file(name, "w")
            f.write(s)
            f.close()
        except IOError, e:
            raise InfoFile.Error("can't write file: %s" %e)
        except Exception, e:
            raise InfoFile.Error("self.sync failed: %s" %e)

    def __read(self):
        "try to parse a config file if it exists"

        f = file(self.__name)
        lines = [l.strip() for l in f.readlines()]
        lines = [l for l in lines if l and l[0] != '#']
        f.close()

        for l in lines:
            if l[0]=='[' and l[-1]==']':
                new_section = l[1:-1]
                if self.__sections.has_key(new_section):
                    raise InfoFile.Error("section %s already defined" %new_section)
                self.__sections[new_section] = {}
                self.__current_section = self.__sections[new_section]
            elif l.count('='):
                key, value = l.split('=', 1)
                self.__current_section[key] = value
# }}}

try:
    cmd=sys.argv[1]
    if   cmd=="get" and len(sys.argv) == 5:
        name, section, key = sys.argv[2:]
    elif cmd=="set" and len(sys.argv) == 6:
        name, section, key, value = sys.argv[2:]
    else: usage()

    info = InfoFile(name)
    if cmd == "get":
        value = info.get(section, key)
        print value
    elif cmd == "set":
        info.set(section, key, value)
        info.sync()
except Exception, e:
    die(e)
