update_config.py
author Pascal Volk <neverseen@users.sourceforge.net>
Fri, 26 Feb 2010 02:35:25 +0000
branchv0.6.x
changeset 216 0c8c053b451c
parent 181 866a6d679fce
child 229 0fb2f12648a7
permissions -rwxr-xr-x
Moved VirtualMailManager/Exceptions to VirtualMailManager/errors. Renamed VMM*Exception classes to *Error. No longer add the attribute 'message' to VMMError if it doesn't exist, like in Python 2.4. It has been deprecated as of Python 2.6. Also removed the methods code() and msg(), the values are now accessible via the attributes 'code' and 'msg'.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Copyright (c) 2008 - 2010, Pascal Volk
# See COPYING for distribution information.

import os
os.sys.path.remove(os.sys.path[0])
from time import time
from ConfigParser import ConfigParser
from shutil import copy2
from VirtualMailManager.constants.VERSION import VERSION


def get_config_file():
    f = None
    for d in ('/root', '/usr/local/etc', '/etc'):
        tmp = os.path.join(d, 'vmm.cfg')
        if os.path.isfile(tmp):
            f = tmp
            break
    if f:
        return f
    else:
        os.sys.stderr.write('error: vmm.cfg not found\n')
        raise SystemExit(2)

def update(cp):
    if VERSION == '0.5.2':
        upd_052(cp)
    elif VERSION == '0.6.0':
        os.sys.stdout.write('info: nothing to do for version %s\n' % VERSION)
        return
    else:
        os.sys.stderr.write(
            'error: the version %s is not supported by this script\n' % VERSION)
        raise SystemExit(3)

def get_cfg_parser(cf):
    fh = open(cf, 'r')
    cp = ConfigParser()
    cp.readfp(fh)
    fh.close()
    return cp

def update_cfg_file(cp, cf):
    copy2(cf, cf+'.bak.'+str(time()))
    fh = open(cf, 'w')
    cp.write(fh)
    fh.close()

def add_sections(cp, sections):
    for section in sections:
        if not cp.has_section(section):
            cp.add_section(section)

def move_option(cp, src, dst):
    ds, do = dst.split('.')
    if not cp.has_option(ds, do):
        ss, so = src.split('.')
        cp.set(ds, do, cp.get(ss, so))
        cp.remove_option(ss, so)
        sect_opt.append((dst, 'R'))

def add_option(cp, dst, val):
    ds, do = dst.split('.')
    if not cp.has_option(ds, do):
        cp.set(ds, do, val)
        sect_opt.append((dst, 'N'))

def get_option(cp, src):
    ss, so = src.split('.')
    return cp.get(ss, so)

def upd_052(cp):
    global had_config

    had_config = cp.remove_section('config')
    add_sections(cp, ('domain', 'account'))
    if cp.has_section('domdir'):
        for src, dst in (('domdir.mode',   'domain.directory_mode'),
                         ('domdir.delete', 'domain.delete_directory'),
                         ('domdir.base',   'misc.base_directory')):
            move_option(cp, src, dst)
        cp.remove_section('domdir')
    if cp.has_section('services'):
        for service in cp.options('services'):
            move_option(cp, 'services.%s'%service, 'account.%s'%service)
        cp.remove_section('services')
    for src, dst in (('maildir.mode',      'account.directory_mode'),
                     ('maildir.diskusage', 'account.disk_usage'),
                     ('maildir.delete',    'account.delete_directory'),
                     ('misc.forcedel',     'domain.force_deletion'),
                     ('misc.passwdscheme', 'misc.password_scheme'),
                     ('misc.dovecotvers',  'misc.dovecot_version')):
        move_option(cp, src, dst)

# def main():
if __name__ == '__main__':
    sect_opt = []
    had_config = False
    cf = get_config_file()
    cp = get_cfg_parser(cf)
    update(cp)
    if len(sect_opt):
        had_config = False
        update_cfg_file(cp, cf)
        sect_opt.sort()
        print 'Please have a look at your configuration: %s' %cf
        print 'This are your Renamed/New settings:'
        for s_o, st in sect_opt:
            print '%s   %s = %s' % (st, s_o, get_option(cp, s_o))
    if had_config:
        update_cfg_file(cp, cf)
        print 'Removed section "config" with option "done" (obsolte)'
        print