From: jhermann Date: Tue, 29 Jan 2002 19:53:08 +0000 (+0000) Subject: Moved scripts from top-level dir to roundup.scripts subpackage X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=21966fc340ecdf2194c1425bbdaa0ff6f877f8f6;p=roundup.git Moved scripts from top-level dir to roundup.scripts subpackage git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@605 57a73879-2fb5-44c3-a270-3262357dd7e2 --- diff --git a/roundup/scripts/roundup_admin.py b/roundup/scripts/roundup_admin.py new file mode 100644 index 0000000..42fffb8 --- /dev/null +++ b/roundup/scripts/roundup_admin.py @@ -0,0 +1,316 @@ +#! /usr/bin/env python +# +# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) +# This module is free software, and you may redistribute it and/or modify +# under the same terms as Python, so long as this copyright message and +# disclaimer are retained in their original form. +# +# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING +# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" +# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# +# $Id: roundup_admin.py,v 1.1 2002-01-29 19:53:08 jhermann Exp $ + +# python version check +from roundup import version_check + +# import the admin tool guts and make it go +from roundup.admin import AdminTool +from roundup.i18n import _ + +import sys +tool = AdminTool() +sys.exit(tool.main()) + +# +# $Log: not supported by cvs2svn $ +# Revision 1.61 2002/01/05 02:21:21 richard +# fixes +# +# Revision 1.60 2002/01/05 02:11:22 richard +# I18N'ed roundup admin - and split the code off into a module so it can be used +# elsewhere. +# Big issue with this is the doc strings - that's the help. We're probably going to +# have to switch to not use docstrings, which will suck a little :( +# +# Revision 1.59 2001/12/31 05:20:34 richard +# . #496360 ] table width does not work +# +# Revision 1.58 2001/12/31 05:12:52 richard +# actually handle the advertised response to "commit y/N?" +# +# Revision 1.57 2001/12/31 05:12:01 richard +# added some quoting instructions to roundup-admin +# +# Revision 1.56 2001/12/31 05:09:20 richard +# Added better tokenising to roundup-admin - handles spaces and stuff. Can +# use quoting or backslashes. See the roundup.token pydoc. +# +# Revision 1.55 2001/12/17 03:52:47 richard +# Implemented file store rollback. As a bonus, the hyperdb is now capable of +# storing more than one file per node - if a property name is supplied, +# the file is called designator.property. +# I decided not to migrate the existing files stored over to the new naming +# scheme - the FileClass just doesn't specify the property name. +# +# Revision 1.54 2001/12/15 23:09:23 richard +# Some cleanups in roundup-admin, also made it work again... +# +# Revision 1.53 2001/12/13 00:20:00 richard +# . Centralised the python version check code, bumped version to 2.1.1 (really +# needs to be 2.1.2, but that isn't released yet :) +# +# Revision 1.52 2001/12/12 21:47:45 richard +# . Message author's name appears in From: instead of roundup instance name +# (which still appears in the Reply-To:) +# . envelope-from is now set to the roundup-admin and not roundup itself so +# delivery reports aren't sent to roundup (thanks Patrick Ohly) +# +# Revision 1.51 2001/12/10 00:57:38 richard +# From CHANGES: +# . Added the "display" command to the admin tool - displays a node's values +# . #489760 ] [issue] only subject +# . fixed the doc/index.html to include the quoting in the mail alias. +# +# Also: +# . fixed roundup-admin so it works with transactions +# . disabled the back_anydbm module if anydbm tries to use dumbdbm +# +# Revision 1.50 2001/12/02 05:06:16 richard +# . We now use weakrefs in the Classes to keep the database reference, so +# the close() method on the database is no longer needed. +# I bumped the minimum python requirement up to 2.1 accordingly. +# . #487480 ] roundup-server +# . #487476 ] INSTALL.txt +# +# I also cleaned up the change message / post-edit stuff in the cgi client. +# There's now a clearly marked "TODO: append the change note" where I believe +# the change note should be added there. The "changes" list will obviously +# have to be modified to be a dict of the changes, or somesuch. +# +# More testing needed. +# +# Revision 1.49 2001/12/01 07:17:50 richard +# . We now have basic transaction support! Information is only written to +# the database when the commit() method is called. Only the anydbm +# backend is modified in this way - neither of the bsddb backends have been. +# The mail, admin and cgi interfaces all use commit (except the admin tool +# doesn't have a commit command, so interactive users can't commit...) +# . Fixed login/registration forwarding the user to the right page (or not, +# on a failure) +# +# Revision 1.48 2001/11/27 22:32:03 richard +# typo +# +# Revision 1.47 2001/11/26 22:55:56 richard +# Feature: +# . Added INSTANCE_NAME to configuration - used in web and email to identify +# the instance. +# . Added EMAIL_SIGNATURE_POSITION to indicate where to place the roundup +# signature info in e-mails. +# . Some more flexibility in the mail gateway and more error handling. +# . Login now takes you to the page you back to the were denied access to. +# +# Fixed: +# . Lots of bugs, thanks Roché and others on the devel mailing list! +# +# Revision 1.46 2001/11/21 03:40:54 richard +# more new property handling +# +# Revision 1.45 2001/11/12 22:51:59 jhermann +# Fixed option & associated error handling +# +# Revision 1.44 2001/11/12 22:01:06 richard +# Fixed issues with nosy reaction and author copies. +# +# Revision 1.43 2001/11/09 22:33:28 richard +# More error handling fixes. +# +# Revision 1.42 2001/11/09 10:11:08 richard +# . roundup-admin now handles all hyperdb exceptions +# +# Revision 1.41 2001/11/09 01:25:40 richard +# Should parse with python 1.5.2 now. +# +# Revision 1.40 2001/11/08 04:42:00 richard +# Expanded the already-abbreviated "initialise" and "specification" commands, +# and added a comment to the command help about the abbreviation. +# +# Revision 1.39 2001/11/08 04:29:59 richard +# roundup-admin now accepts abbreviated commands (eg. l = li = lis = list) +# [thanks Engelbert Gruber for the inspiration] +# +# Revision 1.38 2001/11/05 23:45:40 richard +# Fixed newuser_action so it sets the cookie with the unencrypted password. +# Also made it present nicer error messages (not tracebacks). +# +# Revision 1.37 2001/10/23 01:00:18 richard +# Re-enabled login and registration access after lopping them off via +# disabling access for anonymous users. +# Major re-org of the htmltemplate code, cleaning it up significantly. Fixed +# a couple of bugs while I was there. Probably introduced a couple, but +# things seem to work OK at the moment. +# +# Revision 1.36 2001/10/21 00:45:15 richard +# Added author identification to e-mail messages from roundup. +# +# Revision 1.35 2001/10/20 11:58:48 richard +# Catch errors in login - no username or password supplied. +# Fixed editing of password (Password property type) thanks Roch'e Compaan. +# +# Revision 1.34 2001/10/18 02:16:42 richard +# Oops, committed the admin script with the wierd #! line. +# Also, made the thing into a class to reduce parameter passing. +# Nuked the leading whitespace from the help __doc__ displays too. +# +# Revision 1.33 2001/10/17 23:13:19 richard +# Did a fair bit of work on the admin tool. Now has an extra command "table" +# which displays node information in a tabular format. Also fixed import and +# export so they work. Removed freshen. +# Fixed quopri usage in mailgw from bug reports. +# +# Revision 1.32 2001/10/17 06:57:29 richard +# Interactive startup blurb - need to figure how to get the version in there. +# +# Revision 1.31 2001/10/17 06:17:26 richard +# Now with readline support :) +# +# Revision 1.30 2001/10/17 06:04:00 richard +# Beginnings of an interactive mode for roundup-admin +# +# Revision 1.29 2001/10/16 03:48:01 richard +# admin tool now complains if a "find" is attempted with a non-link property. +# +# Revision 1.28 2001/10/13 00:07:39 richard +# More help in admin tool. +# +# Revision 1.27 2001/10/11 23:43:04 richard +# Implemented the comma-separated printing option in the admin tool. +# Fixed a typo (more of a vim-o actually :) in mailgw. +# +# Revision 1.26 2001/10/11 05:03:51 richard +# Marked the roundup-admin import/export as experimental since they're not fully +# operational. +# +# Revision 1.25 2001/10/10 04:12:32 richard +# The setup.cfg file is just causing pain. Away it goes. +# +# Revision 1.24 2001/10/10 03:54:57 richard +# Added database importing and exporting through CSV files. +# Uses the csv module from object-craft for exporting if it's available. +# Requires the csv module for importing. +# +# Revision 1.23 2001/10/09 23:36:25 richard +# Spit out command help if roundup-admin command doesn't get an argument. +# +# Revision 1.22 2001/10/09 07:25:59 richard +# Added the Password property type. See "pydoc roundup.password" for +# implementation details. Have updated some of the documentation too. +# +# Revision 1.21 2001/10/05 02:23:24 richard +# . roundup-admin create now prompts for property info if none is supplied +# on the command-line. +# . hyperdb Class getprops() method may now return only the mutable +# properties. +# . Login now uses cookies, which makes it a whole lot more flexible. We can +# now support anonymous user access (read-only, unless there's an +# "anonymous" user, in which case write access is permitted). Login +# handling has been moved into cgi_client.Client.main() +# . The "extended" schema is now the default in roundup init. +# . The schemas have had their page headings modified to cope with the new +# login handling. Existing installations should copy the interfaces.py +# file from the roundup lib directory to their instance home. +# . Incorrectly had a Bizar Software copyright on the cgitb.py module from +# Ping - has been removed. +# . Fixed a whole bunch of places in the CGI interface where we should have +# been returning Not Found instead of throwing an exception. +# . Fixed a deviation from the spec: trying to modify the 'id' property of +# an item now throws an exception. +# +# Revision 1.20 2001/10/04 02:12:42 richard +# Added nicer command-line item adding: passing no arguments will enter an +# interactive more which asks for each property in turn. While I was at it, I +# fixed an implementation problem WRT the spec - I wasn't raising a +# ValueError if the key property was missing from a create(). Also added a +# protected=boolean argument to getprops() so we can list only the mutable +# properties (defaults to yes, which lists the immutables). +# +# Revision 1.19 2001/10/01 06:40:43 richard +# made do_get have the args in the correct order +# +# Revision 1.18 2001/09/18 22:58:37 richard +# +# Added some more help to roundu-admin +# +# Revision 1.17 2001/08/28 05:58:33 anthonybaxter +# added missing 'import' statements. +# +# Revision 1.16 2001/08/12 06:32:36 richard +# using isinstance(blah, Foo) now instead of isFooType +# +# Revision 1.15 2001/08/07 00:24:42 richard +# stupid typo +# +# Revision 1.14 2001/08/07 00:15:51 richard +# Added the copyright/license notice to (nearly) all files at request of +# Bizar Software. +# +# Revision 1.13 2001/08/05 07:44:13 richard +# Instances are now opened by a special function that generates a unique +# module name for the instances on import time. +# +# Revision 1.12 2001/08/03 01:28:33 richard +# Used the much nicer load_package, pointed out by Steve Majewski. +# +# Revision 1.11 2001/08/03 00:59:34 richard +# Instance import now imports the instance using imp.load_module so that +# we can have instance homes of "roundup" or other existing python package +# names. +# +# Revision 1.10 2001/07/30 08:12:17 richard +# Added time logging and file uploading to the templates. +# +# Revision 1.9 2001/07/30 03:52:55 richard +# init help now lists templates and backends +# +# Revision 1.8 2001/07/30 02:37:07 richard +# Freshen is really broken. Commented out. +# +# Revision 1.7 2001/07/30 01:28:46 richard +# Bugfixes +# +# Revision 1.6 2001/07/30 00:57:51 richard +# Now uses getopt, much improved command-line parsing. Much fuller help. Much +# better internal structure. It's just BETTER. :) +# +# Revision 1.5 2001/07/30 00:04:48 richard +# Made the "init" prompting more friendly. +# +# Revision 1.4 2001/07/29 07:01:39 richard +# Added vim command to all source so that we don't get no steenkin' tabs :) +# +# Revision 1.3 2001/07/23 08:45:28 richard +# ok, so now "./roundup-admin init" will ask questions in an attempt to get a +# workable instance_home set up :) +# _and_ anydbm has had its first test :) +# +# Revision 1.2 2001/07/23 08:20:44 richard +# Moved over to using marshal in the bsddb and anydbm backends. +# roundup-admin now has a "freshen" command that'll load/save all nodes (not +# retired - mod hyperdb.Class.list() so it lists retired nodes) +# +# Revision 1.1 2001/07/23 03:46:48 richard +# moving the bin files to facilitate out-of-the-boxness +# +# Revision 1.1 2001/07/22 11:15:45 richard +# More Grande Splite stuff +# +# +# vim: set filetype=python ts=4 sw=4 et si diff --git a/roundup/scripts/roundup_mailgw.py b/roundup/scripts/roundup_mailgw.py new file mode 100644 index 0000000..8e6faac --- /dev/null +++ b/roundup/scripts/roundup_mailgw.py @@ -0,0 +1,274 @@ +#! /usr/bin/python +# +# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) +# This module is free software, and you may redistribute it and/or modify +# under the same terms as Python, so long as this copyright message and +# disclaimer are retained in their original form. +# +# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING +# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" +# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# +# $Id: roundup_mailgw.py,v 1.1 2002-01-29 19:53:08 jhermann Exp $ + +# python version check +from roundup import version_check + +import sys, os, re, cStringIO + +from roundup.mailgw import Message +from roundup.i18n import _ + +def do_pipe(handler): + '''Read a message from standard input and pass it to the mail handler. + ''' + handler.main(sys.stdin) + return 0 + +def do_mailbox(handler, filename): + '''Read a series of messages from the specified unix mailbox file and + pass each to the mail handler. + ''' + # open the spool file and lock it + import fcntl, FCNTL + f = open(filename, 'r+') + fcntl.flock(f.fileno(), FCNTL.LOCK_EX) + + # handle and clear the mailbox + try: + from mailbox import UnixMailbox + mailbox = UnixMailbox(f, factory=Message) + # grab one message + message = mailbox.next() + while message: + # call the instance mail handler + handler.handle_Message(message) + message = mailbox.next() + # nuke the file contents + os.ftruncate(f.fileno(), 0) + except: + import traceback + traceback.print_exc() + return 1 + fcntl.flock(f.fileno(), FCNTL.LOCK_UN) + return 0 + +def do_pop(handler, server, user='', password=''): + '''Read a series of messages from the specified POP server. + ''' + import getpass, poplib, socket + try: + if not user: + user = raw_input(_('User: ')) + if not password: + password = getpass.getpass() + except (KeyboardInterrupt, EOFError): + # Ctrl C or D maybe also Ctrl Z under Windows. + print "\nAborted by user." + return 1 + + # open a connection to the server and retrieve all messages + try: + server = poplib.POP3(server) + except socket.error, message: + print "POP server error:", message + return 1 + server.user(user) + server.pass_(password) + numMessages = len(server.list()[1]) + for i in range(1, numMessages+1): + # retr: returns + # [ pop response e.g. '+OK 459 octets', + # [ array of message lines ], + # number of octets ] + lines = server.retr(i)[1] + s = cStringIO.StringIO('\n'.join(lines)) + s.seek(0) + handler.handle_Message(Message(s)) + # delete the message + server.dele(i) + + # quit the server to commit changes. + server.quit() + return 0 + +def usage(args, message=None): + if message is not None: + print message + print _('Usage: %(program)s [source spec]')%{'program': args[0]} + print _(''' +The roundup mail gateway may be called in one of two ways: + . with an instance home as the only argument, + . with both an instance home and a mail spool file, or + . with both an instance home and a pop server account. + +PIPE: + In the first case, the mail gateway reads a single message from the + standard input and submits the message to the roundup.mailgw module. + +UNIX mailbox: + In the second case, the gateway reads all messages from the mail spool + file and submits each in turn to the roundup.mailgw module. The file is + emptied once all messages have been successfully handled. The file is + specified as: + mailbox /path/to/mailbox + +POP: + In the third case, the gateway reads all messages from the POP server + specified and submits each in turn to the roundup.mailgw module. The + server is specified as: + pop username:password@server + The username and password may be omitted: + pop username@server + pop server + are both valid. The username and/or password will be prompted for if + not supplied on the command-line. +''') + return 1 + +def main(args): + '''Handle the arguments to the program and initialise environment. + ''' + # figure the instance home + if len(args) > 1: + instance_home = args[1] + else: + instance_home = os.environ.get('ROUNDUP_INSTANCE', '') + if not instance_home: + return usage(args) + + # get the instance + import roundup.instance + instance = roundup.instance.open(instance_home) + + # get a mail handler + db = instance.open('admin') + handler = instance.MailGW(instance, db) + + # if there's no more arguments, read a single message from stdin + if len(args) == 2: + return do_pipe(handler) + + # otherwise, figure what sort of mail source to handle + if len(args) < 4: + return usage(args, _('Error: not enough source specification information')) + source, specification = args[2:] + if source == 'mailbox': + return do_mailbox(handler, specification) + elif source == 'pop': + m = re.match(r'((?P[^:]+)(:(?P.+))?@)?(?P.+)', + specification) + if m: + return do_pop(handler, m.group('server'), m.group('user'), + m.group('pass')) + return usage(args, _('Error: pop specification not valid')) + + return usage(args, _('Error: The source must be either "mailbox" or "pop"')) + +# call main +if __name__ == '__main__': + sys.exit(main(sys.argv)) + +# +# $Log: not supported by cvs2svn $ +# Revision 1.21 2002/01/11 07:02:29 grubert +# put an exception around: do_pop user and password entry to catch ctrl-c/d. +# +# Revision 1.20 2002/01/07 10:43:48 richard +# #500329 ] exception on server not reachable-patch +# +# Revision 1.19 2002/01/05 02:19:03 richard +# i18n'ification +# +# Revision 1.18 2001/12/13 00:20:01 richard +# . Centralised the python version check code, bumped version to 2.1.1 (really +# needs to be 2.1.2, but that isn't released yet :) +# +# Revision 1.17 2001/12/02 05:06:16 richard +# . We now use weakrefs in the Classes to keep the database reference, so +# the close() method on the database is no longer needed. +# I bumped the minimum python requirement up to 2.1 accordingly. +# . #487480 ] roundup-server +# . #487476 ] INSTALL.txt +# +# I also cleaned up the change message / post-edit stuff in the cgi client. +# There's now a clearly marked "TODO: append the change note" where I believe +# the change note should be added there. The "changes" list will obviously +# have to be modified to be a dict of the changes, or somesuch. +# +# More testing needed. +# +# Revision 1.16 2001/11/30 18:23:55 jhermann +# Cleaned up strange import (less pollution, too) +# +# Revision 1.15 2001/11/30 13:16:37 rochecompaan +# Fixed bug. Mail gateway was not using the extended Message class +# resulting in failed submissions when mails were processed from a Unix +# mailbox +# +# Revision 1.14 2001/11/13 21:44:44 richard +# . re-open the database as the author in mail handling +# +# Revision 1.13 2001/11/09 01:05:55 richard +# Fixed bug #479511 ] mailgw to pop once engelbert gruber tested the POP +# gateway. +# +# Revision 1.12 2001/11/08 05:16:55 richard +# Rolled roundup-popgw into roundup-mailgw. Cleaned mailgw up significantly, +# tested unix mailbox some more. POP still untested. +# +# Revision 1.11 2001/11/07 05:32:58 richard +# More roundup-mailgw usage help. +# +# Revision 1.10 2001/11/07 05:30:11 richard +# Nicer usage message. +# +# Revision 1.9 2001/11/07 05:29:26 richard +# Modified roundup-mailgw so it can read e-mails from a local mail spool +# file. Truncates the spool file after parsing. +# Fixed a couple of small bugs introduced in roundup.mailgw when I started +# the popgw. +# +# Revision 1.8 2001/11/01 22:04:37 richard +# Started work on supporting a pop3-fetching server +# Fixed bugs: +# . bug #477104 ] HTML tag error in roundup-server +# . bug #477107 ] HTTP header problem +# +# Revision 1.7 2001/08/07 00:24:42 richard +# stupid typo +# +# Revision 1.6 2001/08/07 00:15:51 richard +# Added the copyright/license notice to (nearly) all files at request of +# Bizar Software. +# +# Revision 1.5 2001/08/05 07:44:25 richard +# Instances are now opened by a special function that generates a unique +# module name for the instances on import time. +# +# Revision 1.4 2001/08/03 01:28:33 richard +# Used the much nicer load_package, pointed out by Steve Majewski. +# +# Revision 1.3 2001/08/03 00:59:34 richard +# Instance import now imports the instance using imp.load_module so that +# we can have instance homes of "roundup" or other existing python package +# names. +# +# Revision 1.2 2001/07/29 07:01:39 richard +# Added vim command to all source so that we don't get no steenkin' tabs :) +# +# Revision 1.1 2001/07/23 03:46:48 richard +# moving the bin files to facilitate out-of-the-boxness +# +# Revision 1.1 2001/07/22 11:15:45 richard +# More Grande Splite stuff +# +# +# vim: set filetype=python ts=4 sw=4 et si diff --git a/roundup/scripts/roundup_server.py b/roundup/scripts/roundup_server.py new file mode 100644 index 0000000..a6a2083 --- /dev/null +++ b/roundup/scripts/roundup_server.py @@ -0,0 +1,378 @@ +#!/usr/bin/python +# +# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) +# This module is free software, and you may redistribute it and/or modify +# under the same terms as Python, so long as this copyright message and +# disclaimer are retained in their original form. +# +# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING +# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" +# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# +""" HTTP Server that serves roundup. + +$Id: roundup_server.py,v 1.1 2002-01-29 19:53:08 jhermann Exp $ +""" + +# python version check +from roundup import version_check + +import sys, os, urllib, StringIO, traceback, cgi, binascii, getopt, imp +import BaseHTTPServer + +# Roundup modules of use here +from roundup import cgitb, cgi_client +import roundup.instance +from roundup.i18n import _ + +# +## Configuration +# + +# This indicates where the Roundup instance lives +ROUNDUP_INSTANCE_HOMES = { + 'bar': '/tmp/bar', +} + +ROUNDUP_USER = None + + +# Where to log debugging information to. Use an instance of DevNull if you +# don't want to log anywhere. +# TODO: actually use this stuff +#class DevNull: +# def write(self, info): +# pass +#LOG = open('/var/log/roundup.cgi.log', 'a') +#LOG = DevNull() + +# +## end configuration +# + + +class RoundupRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): + ROUNDUP_INSTANCE_HOMES = ROUNDUP_INSTANCE_HOMES + ROUNDUP_USER = ROUNDUP_USER + + def run_cgi(self): + """ Execute the CGI command. Wrap an innner call in an error + handler so all errors can be caught. + """ + save_stdin = sys.stdin + sys.stdin = self.rfile + try: + self.inner_run_cgi() + except cgi_client.NotFound: + self.send_error(404, self.path) + except cgi_client.Unauthorised: + self.send_error(403, self.path) + except: + # it'd be nice to be able to detect if these are going to have + # any effect... + self.send_response(400) + self.send_header('Content-Type', 'text/html') + self.end_headers() + try: + reload(cgitb) + self.wfile.write(cgitb.breaker()) + self.wfile.write(cgitb.html()) + except: + self.wfile.write("
")
+                s = StringIO.StringIO()
+                traceback.print_exc(None, s)
+                self.wfile.write(cgi.escape(s.getvalue()))
+                self.wfile.write("
\n") + sys.stdin = save_stdin + + do_GET = do_POST = do_HEAD = send_head = run_cgi + + def index(self): + ''' Print up an index of the available instances + ''' + self.send_response(200) + self.send_header('Content-Type', 'text/html') + self.end_headers() + w = self.wfile.write + w(_('Roundup instances index\n')) + w(_('

Roundup instances index

    \n')) + for instance in self.ROUNDUP_INSTANCE_HOMES.keys(): + w(_('
  1. %(instance_name)s\n')%{ + 'instance_url': urllib.quote(instance), + 'instance_name': cgi.escape(instance)}) + w(_('
')) + + def inner_run_cgi(self): + ''' This is the inner part of the CGI handling + ''' + + rest = self.path + i = rest.rfind('?') + if i >= 0: + rest, query = rest[:i], rest[i+1:] + else: + query = '' + + # figure the instance + if rest == '/': + return self.index() + l_path = rest.split('/') + instance_name = urllib.unquote(l_path[1]) + if self.ROUNDUP_INSTANCE_HOMES.has_key(instance_name): + instance_home = self.ROUNDUP_INSTANCE_HOMES[instance_name] + instance = roundup.instance.open(instance_home) + else: + raise cgi_client.NotFound + + # figure out what the rest of the path is + if len(l_path) > 2: + rest = '/'.join(l_path[2:]) + else: + rest = '/' + + # Set up the CGI environment + env = {} + env['INSTANCE_NAME'] = instance_name + env['REQUEST_METHOD'] = self.command + env['PATH_INFO'] = urllib.unquote(rest) + if query: + env['QUERY_STRING'] = query + host = self.address_string() + if self.headers.typeheader is None: + env['CONTENT_TYPE'] = self.headers.type + else: + env['CONTENT_TYPE'] = self.headers.typeheader + length = self.headers.getheader('content-length') + if length: + env['CONTENT_LENGTH'] = length + co = filter(None, self.headers.getheaders('cookie')) + if co: + env['HTTP_COOKIE'] = ', '.join(co) + env['SCRIPT_NAME'] = '' + env['SERVER_NAME'] = self.server.server_name + env['SERVER_PORT'] = str(self.server.server_port) + + decoded_query = query.replace('+', ' ') + + # do the roundup thang + client = instance.Client(instance, self, env) + client.main() + +def usage(message=''): + if message: + message = _('Error: %(error)s\n\n')%{'error': message} + print _('''%(message)sUsage: +roundup-server [-n hostname] [-p port] [name=instance home]* + + -n: sets the host name + -p: sets the port to listen on + + name=instance home + Sets the instance home(s) to use. The name is how the instance is + identified in the URL (it's the first part of the URL path). The + instance home is the directory that was identified when you did + "roundup-admin init". You may specify any number of these name=home + pairs on the command-line. For convenience, you may edit the + ROUNDUP_INSTANCE_HOMES variable in the roundup-server file instead. +''')%locals() + sys.exit(0) + +def main(): + hostname = '' + port = 8080 + try: + # handle the command-line args + try: + optlist, args = getopt.getopt(sys.argv[1:], 'n:p:u:') + except getopt.GetoptError, e: + usage(str(e)) + + user = ROUNDUP_USER + for (opt, arg) in optlist: + if opt == '-n': hostname = arg + elif opt == '-p': port = int(arg) + elif opt == '-u': user = arg + elif opt == '-h': usage() + + if hasattr(os, 'getuid'): + # if root, setuid to the running user + if not os.getuid() and user is not None: + try: + import pwd + except ImportError: + raise ValueError, _("Can't change users - no pwd module") + try: + uid = pwd.getpwnam(user)[2] + except KeyError: + raise ValueError, _("User %(user)s doesn't exist")%locals() + os.setuid(uid) + elif os.getuid() and user is not None: + print _('WARNING: ignoring "-u" argument, not root') + + # People can remove this check if they're really determined + if not os.getuid() and user is None: + raise ValueError, _("Can't run as root!") + + # handle instance specs + if args: + d = {} + for arg in args: + try: + name, home = arg.split('=') + except ValueError: + raise ValueError, _("Instances must be name=home") + d[name] = home + RoundupRequestHandler.ROUNDUP_INSTANCE_HOMES = d + except SystemExit: + raise + except: + exc_type, exc_value = sys.exc_info()[:2] + usage('%s: %s'%(exc_type, exc_value)) + + # we don't want the cgi module interpreting the command-line args ;) + sys.argv = sys.argv[:1] + address = (hostname, port) + httpd = BaseHTTPServer.HTTPServer(address, RoundupRequestHandler) + print _('Roundup server started on %(address)s')%locals() + httpd.serve_forever() + +if __name__ == '__main__': + main() + +# +# $Log: not supported by cvs2svn $ +# Revision 1.25 2002/01/05 02:21:21 richard +# fixes +# +# Revision 1.24 2002/01/05 02:19:03 richard +# i18n'ification +# +# Revision 1.23 2001/12/15 23:47:07 richard +# sys module went away... +# +# Revision 1.22 2001/12/13 00:20:01 richard +# . Centralised the python version check code, bumped version to 2.1.1 (really +# needs to be 2.1.2, but that isn't released yet :) +# +# Revision 1.21 2001/12/02 05:06:16 richard +# . We now use weakrefs in the Classes to keep the database reference, so +# the close() method on the database is no longer needed. +# I bumped the minimum python requirement up to 2.1 accordingly. +# . #487480 ] roundup-server +# . #487476 ] INSTALL.txt +# +# I also cleaned up the change message / post-edit stuff in the cgi client. +# There's now a clearly marked "TODO: append the change note" where I believe +# the change note should be added there. The "changes" list will obviously +# have to be modified to be a dict of the changes, or somesuch. +# +# More testing needed. +# +# Revision 1.20 2001/11/26 22:55:56 richard +# Feature: +# . Added INSTANCE_NAME to configuration - used in web and email to identify +# the instance. +# . Added EMAIL_SIGNATURE_POSITION to indicate where to place the roundup +# signature info in e-mails. +# . Some more flexibility in the mail gateway and more error handling. +# . Login now takes you to the page you back to the were denied access to. +# +# Fixed: +# . Lots of bugs, thanks Roché and others on the devel mailing list! +# +# Revision 1.19 2001/11/12 22:51:04 jhermann +# Fixed option & associated error handling +# +# Revision 1.18 2001/11/01 22:04:37 richard +# Started work on supporting a pop3-fetching server +# Fixed bugs: +# . bug #477104 ] HTML tag error in roundup-server +# . bug #477107 ] HTTP header problem +# +# Revision 1.17 2001/10/29 23:55:44 richard +# Fix to CGI top-level index (thanks Juergen Hermann) +# +# Revision 1.16 2001/10/27 00:12:21 richard +# Fixed roundup-server for windows, thanks Juergen Hermann. +# +# Revision 1.15 2001/10/12 02:23:26 richard +# Didn't clean up after myself :) +# +# Revision 1.14 2001/10/12 02:20:32 richard +# server now handles setuid'ing much better +# +# Revision 1.13 2001/10/05 02:23:24 richard +# . roundup-admin create now prompts for property info if none is supplied +# on the command-line. +# . hyperdb Class getprops() method may now return only the mutable +# properties. +# . Login now uses cookies, which makes it a whole lot more flexible. We can +# now support anonymous user access (read-only, unless there's an +# "anonymous" user, in which case write access is permitted). Login +# handling has been moved into cgi_client.Client.main() +# . The "extended" schema is now the default in roundup init. +# . The schemas have had their page headings modified to cope with the new +# login handling. Existing installations should copy the interfaces.py +# file from the roundup lib directory to their instance home. +# . Incorrectly had a Bizar Software copyright on the cgitb.py module from +# Ping - has been removed. +# . Fixed a whole bunch of places in the CGI interface where we should have +# been returning Not Found instead of throwing an exception. +# . Fixed a deviation from the spec: trying to modify the 'id' property of +# an item now throws an exception. +# +# Revision 1.12 2001/09/29 13:27:00 richard +# CGI interfaces now spit up a top-level index of all the instances they can +# serve. +# +# Revision 1.11 2001/08/07 00:24:42 richard +# stupid typo +# +# Revision 1.10 2001/08/07 00:15:51 richard +# Added the copyright/license notice to (nearly) all files at request of +# Bizar Software. +# +# Revision 1.9 2001/08/05 07:44:36 richard +# Instances are now opened by a special function that generates a unique +# module name for the instances on import time. +# +# Revision 1.8 2001/08/03 01:28:33 richard +# Used the much nicer load_package, pointed out by Steve Majewski. +# +# Revision 1.7 2001/08/03 00:59:34 richard +# Instance import now imports the instance using imp.load_module so that +# we can have instance homes of "roundup" or other existing python package +# names. +# +# Revision 1.6 2001/07/29 07:01:39 richard +# Added vim command to all source so that we don't get no steenkin' tabs :) +# +# Revision 1.5 2001/07/24 01:07:59 richard +# Added command-line arg handling to roundup-server so it's more useful +# out-of-the-box. +# +# Revision 1.4 2001/07/23 10:31:45 richard +# disabled the reloading until it can be done properly +# +# Revision 1.3 2001/07/23 08:53:44 richard +# Fixed the ROUNDUPS decl in roundup-server +# Move the installation notes to INSTALL +# +# Revision 1.2 2001/07/23 04:05:05 anthonybaxter +# actually quit if python version wrong +# +# Revision 1.1 2001/07/23 03:46:48 richard +# moving the bin files to facilitate out-of-the-boxness +# +# Revision 1.1 2001/07/22 11:15:45 richard +# More Grande Splite stuff +# +# +# vim: set filetype=python ts=4 sw=4 et si