VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
- Account: fixed versions dependencies.
- maillocation: use the version string, may be uses in a error message.
- common: version_hex() raises a ValueError, instead of returning 0,
if the version string is invalid.
# -*- coding: UTF-8 -*-# Copyright (c) 2010, Pascal Volk# See COPYING for distribution information.""" VirtualMailManager.common Some common functions"""importosimportrefromVirtualMailManagerimportENCODINGfromVirtualMailManager.constants.ERRORimport \NOT_EXECUTABLE,NO_SUCH_BINARY,NO_SUCH_DIRECTORYfromVirtualMailManager.errorsimportVMMError_version_re=re.compile(r'^(\d+)\.(\d+)\.(?:(\d+)|(alpha|beta|rc)(\d+))$')_=lambdamsg:msgdefexpand_path(path):"""Expands paths, starting with ``.`` or ``~``, to an absolute path."""ifpath.startswith('.'):returnos.path.abspath(path)ifpath.startswith('~'):returnos.path.expanduser(path)returnpathdefget_unicode(string):"""Converts `string` to `unicode`, if necessary."""ifisinstance(string,unicode):returnstringreturnunicode(string,ENCODING,'replace')defis_dir(path):"""Checks if `path` is a directory. Throws a `VMMError` if `path` is not a directory. """path=expand_path(path)ifnotos.path.isdir(path):raiseVMMError(_(u"'%s' is not a directory")%get_unicode(path),NO_SUCH_DIRECTORY)returnpathdefexec_ok(binary):"""Checks if the `binary` exists and if it is executable. Throws a `VMMError` if the `binary` isn't a file or is not executable. """binary=expand_path(binary)ifnotos.path.isfile(binary):raiseVMMError(_(u"'%s' is not a file")%get_unicode(binary),NO_SUCH_BINARY)ifnotos.access(binary,os.X_OK):raiseVMMError(_(u"File is not executable: '%s'")%get_unicode(binary),NOT_EXECUTABLE)returnbinarydefversion_hex(version_string):"""Convert a Dovecot version, e.g.: '1.2.3' or '2.0.beta4', to an int. Raises a `ValueError` if the *version_string* has the wrong™ format. version_hex('1.2.3') -> 16909296 hex(version_hex('1.2.3')) -> '0x10203f0' """version=0version_level=dict(alpha=0xA,beta=0xB,rc=0xC)version_mo=_version_re.match(version_string)ifnotversion_mo:raiseValueError('Invalid version string: %r'%version_string)major,minor,patch,level,serial=version_mo.groups()version+=int(major)<<24version+=int(minor)<<16ifpatch:version+=int(patch)<<8version+=version_level.get(level,0xF)<<4ifserial:version+=int(serial)returnversiondel_