Changeset View
Standalone View
pykolab/cli/cmd_sync_mailhost_attrs.py
Show All 23 Lines | |||||
from pykolab import imap_utf7 | from pykolab import imap_utf7 | ||||
from pykolab.auth import Auth | from pykolab.auth import Auth | ||||
from pykolab.imap import IMAP | from pykolab.imap import IMAP | ||||
from pykolab.translate import _ | from pykolab.translate import _ | ||||
log = pykolab.getLogger('pykolab.cli') | log = pykolab.getLogger('pykolab.cli') | ||||
conf = pykolab.getConf() | conf = pykolab.getConf() | ||||
def __init__(): | def __init__(): | ||||
Lint: PEP8 E302: expected 2 blank lines, found 1 | |||||
commands.register('sync_mailhost_attrs', execute, description=description()) | commands.register('sync_mailhost_attrs', execute, description=description()) | ||||
Lint: PEP8 E501 line too long (80 > 79 characters) Lint: PEP8 E501: line too long (80 > 79 characters) | |||||
def description(): | def description(): | ||||
Lint: PEP8 E302 expected 2 blank lines, found 1 Lint: PEP8 E302: expected 2 blank lines, found 1 | |||||
return "Synchronize mailHost attribute values with the actual mailserver in a Cyrus IMAP Murder.\n" | return "Synchronize mailHost attribute values with the actual mailserver in a Cyrus IMAP Murder.\n" | ||||
Lint: PEP8 E501 line too long (103 > 79 characters) Lint: PEP8 E501: line too long (103 > 79 characters) | |||||
def cli_options(): | def cli_options(): | ||||
Lint: PEP8 E302 expected 2 blank lines, found 1 Lint: PEP8 E302: expected 2 blank lines, found 1 | |||||
my_option_group = conf.add_cli_parser_option_group(_("CLI Options")) | my_option_group = conf.add_cli_parser_option_group(_("CLI Options")) | ||||
my_option_group.add_option( '--delete', | my_option_group.add_option( '--delete', | ||||
Lint: PEP8 E201 whitespace after '(' Lint: PEP8 E201: whitespace after '(' | |||||
dest = "delete", | dest = "delete", | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
action = "store_true", | action = "store_true", | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
default = False, | default = False, | ||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
help = _("Delete mailboxes for recipients that do not appear to exist in LDAP.")) | help = _("Delete mailboxes for recipients that do not appear to exist in LDAP.")) | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E501 line too long (116 > 79 characters) Lint: PEP8 E501: line too long (116 > 79 characters) | |||||
my_option_group.add_option( '--dry-run', | my_option_group.add_option( '--dry-run', | ||||
Lint: PEP8 E201 whitespace after '(' Lint: PEP8 E201: whitespace after '(' | |||||
dest = "dry_run", | dest = "dry_run", | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
action = "store_true", | action = "store_true", | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
default = False, | default = False, | ||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
help = _("Display changes, do not apply them.")) | help = _("Display changes, do not apply them.")) | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E501 line too long (83 > 79 characters) Lint: PEP8 E501: line too long (83 > 79 characters) | |||||
my_option_group.add_option( '--server', | my_option_group.add_option( '--server', | ||||
Lint: PEP8 E201 whitespace after '(' Lint: PEP8 E201: whitespace after '(' | |||||
dest = "connect_server", | dest = "connect_server", | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
action = "store", | action = "store", | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
default = None, | default = None, | ||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
metavar = "SERVER", | metavar = "SERVER", | ||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
help = _("List mailboxes on server SERVER only.")) | help = _("List mailboxes on server SERVER only.")) | ||||
Lint: PEP8 E221 multiple spaces before operator Lint: PEP8 E221: multiple spaces before operator | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E251 unexpected spaces around keyword / parameter equals Lint: PEP8 E251: unexpected spaces around keyword / parameter equals | |||||
Lint: PEP8 E501 line too long (85 > 79 characters) Lint: PEP8 E501: line too long (85 > 79 characters) | |||||
def execute(*args, **kw): | def execute(*args, **kw): | ||||
Lint: PEP8 E302 expected 2 blank lines, found 1 Lint: PEP8 E302: expected 2 blank lines, found 1 | |||||
""" | """ | ||||
Synchronize or display changes | Synchronize or display changes | ||||
""" | """ | ||||
imap = IMAP() | imap = IMAP() | ||||
if not conf.connect_server == None: | if not conf.connect_server == None: | ||||
Lint: PEP8 E711 comparison to None should be 'if cond is None:' Lint: PEP8 E711: comparison to None should be 'if cond is None:' | |||||
imap.connect(server=conf.connect_server) | imap.connect(server=conf.connect_server) | ||||
else: | else: | ||||
imap.connect() | imap.connect() | ||||
auth = Auth() | auth = Auth() | ||||
auth.connect() | auth.connect() | ||||
domains = auth.list_domains() | domains = auth.list_domains() | ||||
folders = imap.lm() | folders = imap.lm() | ||||
imap_domains_not_domains = [] | imap_domains_not_domains = [] | ||||
for folder in folders: | for folder in folders: | ||||
if len(folder.split('@')) > 1 and not folder.startswith('DELETED'): | if len(folder.split('@')) > 1 and not folder.startswith('DELETED'): | ||||
_folder_domain = folder.split('@')[-1] | _folder_domain = folder.split('@')[-1] | ||||
if not _folder_domain in list(set(domains.keys() + domains.values())): | if not _folder_domain in list(set(domains.keys() + domains.values())): | ||||
Lint: PEP8 E713 test for membership should be 'not in' Lint: PEP8 E713: test for membership should be 'not in' | |||||
Lint: PEP8 E501 line too long (82 > 79 characters) Lint: PEP8 E501: line too long (82 > 79 characters) | |||||
imap_domains_not_domains.append(folder.split('@')[-1]) | imap_domains_not_domains.append(folder.split('@')[-1]) | ||||
imap_domains_not_domains = list(set(imap_domains_not_domains)) | imap_domains_not_domains = list(set(imap_domains_not_domains)) | ||||
log.debug(_("Domains in IMAP not in LDAP: %r") % (imap_domains_not_domains), level=8) | log.debug(_("Domains in IMAP not in LDAP: %r") % (imap_domains_not_domains), level=8) | ||||
Lint: PEP8 E501 line too long (89 > 79 characters) Lint: PEP8 E501: line too long (89 > 79 characters) | |||||
if len(imap_domains_not_domains) > 0: | if len(imap_domains_not_domains) > 0: | ||||
for domain in imap_domains_not_domains: | for domain in imap_domains_not_domains: | ||||
folders = [] | folders = [] | ||||
folders.extend(imap.lm('shared/%%@%s' % (domain))) | folders.extend(imap.lm('shared/%%@%s' % (domain))) | ||||
folders.extend(imap.lm('user/%%@%s' % (domain))) | folders.extend(imap.lm('user/%%@%s' % (domain))) | ||||
for folder in folders: | for folder in folders: | ||||
r_folder = folder | |||||
if not folder.startswith('shared/'): | |||||
r_folder = '/'.join(folder.split('/')[1:]) | |||||
if conf.delete: | if conf.delete: | ||||
if conf.dry_run: | if conf.dry_run: | ||||
if not folder.split('/')[0] == 'shared': | if not folder.startswith('shared/'): | ||||
log.warning(_("No recipients for '%s' (would have deleted the mailbox if not for --dry-run)!") % ('/'.join(folder.split('/')[1:]))) | log.warning(_("No recipients for '%s' (would have deleted the mailbox if not for --dry-run)!") % (r_folder)) | ||||
Lint: PEP8 E501 line too long (136 > 79 characters) Lint: PEP8 E501: line too long (136 > 79 characters) | |||||
else: | else: | ||||
continue | continue | ||||
else: | else: | ||||
if not '/'.join(folder.split('/')[0]) == 'shared': | if not folder.startswith('shared/'): | ||||
log.info(_("Deleting mailbox '%s' because it has no recipients") % (folder)) | log.info(_("Deleting mailbox '%s' because it has no recipients") % (folder)) | ||||
Lint: PEP8 E501 line too long (104 > 79 characters) Lint: PEP8 E501: line too long (104 > 79 characters) | |||||
try: | try: | ||||
imap.dm(folder) | imap.dm(folder) | ||||
except Exception, errmsg: | except Exception, errmsg: | ||||
log.error(_("An error occurred removing mailbox %r: %r") % (folder, errmsg)) | log.error(_("An error occurred removing mailbox %r: %r") % (folder, errmsg)) | ||||
Lint: PEP8 E501 line too long (108 > 79 characters) Lint: PEP8 E501: line too long (108 > 79 characters) | |||||
else: | else: | ||||
log.info(_("Not automatically deleting shared folder '%s'") % (folder)) | log.info(_("Not automatically deleting shared folder '%s'") % (folder)) | ||||
Lint: PEP8 E501 line too long (99 > 79 characters) Lint: PEP8 E501: line too long (99 > 79 characters) | |||||
else: | else: | ||||
log.warning(_("No recipients for '%s' (use --delete to delete)!") % ('/'.join(folder.split('/')[1:]))) | log.warning(_("No recipients for '%s' (use --delete to delete)!") % (r_folder)) | ||||
Lint: PEP8 E501 line too long (99 > 79 characters) Lint: PEP8 E501: line too long (99 > 79 characters) | |||||
for primary in list(set(domains.values())): | for primary in list(set(domains.values())): | ||||
secondaries = [x for x in domains.keys() if domains[x] == primary] | secondaries = [x for x in domains.keys() if domains[x] == primary] | ||||
folders = [] | folders = [] | ||||
folders.extend(imap.lm('shared/%%@%s' % (primary))) | folders.extend(imap.lm('shared/%%@%s' % (primary))) | ||||
folders.extend(imap.lm('user/%%@%s' % (primary))) | folders.extend(imap.lm('user/%%@%s' % (primary))) | ||||
for secondary in secondaries: | for secondary in secondaries: | ||||
folders.extend(imap.lm('shared/%%@%s' % (secondary))) | folders.extend(imap.lm('shared/%%@%s' % (secondary))) | ||||
folders.extend(imap.lm('user/%%@%s' % (secondary))) | folders.extend(imap.lm('user/%%@%s' % (secondary))) | ||||
auth = Auth(domain=primary) | auth = Auth(domain=primary) | ||||
auth.connect() | auth.connect() | ||||
for folder in folders: | for folder in folders: | ||||
server = imap.user_mailbox_server(folder) | server = imap.user_mailbox_server(folder) | ||||
recipient = auth.find_recipient('/'.join(folder.split('/')[1:])) | r_folder = folder | ||||
if folder.startswith('shared/'): | |||||
recipient = auth.find_folder_resource(folder) | |||||
else: | |||||
r_folder = '/'.join(folder.split('/')[1:]) | |||||
recipient = auth.find_recipient(r_folder) | |||||
if (isinstance(recipient, list)): | if (isinstance(recipient, list)): | ||||
if len(recipient) > 1: | if len(recipient) > 1: | ||||
log.warning(_("Multiple recipients for '%s'!") % ('/'.join(folder.split('/')[1:]))) | log.warning(_("Multiple recipients for '%s'!") % (r_folder)) | ||||
Lint: PEP8 E501 line too long (80 > 79 characters) Lint: PEP8 E501: line too long (80 > 79 characters) | |||||
continue | continue | ||||
elif len(recipient) == 0: | elif len(recipient) == 0: | ||||
if conf.delete: | if conf.delete: | ||||
if conf.dry_run: | if conf.dry_run: | ||||
if not folder.split('/')[0] == 'shared': | if not folder.startswith('shared/'): | ||||
log.warning(_("No recipients for '%s' (would have deleted the mailbox if not for --dry-run)!") % ('/'.join(folder.split('/')[1:]))) | log.warning(_("No recipients for '%s' (would have deleted the mailbox if not for --dry-run)!") % (r_folder)) | ||||
Lint: PEP8 E501 line too long (140 > 79 characters) Lint: PEP8 E501: line too long (140 > 79 characters) | |||||
else: | else: | ||||
continue | continue | ||||
else: | else: | ||||
if not '/'.join(folder.split('/')[0]) == 'shared': | if not folder.startswith('shared/'): | ||||
log.info(_("Deleting mailbox '%s' because it has no recipients") % (folder)) | log.info(_("Deleting mailbox '%s' because it has no recipients") % (folder)) | ||||
Lint: PEP8 E501 line too long (108 > 79 characters) Lint: PEP8 E501: line too long (108 > 79 characters) | |||||
try: | try: | ||||
imap.dm(folder) | imap.dm(folder) | ||||
except Exception, errmsg: | except Exception, errmsg: | ||||
log.error(_("An error occurred removing mailbox %r: %r") % (folder, errmsg)) | log.error(_("An error occurred removing mailbox %r: %r") % (folder, errmsg)) | ||||
Lint: PEP8 E501 line too long (112 > 79 characters) Lint: PEP8 E501: line too long (112 > 79 characters) | |||||
else: | else: | ||||
log.info(_("Not automatically deleting shared folder '%s'") % (folder)) | log.info(_("Not automatically deleting shared folder '%s'") % (folder)) | ||||
Lint: PEP8 E501 line too long (103 > 79 characters) Lint: PEP8 E501: line too long (103 > 79 characters) | |||||
else: | else: | ||||
log.warning(_("No recipients for '%s' (use --delete to delete)!") % ('/'.join(folder.split('/')[1:]))) | log.warning(_("No recipients for '%s' (use --delete to delete)!") % (r_folder)) | ||||
Lint: PEP8 E501 line too long (103 > 79 characters) Lint: PEP8 E501: line too long (103 > 79 characters) | |||||
continue | continue | ||||
else: | else: | ||||
mailhost = auth.get_entry_attribute(primary, recipient, 'mailhost') | mailhost = auth.get_entry_attribute(primary, recipient, 'mailhost') | ||||
Lint: PEP8 E501 line too long (83 > 79 characters) Lint: PEP8 E501: line too long (83 > 79 characters) | |||||
if not server == mailhost: | if not server == mailhost: | ||||
if conf.dry_run: | if conf.dry_run: | ||||
print folder, server, mailhost | print folder, server, mailhost | ||||
else: | else: | ||||
auth.set_entry_attribute(primary, recipient, 'mailhost', server) | auth.set_entry_attribute(primary, recipient, 'mailhost', server) | ||||
Lint: PEP8 E501 line too long (84 > 79 characters) Lint: PEP8 E501: line too long (84 > 79 characters) | |||||
folders = [] | folders = [] | ||||
folders.extend(imap.lm("shared/%%")) | folders.extend(imap.lm("shared/%%")) | ||||
folders.extend(imap.lm("user/%%")) | folders.extend(imap.lm("user/%%")) | ||||
auth = Auth() | auth = Auth() | ||||
auth.connect() | auth.connect() | ||||
for folder in folders: | for folder in folders: | ||||
server = imap.user_mailbox_server(folder) | server = imap.user_mailbox_server(folder) | ||||
if folder.startswith('shared/'): | |||||
recipient = auth.find_folder_resource(folder) | |||||
else: | |||||
recipient = auth.find_recipient('/'.join(folder.split('/')[1:])) | recipient = auth.find_recipient('/'.join(folder.split('/')[1:])) | ||||
print folder, server, recipient | print folder, server, recipient |
expected 2 blank lines, found 1