annotate roundup-mailgw @ 519:2dd8571ca738

fixes to migration text
author Richard Jones <richard@users.sourceforge.net>
date Fri, 11 Jan 2002 03:34:52 +0000
parents ade1e4bfefc9
children 1ebd38ababc9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 #! /usr/bin/python
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
2 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
3 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
4 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
5 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
6 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
7 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
8 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
9 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
10 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
11 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
12 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
13 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
14 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
15 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
16 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
17 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
18 #
491
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
19 # $Id: roundup-mailgw,v 1.20 2002-01-07 10:43:48 richard Exp $
449
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
20
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
21 # python version check
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
22 from roundup import version_check
27
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
375
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
24 import sys, os, re, cStringIO
27
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25
427
5164f3141159 Cleaned up strange import (less pollution, too)
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 426
diff changeset
26 from roundup.mailgw import Message
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
27 from roundup.i18n import _
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
28
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
29 def do_pipe(handler):
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
30 '''Read a message from standard input and pass it to the mail handler.
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
31 '''
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
32 handler.main(sys.stdin)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
33 return 0
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
34
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
35 def do_mailbox(handler, filename):
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
36 '''Read a series of messages from the specified unix mailbox file and
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
37 pass each to the mail handler.
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
38 '''
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
39 # open the spool file and lock it
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
40 import fcntl, FCNTL
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
41 f = open(filename, 'r+')
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
42 fcntl.flock(f.fileno(), FCNTL.LOCK_EX)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
43
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
44 # handle and clear the mailbox
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
45 try:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
46 from mailbox import UnixMailbox
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
47 mailbox = UnixMailbox(f, factory=Message)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
48 # grab one message
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
49 message = mailbox.next()
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
50 while message:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
51 # call the instance mail handler
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
52 handler.handle_Message(message)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
53 message = mailbox.next()
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
54 # nuke the file contents
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
55 os.ftruncate(f.fileno(), 0)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
56 except:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
57 import traceback
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
58 traceback.print_exc()
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
59 return 1
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
60 fcntl.flock(f.fileno(), FCNTL.LOCK_UN)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
61 return 0
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
62
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
63 def do_pop(handler, server, user='', password=''):
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
64 '''Read a series of messages from the specified POP server.
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
65 '''
491
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
66 import getpass, poplib, socket
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
67 if not user:
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
68 user = raw_input(_('User: '))
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
69 if not password:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
70 password = getpass.getpass()
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
71
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
72 # open a connection to the server and retrieve all messages
491
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
73 try:
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
74 server = poplib.POP3(server)
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
75 except socket.error, message:
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
76 print "POP server error:", message
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
77 return 1
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
78 server.user(user)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
79 server.pass_(password)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
80 numMessages = len(server.list()[1])
375
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
81 for i in range(1, numMessages+1):
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
82 # retr: returns
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
83 # [ pop response e.g. '+OK 459 octets',
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
84 # [ array of message lines ],
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
85 # number of octets ]
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
86 lines = server.retr(i)[1]
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
87 s = cStringIO.StringIO('\n'.join(lines))
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
88 s.seek(0)
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
89 handler.handle_Message(Message(s))
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
90 # delete the message
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
91 server.dele(i)
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
92
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
93 # quit the server to commit changes.
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
94 server.quit()
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
95 return 0
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
96
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
97 def usage(args, message=None):
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
98 if message is not None:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
99 print message
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
100 print _('Usage: %(program)s <instance home> [source spec]')%{'program': args[0]}
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
101 print _('''
369
4850c86bfd89 More roundup-mailgw usage help.
Richard Jones <richard@users.sourceforge.net>
parents: 368
diff changeset
102 The roundup mail gateway may be called in one of two ways:
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
103 . with an instance home as the only argument,
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
104 . with both an instance home and a mail spool file, or
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
105 . with both an instance home and a pop server account.
369
4850c86bfd89 More roundup-mailgw usage help.
Richard Jones <richard@users.sourceforge.net>
parents: 368
diff changeset
106
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
107 PIPE:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
108 In the first case, the mail gateway reads a single message from the
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
109 standard input and submits the message to the roundup.mailgw module.
27
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
111 UNIX mailbox:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
112 In the second case, the gateway reads all messages from the mail spool
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
113 file and submits each in turn to the roundup.mailgw module. The file is
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
114 emptied once all messages have been successfully handled. The file is
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
115 specified as:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
116 mailbox /path/to/mailbox
27
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
118 POP:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
119 In the third case, the gateway reads all messages from the POP server
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
120 specified and submits each in turn to the roundup.mailgw module. The
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
121 server is specified as:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
122 pop username:password@server
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
123 The username and password may be omitted:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
124 pop username@server
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
125 pop server
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
126 are both valid. The username and/or password will be prompted for if
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
127 not supplied on the command-line.
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
128 ''')
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
129 return 1
367
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
130
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
131 def main(args):
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
132 '''Handle the arguments to the program and initialise environment.
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
133 '''
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
134 # figure the instance home
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
135 if len(args) > 1:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
136 instance_home = args[1]
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
137 else:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
138 instance_home = os.environ.get('ROUNDUP_INSTANCE', '')
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
139 if not instance_home:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
140 return usage(args)
367
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
141
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
142 # get the instance
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
143 import roundup.instance
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
144 instance = roundup.instance.open(instance_home)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
145
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
146 # get a mail handler
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
147 db = instance.open('admin')
389
7d7cb5319fc0 re-open the database as the author in mail handling
Richard Jones <richard@users.sourceforge.net>
parents: 375
diff changeset
148 handler = instance.MailGW(instance, db)
367
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
149
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
150 # if there's no more arguments, read a single message from stdin
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
151 if len(args) == 2:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
152 return do_pipe(handler)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
153
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
154 # otherwise, figure what sort of mail source to handle
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
155 if len(args) < 4:
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
156 return usage(args, _('Error: not enough source specification information'))
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
157 source, specification = args[2:]
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
158 if source == 'mailbox':
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
159 return do_mailbox(handler, specification)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
160 elif source == 'pop':
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
161 m = re.match(r'((?P<user>[^:]+)(:(?P<pass>.+))?@)?(?P<server>.+)',
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
162 specification)
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
163 if m:
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
164 return do_pop(handler, m.group('server'), m.group('user'),
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
165 m.group('pass'))
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
166 return usage(args, _('Error: pop specification not valid'))
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
167
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
168 return usage(args, _('Error: The source must be either "mailbox" or "pop"'))
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
169
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
170 # call main
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
171 if __name__ == '__main__':
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
172 sys.exit(main(sys.argv))
27
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 #
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 # $Log: not supported by cvs2svn $
491
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
176 # Revision 1.19 2002/01/05 02:19:03 richard
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
177 # i18n'ification
ade1e4bfefc9 [SF#500329] exception on server not reachable-patch
Richard Jones <richard@users.sourceforge.net>
parents: 485
diff changeset
178 #
485
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
179 # Revision 1.18 2001/12/13 00:20:01 richard
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
180 # . Centralised the python version check code, bumped version to 2.1.1 (really
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
181 # needs to be 2.1.2, but that isn't released yet :)
fad315a10185 i18n'ification
Richard Jones <richard@users.sourceforge.net>
parents: 449
diff changeset
182 #
449
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
183 # Revision 1.17 2001/12/02 05:06:16 richard
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
184 # . We now use weakrefs in the Classes to keep the database reference, so
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
185 # the close() method on the database is no longer needed.
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
186 # I bumped the minimum python requirement up to 2.1 accordingly.
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
187 # . #487480 ] roundup-server
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
188 # . #487476 ] INSTALL.txt
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
189 #
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
190 # I also cleaned up the change message / post-edit stuff in the cgi client.
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
191 # There's now a clearly marked "TODO: append the change note" where I believe
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
192 # the change note should be added there. The "changes" list will obviously
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
193 # have to be modified to be a dict of the changes, or somesuch.
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
194 #
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
195 # More testing needed.
141aacfdb34f Centralised the python version check code, bumped version to 2.1.1
Richard Jones <richard@users.sourceforge.net>
parents: 431
diff changeset
196 #
431
a28a80b714f9 Eliminate database close method by using weakrefs.
Richard Jones <richard@users.sourceforge.net>
parents: 427
diff changeset
197 # Revision 1.16 2001/11/30 18:23:55 jhermann
a28a80b714f9 Eliminate database close method by using weakrefs.
Richard Jones <richard@users.sourceforge.net>
parents: 427
diff changeset
198 # Cleaned up strange import (less pollution, too)
a28a80b714f9 Eliminate database close method by using weakrefs.
Richard Jones <richard@users.sourceforge.net>
parents: 427
diff changeset
199 #
427
5164f3141159 Cleaned up strange import (less pollution, too)
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 426
diff changeset
200 # Revision 1.15 2001/11/30 13:16:37 rochecompaan
5164f3141159 Cleaned up strange import (less pollution, too)
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 426
diff changeset
201 # Fixed bug. Mail gateway was not using the extended Message class
5164f3141159 Cleaned up strange import (less pollution, too)
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 426
diff changeset
202 # resulting in failed submissions when mails were processed from a Unix
5164f3141159 Cleaned up strange import (less pollution, too)
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 426
diff changeset
203 # mailbox
5164f3141159 Cleaned up strange import (less pollution, too)
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 426
diff changeset
204 #
426
fe89e341816b Fixed bug. Mail gateway was not using the extended Message class...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 389
diff changeset
205 # Revision 1.14 2001/11/13 21:44:44 richard
fe89e341816b Fixed bug. Mail gateway was not using the extended Message class...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 389
diff changeset
206 # . re-open the database as the author in mail handling
fe89e341816b Fixed bug. Mail gateway was not using the extended Message class...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents: 389
diff changeset
207 #
389
7d7cb5319fc0 re-open the database as the author in mail handling
Richard Jones <richard@users.sourceforge.net>
parents: 375
diff changeset
208 # Revision 1.13 2001/11/09 01:05:55 richard
7d7cb5319fc0 re-open the database as the author in mail handling
Richard Jones <richard@users.sourceforge.net>
parents: 375
diff changeset
209 # Fixed bug #479511 ] mailgw to pop once engelbert gruber tested the POP
7d7cb5319fc0 re-open the database as the author in mail handling
Richard Jones <richard@users.sourceforge.net>
parents: 375
diff changeset
210 # gateway.
7d7cb5319fc0 re-open the database as the author in mail handling
Richard Jones <richard@users.sourceforge.net>
parents: 375
diff changeset
211 #
375
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
212 # Revision 1.12 2001/11/08 05:16:55 richard
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
213 # Rolled roundup-popgw into roundup-mailgw. Cleaned mailgw up significantly,
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
214 # tested unix mailbox some more. POP still untested.
2ff102523713 Fixed [SF#479511]: mailgw to pop
Richard Jones <richard@users.sourceforge.net>
parents: 373
diff changeset
215 #
373
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
216 # Revision 1.11 2001/11/07 05:32:58 richard
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
217 # More roundup-mailgw usage help.
ee399750fa5f Rolled roundup-popgw into roundup-mailgw.
Richard Jones <richard@users.sourceforge.net>
parents: 369
diff changeset
218 #
369
4850c86bfd89 More roundup-mailgw usage help.
Richard Jones <richard@users.sourceforge.net>
parents: 368
diff changeset
219 # Revision 1.10 2001/11/07 05:30:11 richard
4850c86bfd89 More roundup-mailgw usage help.
Richard Jones <richard@users.sourceforge.net>
parents: 368
diff changeset
220 # Nicer usage message.
4850c86bfd89 More roundup-mailgw usage help.
Richard Jones <richard@users.sourceforge.net>
parents: 368
diff changeset
221 #
368
0020819bf9b8 Nicer usage message.
Richard Jones <richard@users.sourceforge.net>
parents: 367
diff changeset
222 # Revision 1.9 2001/11/07 05:29:26 richard
0020819bf9b8 Nicer usage message.
Richard Jones <richard@users.sourceforge.net>
parents: 367
diff changeset
223 # Modified roundup-mailgw so it can read e-mails from a local mail spool
0020819bf9b8 Nicer usage message.
Richard Jones <richard@users.sourceforge.net>
parents: 367
diff changeset
224 # file. Truncates the spool file after parsing.
0020819bf9b8 Nicer usage message.
Richard Jones <richard@users.sourceforge.net>
parents: 367
diff changeset
225 # Fixed a couple of small bugs introduced in roundup.mailgw when I started
0020819bf9b8 Nicer usage message.
Richard Jones <richard@users.sourceforge.net>
parents: 367
diff changeset
226 # the popgw.
0020819bf9b8 Nicer usage message.
Richard Jones <richard@users.sourceforge.net>
parents: 367
diff changeset
227 #
367
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
228 # Revision 1.8 2001/11/01 22:04:37 richard
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
229 # Started work on supporting a pop3-fetching server
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
230 # Fixed bugs:
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
231 # . bug #477104 ] HTML tag error in roundup-server
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
232 # . bug #477107 ] HTTP header problem
5140ccaaab1b Modified roundup-mailgw so it can read e-mails from a local mail spool file.
Richard Jones <richard@users.sourceforge.net>
parents: 343
diff changeset
233 #
343
ab16997d9cda Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
234 # Revision 1.7 2001/08/07 00:24:42 richard
ab16997d9cda Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
235 # stupid typo
ab16997d9cda Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents: 214
diff changeset
236 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
237 # Revision 1.6 2001/08/07 00:15:51 richard
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
238 # Added the copyright/license notice to (nearly) all files at request of
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
239 # Bizar Software.
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
240 #
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
241 # Revision 1.5 2001/08/05 07:44:25 richard
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
242 # Instances are now opened by a special function that generates a unique
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
243 # module name for the instances on import time.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 204
diff changeset
244 #
204
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents: 193
diff changeset
245 # Revision 1.4 2001/08/03 01:28:33 richard
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents: 193
diff changeset
246 # Used the much nicer load_package, pointed out by Steve Majewski.
c1461733cbf9 Instances are now opened by a special function...
Richard Jones <richard@users.sourceforge.net>
parents: 193
diff changeset
247 #
193
241a0323aacb Used the much nicer load_package, pointed out by Steve Majewski.
Richard Jones <richard@users.sourceforge.net>
parents: 190
diff changeset
248 # Revision 1.3 2001/08/03 00:59:34 richard
241a0323aacb Used the much nicer load_package, pointed out by Steve Majewski.
Richard Jones <richard@users.sourceforge.net>
parents: 190
diff changeset
249 # Instance import now imports the instance using imp.load_module so that
241a0323aacb Used the much nicer load_package, pointed out by Steve Majewski.
Richard Jones <richard@users.sourceforge.net>
parents: 190
diff changeset
250 # we can have instance homes of "roundup" or other existing python package
241a0323aacb Used the much nicer load_package, pointed out by Steve Majewski.
Richard Jones <richard@users.sourceforge.net>
parents: 190
diff changeset
251 # names.
241a0323aacb Used the much nicer load_package, pointed out by Steve Majewski.
Richard Jones <richard@users.sourceforge.net>
parents: 190
diff changeset
252 #
190
996eaf90c01e Instance import now imports the instance using imp.load_module...
Richard Jones <richard@users.sourceforge.net>
parents: 127
diff changeset
253 # Revision 1.2 2001/07/29 07:01:39 richard
996eaf90c01e Instance import now imports the instance using imp.load_module...
Richard Jones <richard@users.sourceforge.net>
parents: 127
diff changeset
254 # Added vim command to all source so that we don't get no steenkin' tabs :)
996eaf90c01e Instance import now imports the instance using imp.load_module...
Richard Jones <richard@users.sourceforge.net>
parents: 127
diff changeset
255 #
127
0791d13baea7 Added vim command to all source so that we don't get no steenkin' tabs :)
Richard Jones <richard@users.sourceforge.net>
parents: 27
diff changeset
256 # Revision 1.1 2001/07/23 03:46:48 richard
0791d13baea7 Added vim command to all source so that we don't get no steenkin' tabs :)
Richard Jones <richard@users.sourceforge.net>
parents: 27
diff changeset
257 # moving the bin files to facilitate out-of-the-boxness
0791d13baea7 Added vim command to all source so that we don't get no steenkin' tabs :)
Richard Jones <richard@users.sourceforge.net>
parents: 27
diff changeset
258 #
27
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 # Revision 1.1 2001/07/22 11:15:45 richard
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 # More Grande Splite stuff
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 #
e5e9ea306a09 moving the bin files to facilitate out-of-the-boxness
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 #
127
0791d13baea7 Added vim command to all source so that we don't get no steenkin' tabs :)
Richard Jones <richard@users.sourceforge.net>
parents: 27
diff changeset
263 # vim: set filetype=python ts=4 sw=4 et si

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