annotate scripts/imapServer.py @ 3176:18ad9d702a5b

added "imapServer.py" script (patch [SF#934567])
author Richard Jones <richard@users.sourceforge.net>
date Mon, 14 Feb 2005 06:09:14 +0000
parents
children eddcfee2cc19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3176
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 #!/usr/bin/env python2.3
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 # arch-tag: f2d1fd6e-df72-4188-a3b4-a9dbbb0807b9
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # vim: filetype=python ts=4 sw=4 noexpandtab si
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 """\
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 This script is a wrapper around the mailgw.py script that exists in roundup.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 It runs as service instead of running as a one-time shot.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 It also connects to a secure IMAP server. The main reasons for this script are:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 1) The roundup-mailgw script isn't designed to run as a server. It expects that you
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 either run it by hand, and enter the password each time, or you supply the
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 password on the command line. I prefer to run a server that I initialize with
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 the password, and then it just runs. I don't want to have to pass it on the
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 command line, so running through crontab isn't a possibility. (This wouldn't
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 be a problem on a local machine running through a mailspool.)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 2) mailgw.py somehow screws up SSL support so IMAP4_SSL doesn't work. So hopefully
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 running that work outside of the mailgw will allow it to work.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 3) I wanted to be able to check multiple projects at the same time. roundup-mailgw is
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 only for 1 mailbox and 1 project.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 *TODO*:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 For the first round, the program spawns a new roundup-mailgw for each imap message
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 that it finds and pipes the result in. In the future it might be more practical to
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 actually include the roundup files and run the appropriate commands using python.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 *TODO*:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 Look into supporting a logfile instead of using 2>/logfile
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 *TODO*:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 Add an option for changing the uid/gid of the running process.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 import logging
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 logging.basicConfig()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 log = logging.getLogger('IMAPServer')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 version = '0.1.2'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 class RoundupMailbox:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 """This contains all the info about each mailbox.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 Username, Password, server, security, roundup database
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 def __init__(self, dbhome='', username=None, password=None, mailbox=None
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 , server=None, protocol='imaps'):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 self.username = username
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 self.password = password
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 self.mailbox = mailbox
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 self.server = server
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 self.protocol = protocol
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 self.dbhome = dbhome
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 try:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 if not self.dbhome:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 import os
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 self.dbhome = raw_input('Tracker home: ')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 if not os.path.exists(self.dbhome):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 raise ValueError, 'Invalid home address directory does not exist. %s' % self.dbhome
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 if not self.server:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 self.server = raw_input('Server: ')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 if not self.server:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 raise ValueError, 'No Servername supplied'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 protocol = raw_input('protocol [imaps]? ')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 self.protocol = protocol
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 if not self.username:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 self.username = raw_input('Username: ')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 if not self.username:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 raise ValueError, 'Invalid Username'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 if not self.password:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 import getpass
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 print 'For server %s, user %s' % (self.server, self.username)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 self.password = getpass.getpass()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 # password can be empty because it could be superceeded by a later
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 # entry
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 #if self.mailbox is None:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 # self.mailbox = raw_input('Mailbox [INBOX]: ')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 # # We allow an empty mailbox because that will
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 # # select the INBOX, whatever it is called
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 except (KeyboardInterrupt, EOFError):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 raise ValueError, 'Canceled by User'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 def __str__(self):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 return """Mailbox{ server:%(server)s, protocol:%(protocol)s, username:%(username)s, mailbox:%(mailbox)s, dbhome:%(dbhome)s }""" % self.__dict__
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 class IMAPServer:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 """This class runs as a server process. It is configured with a list of
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 mailboxes to connect to, along with the roundup database directories that correspond
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 with each email address.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 It then connects to each mailbox at a specified interval, and if there are new messages
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 it reads them, and sends the result to the roundup.mailgw.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 *TODO*:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 Try to be smart about how you access the mailboxes so that you can connect once, and
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 access multiple mailboxes and possibly multiple usernames.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 *NOTE*:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 This assumes that if you are using the same user on the same server, you are using
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 the same password. (the last one supplied is used.) Empty passwords are ignored.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 Only the last protocol supplied is used.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 def __init__(self, pidfile=None, delay=5, daemon=False):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 #This is sorted by servername, then username, then mailboxes
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 self.mailboxes = {}
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 self.delay = float(delay)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 self.pidfile = pidfile
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 self.daemon = daemon
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 def setDelay(self, delay):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 self.delay = delay
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 def addMailbox(self, mailbox):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 """ The linkage is as follows:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 servers -- users - mailbox:dbhome
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 So there can be multiple servers, each with multiple users.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 Each username can be associated with multiple mailboxes.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 each mailbox is associated with 1 database home
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 log.info('Adding mailbox %s', mailbox)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 if not self.mailboxes.has_key(mailbox.server):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 self.mailboxes[mailbox.server] = {'protocol':'imaps', 'users':{}}
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 server = self.mailboxes[mailbox.server]
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 if mailbox.protocol:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 server['protocol'] = mailbox.protocol
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 if not server['users'].has_key(mailbox.username):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 server['users'][mailbox.username] = {'password':'', 'mailboxes':{}}
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 user = server['users'][mailbox.username]
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 if mailbox.password:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 user['password'] = mailbox.password
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 if user['mailboxes'].has_key(mailbox.mailbox):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 raise ValueError, 'Mailbox is already defined'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 user['mailboxes'][mailbox.mailbox] = mailbox.dbhome
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 def _process(self, message, dbhome):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 """Actually process one of the email messages"""
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 import os, sys
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 child = os.popen('roundup-mailgw %s' % dbhome, 'wb')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 child.write(message)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 child.close()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 #print message
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 def _getMessages(self, serv, count, dbhome):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 """This assumes that you currently have a mailbox open, and want to
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 process all messages that are inside.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 for n in range(1, count+1):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 (t, data) = serv.fetch(n, '(RFC822)')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 if t == 'OK':
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 self._process(data[0][1], dbhome)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 serv.store(n, '+FLAGS', r'(\Deleted)')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 def checkBoxes(self):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 """This actually goes out and does all the checking.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 Returns False if there were any errors, otherwise returns true.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 import imaplib
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 noErrors = True
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 for server in self.mailboxes:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 log.info('Connecting to server: %s', server)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 s_vals = self.mailboxes[server]
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 try:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 for user in s_vals['users']:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 u_vals = s_vals['users'][user]
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 # TODO: As near as I can tell, you can only
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 # login with 1 username for each connection to a server.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 protocol = s_vals['protocol'].lower()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 if protocol == 'imaps':
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 serv = imaplib.IMAP4_SSL(server)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 elif protocol == 'imap':
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 serv = imaplib.IMAP4(server)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 else:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 raise ValueError, 'Unknown protocol %s' % protocol
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 password = u_vals['password']
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 try:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 log.info('Connecting as user: %s', user)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 serv.login(user, password)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 for mbox in u_vals['mailboxes']:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 dbhome = u_vals['mailboxes'][mbox]
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 log.info('Using mailbox: %s, home: %s', mbox, dbhome)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 #access a specific mailbox
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 if mbox:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 (t, data) = serv.select(mbox)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 else:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 # Select the default mailbox (INBOX)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 (t, data) = serv.select()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 try:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 nMessages = int(data[0])
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 except ValueError:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 nMessages = 0
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 log.info('Found %s messages', nMessages)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 if nMessages:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 self._getMessages(serv, nMessages, dbhome)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 serv.expunge()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 # We are done with this mailbox
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 serv.close()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 except:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 log.exception('Exception with server %s user %s', server, user)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 noErrors = False
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 serv.logout()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 serv.shutdown()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 del serv
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 except:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 log.exception('Exception while connecting to %s', server)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 noErrors = False
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 return noErrors
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 def makeDaemon(self):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 """This forks a couple of times, and otherwise makes this run as a daemon."""
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 ''' Turn this process into a daemon.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 - make our parent PID 1
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 Write our new PID to the pidfile.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 From A.M. Kuuchling (possibly originally Greg Ward) with
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 modification from Oren Tirosh, and finally a small mod from me.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 Originally taken from roundup.scripts.roundup_server.py
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 '''
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 log.info('Running as Daemon')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 import os
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238 # Fork once
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 if os.fork() != 0:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 os._exit(0)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 # Create new session
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 os.setsid()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 # Second fork to force PPID=1
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 pid = os.fork()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 if pid:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 if self.pidfile:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249 pidfile = open(self.pidfile, 'w')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 pidfile.write(str(pid))
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 pidfile.close()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 os._exit(0)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 #os.chdir("/")
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255 #os.umask(0)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 def run(self):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258 """This spawns itself as a daemon, and then runs continually, just sleeping inbetween checks.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 It is recommended that you run checkBoxes once first before you select run. That way you can
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 know if there were any failures.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 import time
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 if self.daemon:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 self.makeDaemon()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265 while True:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
267 time.sleep(self.delay * 60.0)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268 log.info('Time: %s', time.strftime('%Y-%m-%d %H:%M:%S'))
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269 self.checkBoxes()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 def getItems(s):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 """Parse a string looking for userame@server"""
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 import re
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 myRE = re.compile(
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 r'((?P<proto>[^:]+)://)?'#You can supply a protocol if you like
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 r'(' #The username part is optional
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 r'(?P<user>[^:]+)' #You can supply the password as
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 r'(:(?P<pass>.+))?' #username:password@server
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 r'@)?'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 r'(?P<server>[^/]+)'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 r'(/(?P<mailbox>.+))?$'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 m = myRE.match(s)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 if m:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 return {'username':m.group('user'), 'password':m.group('pass')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 , 'server':m.group('server'), 'protocol':m.group('proto')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 , 'mailbox':m.group('mailbox')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 }
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 def main():
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 """This is what is called if run at the prompt"""
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 import optparse, os
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 parser = optparse.OptionParser(
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 version=('%prog ' + version)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 , usage="""usage: %prog [options] (home server)...
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 So each entry has a home, and then the server configuration. home is just a path to the
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 roundup issue tracker. The server is something of the form:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298 imaps://user:password@server/mailbox
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 If you don't supply the protocol, imaps is assumed. Without user or password, you will be
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
300 prompted for them. The server must be supplied. Without mailbox the INBOX is used.
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
301
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
302 Examples:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303 %prog /home/roundup/trackers/test imaps://test@imap.example.com/test
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
304 %prog /home/roundup/trackers/test imap.example.com /home/roundup/trackers/test2 imap.example.com/test2
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
305 """
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
306 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
307 parser.add_option('-d', '--delay', dest='delay', type='float', metavar='<sec>'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
308 , default=5
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
309 , help="Set the delay between checks in minutes. (default 5)"
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
310 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311 parser.add_option('-p', '--pid-file', dest='pidfile', metavar='<file>'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
312 , default=None
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
313 , help="The pid of the server process will be written to <file>"
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
314 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
315 parser.add_option('-n', '--no-daemon', dest='daemon', action='store_false'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
316 , default=True
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317 , help="Do not fork into the background after running the first check."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
319 parser.add_option('-v', '--verbose', dest='verbose', action='store_const'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
320 , const=logging.INFO
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
321 , help="Be more verbose in letting you know what is going on."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
322 " Enables informational messages."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
323 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
324 parser.add_option('-V', '--very-verbose', dest='verbose', action='store_const'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
325 , const=logging.DEBUG
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326 , help="Be very verbose in letting you know what is going on."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327 " Enables debugging messages."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
329 parser.add_option('-q', '--quiet', dest='verbose', action='store_const'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
330 , const=logging.ERROR
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 , help="Be less verbose. Ignores warnings, only prints errors."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
333 parser.add_option('-Q', '--very-quiet', dest='verbose', action='store_const'
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334 , const=logging.CRITICAL
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 , help="Be much less verbose. Ignores warnings and errors."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336 " Only print CRITICAL messages."
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 (opts, args) = parser.parse_args()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 if (len(args) == 0) or (len(args) % 2 == 1):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 parser.error('Invalid number of arguments. Each site needs a home and a server.')
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
343 log.setLevel(opts.verbose)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344 myServer = IMAPServer(delay=opts.delay, pidfile=opts.pidfile, daemon=opts.daemon)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345 for i in range(0,len(args),2):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
346 home = args[i]
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
347 server = args[i+1]
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
348 if not os.path.exists(home):
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
349 parser.error('Home: "%s" does not exist' % home)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
350
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
351 info = getItems(server)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 if not info:
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
353 parser.error('Invalid server string: "%s"' % server)
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
355 myServer.addMailbox(
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
356 RoundupMailbox(dbhome=home, mailbox=info['mailbox']
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 , username=info['username'], password=info['password']
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
358 , server=info['server'], protocol=info['protocol']
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
359 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360 )
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
361
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
362 if myServer.checkBoxes():
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363 myServer.run()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
365 if __name__ == '__main__':
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366 main()
18ad9d702a5b added "imapServer.py" script (patch [SF#934567])
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
367

Roundup Issue Tracker: http://roundup-tracker.org/