author | Pascal Volk <neverseen@users.sourceforge.net> |
Mon, 26 Apr 2010 02:15:36 +0000 | |
branch | v0.6.x |
changeset 265 | 3c0173418d5d |
parent 263 | 07fdc93dde9f |
child 266 | e14c345b44a1 |
permissions | -rw-r--r-- |
262
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
1 |
# -*- coding: UTF-8 -*- |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
2 |
# Copyright (c) 2010, Pascal Volk |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
3 |
# See COPYING for distribution information. |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
4 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
5 |
""" |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
6 |
VirtualMailManager.common |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
7 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
8 |
Some common functions |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
9 |
""" |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
10 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
11 |
import os |
263
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
12 |
import re |
262
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
13 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
14 |
from VirtualMailManager import ENCODING |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
15 |
from VirtualMailManager.constants.ERROR import \ |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
16 |
NOT_EXECUTABLE, NO_SUCH_BINARY, NO_SUCH_DIRECTORY |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
17 |
from VirtualMailManager.errors import VMMError |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
18 |
|
265
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
19 |
|
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
20 |
_version_re = re.compile(r'^(\d+)\.(\d+)\.(?:(\d+)|(alpha|beta|rc)(\d+))$') |
262
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
21 |
_ = lambda msg: msg |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
22 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
23 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
24 |
def expand_path(path): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
25 |
"""Expands paths, starting with ``.`` or ``~``, to an absolute path.""" |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
26 |
if path.startswith('.'): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
27 |
return os.path.abspath(path) |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
28 |
if path.startswith('~'): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
29 |
return os.path.expanduser(path) |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
30 |
return path |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
31 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
32 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
33 |
def get_unicode(string): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
34 |
"""Converts `string` to `unicode`, if necessary.""" |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
35 |
if isinstance(string, unicode): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
36 |
return string |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
37 |
return unicode(string, ENCODING, 'replace') |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
38 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
39 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
40 |
def is_dir(path): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
41 |
"""Checks if `path` is a directory. |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
42 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
43 |
Throws a `VMMError` if `path` is not a directory. |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
44 |
""" |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
45 |
path = expand_path(path) |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
46 |
if not os.path.isdir(path): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
47 |
raise VMMError(_(u"'%s' is not a directory") % get_unicode(path), |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
48 |
NO_SUCH_DIRECTORY) |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
49 |
return path |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
50 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
51 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
52 |
def exec_ok(binary): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
53 |
"""Checks if the `binary` exists and if it is executable. |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
54 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
55 |
Throws a `VMMError` if the `binary` isn't a file or is not |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
56 |
executable. |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
57 |
""" |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
58 |
binary = expand_path(binary) |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
59 |
if not os.path.isfile(binary): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
60 |
raise VMMError(_(u"'%s' is not a file") % get_unicode(binary), |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
61 |
NO_SUCH_BINARY) |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
62 |
if not os.access(binary, os.X_OK): |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
63 |
raise VMMError(_(u"File is not executable: '%s'") % |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
64 |
get_unicode(binary), NOT_EXECUTABLE) |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
65 |
return binary |
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
66 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
67 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
68 |
def version_hex(version_string): |
263
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
69 |
"""Convert a Dovecot version, e.g.: '1.2.3' or '2.0.beta4', to an int. |
265
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
70 |
Raises a `ValueError` if the *version_string* has the wrong™ format. |
263
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
71 |
|
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
72 |
version_hex('1.2.3') -> 16909296 |
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
73 |
hex(version_hex('1.2.3')) -> '0x10203f0' |
262
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
74 |
""" |
263
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
75 |
version = 0 |
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
76 |
version_level = dict(alpha=0xA, beta=0xB, rc=0xC) |
265
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
77 |
version_mo = _version_re.match(version_string) |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
78 |
if not version_mo: |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
79 |
raise ValueError('Invalid version string: %r' % version_string) |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
80 |
major, minor, patch, level, serial = version_mo.groups() |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
81 |
version += int(major) << 24 |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
82 |
version += int(minor) << 16 |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
83 |
if patch: |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
84 |
version += int(patch) << 8 |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
85 |
version += version_level.get(level, 0xF) << 4 |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
86 |
if serial: |
3c0173418d5d
VMM/{Account,common,maillocation}: Dovecot version (check) fixes.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
263
diff
changeset
|
87 |
version += int(serial) |
263
07fdc93dde9f
VMM/common: improved version_hex() in order to convert also
Pascal Volk <neverseen@users.sourceforge.net>
parents:
262
diff
changeset
|
88 |
return version |
262
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
89 |
|
6eea85d8b91d
VMM: moved some non-init functions to the new common module.
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff
changeset
|
90 |
del _ |