#!/usr/bin/python

import sys
import os
import re

class Module:
    cfg_re = re.compile('^(?P<modname>\w+).(?P<suffix>conf|config)(?:\.off)?$')
    def __init__(self, name, suffix, status):
        self.__name = name
        self.__suffix = suffix
        self.__status = status
    def on(self):
        if self.status == 'on':
            return
        os.rename(self.fname(), self.fname('on'))
        self.status == 'on'
    def off(self):
        if self.status == 'off':
            return
        os.rename(self.fname(), self.fname('off'))
        self.status == 'off'
    def fname(self, status=None):
        status = status or self.__status
        stsuffix = '.off' if status == 'off' else ''
        fname = '%s.%s%s' % (self.__name, self.__suffix, stsuffix)
        return os.path.join(Modules.path, fname)
    def name(self):
        return self.__name
    def status(self):
        return self.__status
    @classmethod
    def split(cls, fname):
        m = cls.cfg_re.match(fname)
        if not m: return
        status = 'off' if fname.endswith('.off') else 'on'
        return m.group('modname'), m.group('suffix'), status

class Modules:
    path = '/etc/Tartarus/modules'
    def __init__(self):
        self.__modules = {}
        for cfg in os.listdir(self.path):
            info = Module.split(cfg)
            if info:
                m = Module(*info)
                self.__modules[m.name()] = m
    def list(self):
        return self.__modules.itervalues()
    def on(self, modname):
        if modname not in self.__modules:
            raise RuntimeError('Module "%s" is not found' % modname)
        self.__modules[modname].on()
    def off(self, modname):
        if modname not in self.__modules:
            raise RuntimeError('Module "%s" is not found' % modname)
        self.__modules[modname].off()

usage = ('Usage: %(progname)s <service> on|off\n'
         '       %(progname)s list\n') % {'progname': sys.argv[0]}

help =  ('In first form set service on or off.\n'
         'In second form show all available services and it\'s status')

if '--help' in sys.argv or '-h' in sys.argv or len(sys.argv) == 1:
    print usage
    print help
    sys.exit(0)

def main():
    if len(sys.argv) == 2 and sys.argv[1] == 'list':
        for m in Modules().list():
            print '%s %s' % (m.name().ljust(20), m.status())
    elif len(sys.argv) == 3 and sys.argv[2] == 'on':
        Modules().on(sys.argv[1])
    elif len(sys.argv) == 3 and sys.argv[2] == 'off':
        Modules().off(sys.argv[1])

try:
    main()
except:
    e = sys.exc_info()[1]
    print str(e)
    sys.exit(1)

