VirtualMailManager/Config.py
changeset 0 bb0aa2102206
child 2 9b39f828aa8a
--- /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 <p.volk@veb-it.de>'
+__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