diff -r c0e1fb1b0145 -r a4aead244f75 VirtualMailManager/Config.py --- a/VirtualMailManager/Config.py Mon Nov 07 03:22:15 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,187 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2007 - 2010, Pascal Volk -# See COPYING for distribution information. - -"""Configuration class for read, modify and write the -configuration from Virtual Mail Manager. - -""" - -from shutil import copy2 -from ConfigParser import ConfigParser, MissingSectionHeaderError, ParsingError -from cStringIO import StringIO - -from __main__ import ENCODING, ERR, w_std -from Exceptions import VMMConfigException - -class Config(ConfigParser): - """This class is for reading and modifying vmm's configuration file.""" - - def __init__(self, filename): - """Creates a new Config instance - - Arguments: - filename -- path to the configuration file - """ - ConfigParser.__init__(self) - self.__cfgFileName = filename - self.__cfgFile = None - self.__VMMsections = ['database', 'maildir', 'services', 'domdir', - 'bin', 'misc', 'config'] - self.__changes = False - self.__missing = {} - self.__dbopts = [ - ['host', 'localhot'], - ['user', 'vmm'], - ['pass', 'your secret password'], - ['name', 'mailsys'] - ] - self.__mdopts = [ - ['name', 'Maildir'], - ['folders', 'Drafts:Sent:Templates:Trash'], - ['mode', 448], - ['diskusage', 'false'], - ['delete', 'false'] - ] - self.__serviceopts = [ - ['smtp', 'true'], - ['pop3', 'true'], - ['imap', 'true'], - ['sieve', 'true'] - ] - self.__domdopts = [ - ['base', '/srv/mail'], - ['mode', 504], - ['delete', 'false'] - ] - self.__binopts = [ - ['dovecotpw', '/usr/sbin/dovecotpw'], - ['du', '/usr/bin/du'], - ['postconf', '/usr/sbin/postconf'] - ] - self.__miscopts = [ - ['passwdscheme', 'PLAIN'], - ['gid_mail', 8], - ['forcedel', 'false'], - ['transport', 'dovecot:'], - ['dovecotvers', '11'] - ] - - def load(self): - """Loads the configuration, read only. - - Raises a VMMConfigException if the configuration syntax is invalid. - """ - try: - self.__cfgFile = file(self.__cfgFileName, 'r') - self.readfp(self.__cfgFile) - except (MissingSectionHeaderError, ParsingError), e: - self.__cfgFile.close() - raise VMMConfigException(str(e), ERR.CONF_ERROR) - self.__cfgFile.close() - - def check(self): - """Performs a configuration check. - - Raises a VMMConfigException if the check fails. - """ - if not self.__chkSections(): - errmsg = StringIO() - errmsg.write(_("Using configuration file: %s\n") %\ - self.__cfgFileName) - for k,v in self.__missing.items(): - if v[0] is True: - errmsg.write(_(u"missing section: %s\n") % k) - else: - errmsg.write(_(u"missing options in section %s:\n") % k) - for o in v: - errmsg.write(" * %s\n" % o) - raise VMMConfigException(errmsg.getvalue(), ERR.CONF_ERROR) - - def getsections(self): - """Return a list with all configurable sections.""" - return self.__VMMsections[:-1] - - def get(self, section, option, raw=False, vars=None): - return unicode(ConfigParser.get(self, section, option, raw, vars), - ENCODING, 'replace') - - def configure(self, sections): - """Interactive method for configuring all options in the given sections - - Arguments: - sections -- list of strings with section names - """ - 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 - w_std(_(u'Using configuration file: %s\n') % self.__cfgFileName) - for s in sections: - if s != 'config': - w_std(_(u'* Config section: ā€œ%sā€') % s ) - for opt, val in self.items(s): - newval = raw_input( - _('Enter new value for option %(opt)s [%(val)s]: ').encode( - ENCODING, 'replace') % {'opt': opt, 'val': 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.""" - errors = False - for s in self.__VMMsections: - if not self.has_section(s): - self.__missing[s] = [True] - errors = True - elif not self.__chkOptions(s): - errors = True - return not errors - - def __chkOptions(self, section): - """Checks if all configuration options in section are existing. - - Arguments: - section -- the section to be checked - """ - retval = True - missing = [] - if section == 'database': - opts = self.__dbopts - elif section == 'maildir': - opts = self.__mdopts - elif section == 'services': - opts = self.__serviceopts - elif section == 'domdir': - opts = self.__domdopts - elif section == 'bin': - opts = self.__binopts - elif section == 'misc': - opts = self.__miscopts - elif section == 'config': - opts = [['done', 'false']] - for o, v in opts: - if not self.has_option(section, o): - missing.append(o) - retval = False - if len(missing): - self.__missing[section] = missing - return retval