Changeset View
Changeset View
Standalone View
Standalone View
pykolab/imap/__init__.py
Show First 20 Lines • Show All 502 Lines • ▼ Show 20 Lines | def user_mailbox_create(self, mailbox_base_name, server=None): | ||||
if not mailbox_base_name == mailbox_base_name.lower(): | if not mailbox_base_name == mailbox_base_name.lower(): | ||||
log.warning(_("Downcasing mailbox name %r") % (mailbox_base_name)) | log.warning(_("Downcasing mailbox name %r") % (mailbox_base_name)) | ||||
mailbox_base_name = mailbox_base_name.lower() | mailbox_base_name = mailbox_base_name.lower() | ||||
folder_name = "user%s%s" % (self.get_separator(), mailbox_base_name) | folder_name = "user%s%s" % (self.get_separator(), mailbox_base_name) | ||||
log.info(_("Creating new mailbox for user %s") %(mailbox_base_name)) | log.info(_("Creating new mailbox for user %s") %(mailbox_base_name)) | ||||
max_tries = 10 | success = self._create_folder_waiting(folder_name, server) | ||||
success = False | |||||
while not success and max_tries > 0: | |||||
success = self.create_folder(folder_name, server) | |||||
if not success: | |||||
self.disconnect() | |||||
max_tries -= 1 | |||||
time.sleep(1) | |||||
self.connect() | |||||
if not success: | if not success: | ||||
log.error(_("Could not create the mailbox for user %s, aborting." % (mailbox_base_name))) | log.error(_("Could not create the mailbox for user %s, aborting." % (mailbox_base_name))) | ||||
return False | return False | ||||
# In a Cyrus IMAP Murder topology, wait for the murder to have settled | |||||
if self.imap_murder(): | |||||
self.disconnect() | |||||
self.connect() | |||||
created = False | |||||
last_log = time.time() | |||||
while not created: | |||||
created = self.has_folder(folder_name) | |||||
if not created: | |||||
if time.time() - last_log > 5: | |||||
log.info(_("Waiting for the Cyrus IMAP Murder to settle...")) | |||||
last_log = time.time() | |||||
time.sleep(0.5) | |||||
_additional_folders = None | _additional_folders = None | ||||
if not hasattr(self, 'domain'): | if not hasattr(self, 'domain'): | ||||
self.domain = None | self.domain = None | ||||
if self.domain == None and len(mailbox_base_name.split('@')) > 1: | if self.domain == None and len(mailbox_base_name.split('@')) > 1: | ||||
self.domain = mailbox_base_name.split('@')[1] | self.domain = mailbox_base_name.split('@')[1] | ||||
▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | def user_mailbox_create_additional_folders(self, user, additional_folders): | ||||
server = self.user_mailbox_server(folder) | server = self.user_mailbox_server(folder) | ||||
else: | else: | ||||
server = None | server = None | ||||
success = False | success = False | ||||
last_log = time.time() | last_log = time.time() | ||||
while not success: | while not success: | ||||
try: | try: | ||||
self.disconnect() | self.disconnect() | ||||
self.connect(login=False, server=server) | self.connect(login=False, server=server) | ||||
self.login_plain(admin_login, admin_password, user) | self.login_plain(admin_login, admin_password, user) | ||||
(personal, other, shared) = self.namespaces() | (personal, other, shared) = self.namespaces() | ||||
success = True | success = True | ||||
except Exception, errmsg: | except Exception, errmsg: | ||||
if time.time() - last_log > 5 and self.imap_murder(): | if time.time() - last_log > 5 and self.imap_murder(): | ||||
log.debug(_("Waiting for the Cyrus murder to settle... %r") % (errmsg)) | log.debug(_("Waiting for the Cyrus murder to settle... %r") % (errmsg)) | ||||
Show All 9 Lines | def user_mailbox_create_additional_folders(self, user, additional_folders): | ||||
_add_folder = {} | _add_folder = {} | ||||
folder_name = additional_folder | folder_name = additional_folder | ||||
if not folder_name.startswith(personal): | if not folder_name.startswith(personal): | ||||
log.error(_("Correcting additional folder name from %r to %r") % (folder_name, "%s%s" % (personal, folder_name))) | log.error(_("Correcting additional folder name from %r to %r") % (folder_name, "%s%s" % (personal, folder_name))) | ||||
folder_name = "%s%s" % (personal, folder_name) | folder_name = "%s%s" % (personal, folder_name) | ||||
try: | |||||
self.create_folder(folder_name) | |||||
created = False | |||||
last_log = time.time() | |||||
while not created: | |||||
created = self.has_folder(folder_name) | |||||
if not created: | |||||
if time.time() - last_log > 5: | |||||
log.info(_("Waiting for the Cyrus IMAP Murder to settle...")) | |||||
if time.time() - last_log > 30: | |||||
log.warning(_("Waited for 30 seconds, going to reconnect")) | |||||
self.disconnect() | |||||
self.connec() | |||||
last_log = time.time() | success = self._create_folder_waiting(folder_name) | ||||
time.sleep(0.5) | if not success: | ||||
except: | log.warning(_("Failed to create folder: %s") % (folder_name)) | ||||
log.warning(_("Mailbox already exists: %s") % (folder_name)) | |||||
if conf.debuglevel > 8: | |||||
import traceback | |||||
traceback.print_exc() | |||||
continue | continue | ||||
if additional_folders[additional_folder].has_key("annotations"): | if additional_folders[additional_folder].has_key("annotations"): | ||||
for annotation in additional_folders[additional_folder]["annotations"].keys(): | for annotation in additional_folders[additional_folder]["annotations"].keys(): | ||||
self.set_metadata( | self.set_metadata( | ||||
folder_name, | folder_name, | ||||
"%s" % (annotation), | "%s" % (annotation), | ||||
"%s" % (additional_folders[additional_folder]["annotations"][annotation]) | "%s" % (additional_folders[additional_folder]["annotations"][annotation]) | ||||
▲ Show 20 Lines • Show All 90 Lines • ▼ Show 20 Lines | def user_mailbox_create_additional_folders(self, user, additional_folders): | ||||
if additional_folders[additional_folder].has_key("partition"): | if additional_folders[additional_folder].has_key("partition"): | ||||
partition = additional_folders[additional_folder]["partition"] | partition = additional_folders[additional_folder]["partition"] | ||||
try: | try: | ||||
self.imap._rename(folder_name, folder_name, partition) | self.imap._rename(folder_name, folder_name, partition) | ||||
except: | except: | ||||
log.error(_("Could not rename %s to reside on partition %s") % (folder_name, partition)) | log.error(_("Could not rename %s to reside on partition %s") % (folder_name, partition)) | ||||
def _create_folder_waiting(self, folder_name, server=None): | |||||
""" | |||||
Create a folder and wait to make sure it exists | |||||
""" | |||||
created = False | |||||
try: | |||||
max_tries = 10 | |||||
while not created and max_tries > 0: | |||||
created = self.create_folder(folder_name, server) | |||||
if not created: | |||||
self.disconnect() | |||||
max_tries -= 1 | |||||
time.sleep(1) | |||||
self.connect() | |||||
# In a Cyrus IMAP Murder topology, wait for the murder to have settled | |||||
if created and self.imap_murder(): | |||||
success = False | |||||
last_log = time.time() | |||||
reconnect_counter = 0 | |||||
while not success: | |||||
success = self.has_folder(folder_name) | |||||
if not success: | |||||
if time.time() - last_log > 5: | |||||
reconnect_counter += 1 | |||||
log.info(_("Waiting for the Cyrus IMAP Murder to settle...")) | |||||
if reconnect_counter == 6: | |||||
log.warning(_("Waited for 30 seconds, going to reconnect")) | |||||
reconnect_counter = 0 | |||||
self.disconnect() | |||||
self.connect() | |||||
last_log = time.time() | |||||
time.sleep(0.5) | |||||
except: | |||||
if conf.debuglevel > 8: | |||||
import traceback | |||||
traceback.print_exc() | |||||
return created | |||||
def user_mailbox_delete(self, mailbox_base_name): | def user_mailbox_delete(self, mailbox_base_name): | ||||
""" | """ | ||||
Delete a user mailbox. | Delete a user mailbox. | ||||
""" | """ | ||||
self.connect() | self.connect() | ||||
folder = "user%s%s" %(self.get_separator(),mailbox_base_name) | folder = "user%s%s" %(self.get_separator(),mailbox_base_name) | ||||
self.delete_mailfolder(folder) | self.delete_mailfolder(folder) | ||||
▲ Show 20 Lines • Show All 433 Lines • Show Last 20 Lines |