From 7423834758dda2093a6e8e675ab4078c5f87ffcd Mon Sep 17 00:00:00 2001 From: "Jeroen van Meeuwen (Kolab Systems)" Date: Wed, 19 Oct 2011 13:22:42 +0100 Subject: Restructure the command-line interface so that it can be extended easier, and particular commands can be shipped in seperate packages --- pykolab/cli/cmd_export_mailbox.py | 125 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 pykolab/cli/cmd_export_mailbox.py (limited to 'pykolab/cli/cmd_export_mailbox.py') diff --git a/pykolab/cli/cmd_export_mailbox.py b/pykolab/cli/cmd_export_mailbox.py new file mode 100644 index 0000000..eaca347 --- /dev/null +++ b/pykolab/cli/cmd_export_mailbox.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# Copyright 2010-2011 Kolab Systems AG (http://www.kolabsys.com) +# +# Jeroen van Meeuwen (Kolab Systems) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 3 or, at your option, any later version +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +import commands + +import pykolab + +from pykolab.translate import _ + +log = pykolab.getLogger('pykolab.cli') +conf = pykolab.getConf() + +auth = pykolab.auth +imap = pykolab.imap + +def __init__(): + commands.register('export_mailbox', execute) + +def cli_options(): + my_option_group = conf.add_cli_parser_option_group(_("CLI Options")) + my_option_group.add_option( '--all', + dest = "all", + action = "store_true", + default = False, + help = _("All folders this user has access to")) + +def execute(*args, **kw): + import os + import subprocess + + user = conf.cli_args.pop(0) + + # TODO: /etc/imapd.conf is not the definitive location for the + # imapd.conf configuration file. + partition_proc = subprocess.Popen( + ['grep', '^partition', '/etc/imapd.conf'], + stdout=subprocess.PIPE + ) + + partitions = [ + x.split(':')[1].strip() + for x in partition_proc.communicate()[0].split('\n') + if len(x.split(':')) > 1 + ] + + # TODO: ctl_mboxlist is not necessarily in this location. + ctl_mboxlist_args = [ '/usr/lib/cyrus-imapd/ctl_mboxlist', '-d' ] + ctl_mboxlist = subprocess.Popen( + ctl_mboxlist_args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + + mboxlist_proc = subprocess.Popen( + ['grep', '-E', '\s*%s\s*.*i.*p.*' %(user)], + stdin=ctl_mboxlist.stdout, + stdout=subprocess.PIPE + ) + + ctl_mboxlist.stdout.close() + + # TODO: Handle errors from ctl_mboxlist process (stderr) + mboxlist_output = mboxlist_proc.communicate()[0] + + zipper_args = [ 'zip', '-r', '%s.zip' %(user) ] + directories = [] + + for mbox_internal in mboxlist_output.split('\n'): + if len(mbox_internal.split('\t')[0].split('!')) > 1: + domain = mbox_internal.split('\t')[0].split('!')[0] + mailbox = '/'.join( + mbox_internal.split( + '\t' + )[0].split( + '!' + )[1].split( + '.' + )[1:] + ) + + for partition in partitions: + mbox_dir = '%s/domain/%s/%s/%s/user/%s/' %( + partition, + domain[0], + domain, + user[0], + mailbox + ) + + if os.path.isdir(mbox_dir): + directories.append(mbox_dir) + + else: + log.debug( + _('%s is not a directory') %(mbox_dir), + level=5 + ) + + if not len(directories) == 0: + zipper_output = subprocess.Popen( + zipper_args + directories, + stdout=subprocess.PIPE + ).communicate()[0] + + print >> sys.stderr, _("ZIP file at %s.zip") %(user) + else: + print >> sys.stderr, _("No directories found for user %s") %(user) + sys.exit(1) + -- cgit v1.1