diff -r 000000000000 -r bb0aa2102206 VirtualMailManager/Config.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VirtualMailManager/Config.py Sun Jan 06 18:22:10 2008 +0000 @@ -0,0 +1,154 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# opyright 2007-2008 VEB IT +# See COPYING for distribution information. +# $Id$ + +"""Configurtion class for read, modify and write the +configuration from Virtual Mail Manager. + +""" + +__author__ = 'Pascal Volk ' +__version__ = 'rev '+'$Rev$'.split()[1] +__date__ = '$Date$'.split()[1] + +import sys +from shutil import copy2 +from ConfigParser import ConfigParser + +from Exceptions import VMMConfigException +import constants.EXIT as EXIT + +class VMMConfig(ConfigParser): + """This class is for configure the mailadmin. + + You can specify settings for the database connection + and maildirectories. + + """ + missingOptCtr = -1 + + def __init__(self, filename): + """Creates a new VMMConfig instance + + Keyword arguments: + filename -- name of the configuration file + """ + ConfigParser.__init__(self) + self.__cfgFileName = filename + self.__cfgFile = None + self.__VMMsections = ['database', 'maildir', 'domdir', 'bin', 'misc', + 'config'] + self.__changes = False + self.__missingSect = [] + self.__dbopts = [ + ['host', 'localhot'], + ['user', 'vmm'], + ['pass', 'your secret password'], + ['name', 'mailsys'] + ] + self.__mdopts = [ + ['base', '/home/mail'], + ['folder', 'Maildir'], + ['mode', 448], + ['diskusage', 'false'], + ['delete', 'false'] + ] + self.__domdopts = [ + ['mode', 504], + ['delete', 'false'] + ] + self.__binopts = [ + ['dovecotpw', '/usr/sbin/dovecotpw'], + ['du', '/usr/bin/du'] + ] + self.__miscopts = [ + ['passwdscheme', 'CRAM-MD5'], + ['gid_mail', 8], + ['forcedel', 'false'] + ] + + def load(self): + """Loads the configuration, r/o""" + try: + self.__cfgFile = file(self.__cfgFileName, 'r') + except: + raise + self.readfp(self.__cfgFile) + self.__cfgFile.close() + + def getsections(self): + """Return a list with all configurable sections.""" + return self.__VMMsections[:-1] + + def configure(self, sections): + """Interactive method for configuring all options in the given section + + Keyword arguments: + sections -- list of strings + """ + if not isinstance(sections, list): + raise TypeError("Argument 'sections' is not a list.") + # if [config] done = false (default at 1st run), + # then set changes true + try: + if not self.getboolean('config', 'done'): + self.__changes = True + except ValueError: + self.set('config', 'done', 'False') + self.__changes = True + for s in sections: + if s == 'config': + pass + else: + print '* Config section: %s' % s + for opt, val in self.items(s): + newval = raw_input('Enter new value for %s [%s]: ' %(opt, val)) + if newval and newval != val: + self.set(s, opt, newval) + self.__changes = True + print + if self.__changes: + self.__saveChanges() + + def __saveChanges(self): + """Writes changes to the configuration file.""" + self.set('config', 'done', 'true') + copy2(self.__cfgFileName, self.__cfgFileName+'.bak') + self.__cfgFile = file(self.__cfgFileName, 'w') + self.write(self.__cfgFile) + self.__cfgFile.close() + + def __chkSections(self): + """Checks if all configuration sections are existing.""" + retval = False + for s in self.__VMMsections: + if not self.has_section(s): + self.__missingSect.append(s) + else: + retval = self.__chkOptions(s) + return retval + + def __chkOptions(self, section): + """Checks if all configuration options in section are existing. + + Keyword arguments: + section -- the section to be checked + """ + retval = True + VMMConfig.missingOptCtr += 1 + self.__missingOpt.append([]) + if section == 'database': + opts = self.__dbopts + elif section == 'maildir': + opts = self.__mdopts + elif section == 'bin': + opts = self.__binopts + elif section == 'misc': + opts = self.__miscopts + for o, v in opts: + if not self.has_option(section, o): + self.__missingOpt[VMMConfig.missingOptCtr].append(o) + retval = False + return retval