From 60cf9e87c6779c50aea51958c8a1609308658c70 Mon Sep 17 00:00:00 2001 From: jhermann Date: Tue, 29 Jan 2002 20:07:15 +0000 Subject: [PATCH] Conversion to generated script stubs git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@606 57a73879-2fb5-44c3-a270-3262357dd7e2 --- roundup-admin | 313 ------------------------- roundup-mailgw | 271 --------------------- roundup-server | 375 ------------------------------ roundup/scripts/__init__.py | 23 ++ roundup/scripts/roundup_admin.py | 14 +- roundup/scripts/roundup_mailgw.py | 10 +- roundup/scripts/roundup_server.py | 9 +- setup.py | 109 ++++++++- 8 files changed, 154 insertions(+), 970 deletions(-) delete mode 100755 roundup-admin delete mode 100755 roundup-mailgw delete mode 100755 roundup-server create mode 100644 roundup/scripts/__init__.py diff --git a/roundup-admin b/roundup-admin deleted file mode 100755 index 9a1f74c..0000000 --- a/roundup-admin +++ /dev/null @@ -1,313 +0,0 @@ -#! /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,v 1.61 2002-01-05 02:21:21 richard 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.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-mailgw b/roundup-mailgw deleted file mode 100755 index a75f438..0000000 --- a/roundup-mailgw +++ /dev/null @@ -1,271 +0,0 @@ -#! /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,v 1.21 2002-01-11 07:02:29 grubert 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.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-server b/roundup-server deleted file mode 100755 index 5c8222c..0000000 --- a/roundup-server +++ /dev/null @@ -1,375 +0,0 @@ -#!/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,v 1.25 2002-01-05 02:21:21 richard 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.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 diff --git a/roundup/scripts/__init__.py b/roundup/scripts/__init__.py new file mode 100644 index 0000000..c0c85c8 --- /dev/null +++ b/roundup/scripts/__init__.py @@ -0,0 +1,23 @@ +# +# 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: __init__.py,v 1.1 2002-01-29 20:07:15 jhermann Exp $ + +__doc__ = ''' +Subpackage containing the modules that implement the command line tools. +Note that these are imported by script stubs generated by "setup.py". +''' diff --git a/roundup/scripts/roundup_admin.py b/roundup/scripts/roundup_admin.py index 42fffb8..9596fe0 100644 --- a/roundup/scripts/roundup_admin.py +++ b/roundup/scripts/roundup_admin.py @@ -16,7 +16,7 @@ # 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 $ +# $Id: roundup_admin.py,v 1.2 2002-01-29 20:07:15 jhermann Exp $ # python version check from roundup import version_check @@ -26,11 +26,19 @@ from roundup.admin import AdminTool from roundup.i18n import _ import sys -tool = AdminTool() -sys.exit(tool.main()) + +def run(): + tool = AdminTool() + sys.exit(tool.main()) + +if __name__ == '__main__': + run() # # $Log: not supported by cvs2svn $ +# Revision 1.1 2002/01/29 19:53:08 jhermann +# Moved scripts from top-level dir to roundup.scripts subpackage +# # Revision 1.61 2002/01/05 02:21:21 richard # fixes # diff --git a/roundup/scripts/roundup_mailgw.py b/roundup/scripts/roundup_mailgw.py index 8e6faac..faec3d9 100644 --- a/roundup/scripts/roundup_mailgw.py +++ b/roundup/scripts/roundup_mailgw.py @@ -16,7 +16,7 @@ # 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 $ +# $Id: roundup_mailgw.py,v 1.2 2002-01-29 20:07:15 jhermann Exp $ # python version check from roundup import version_check @@ -172,12 +172,18 @@ def main(args): return usage(args, _('Error: The source must be either "mailbox" or "pop"')) +def run(): + sys.exit(main(sys.argv)) + # call main if __name__ == '__main__': - sys.exit(main(sys.argv)) + run() # # $Log: not supported by cvs2svn $ +# Revision 1.1 2002/01/29 19:53:08 jhermann +# Moved scripts from top-level dir to roundup.scripts subpackage +# # 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. # diff --git a/roundup/scripts/roundup_server.py b/roundup/scripts/roundup_server.py index a6a2083..60d32e0 100644 --- a/roundup/scripts/roundup_server.py +++ b/roundup/scripts/roundup_server.py @@ -18,7 +18,7 @@ # """ HTTP Server that serves roundup. -$Id: roundup_server.py,v 1.1 2002-01-29 19:53:08 jhermann Exp $ +$Id: roundup_server.py,v 1.2 2002-01-29 20:07:15 jhermann Exp $ """ # python version check @@ -184,7 +184,7 @@ roundup-server [-n hostname] [-p port] [name=instance home]* ''')%locals() sys.exit(0) -def main(): +def run(): hostname = '' port = 8080 try: @@ -244,10 +244,13 @@ def main(): httpd.serve_forever() if __name__ == '__main__': - main() + run() # # $Log: not supported by cvs2svn $ +# Revision 1.1 2002/01/29 19:53:08 jhermann +# Moved scripts from top-level dir to roundup.scripts subpackage +# # Revision 1.25 2002/01/05 02:21:21 richard # fixes # diff --git a/setup.py b/setup.py index 4e2717a..68fc3cd 100644 --- a/setup.py +++ b/setup.py @@ -16,15 +16,108 @@ # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # -# $Id: setup.py,v 1.29 2002-01-23 06:05:36 richard Exp $ +# $Id: setup.py,v 1.30 2002-01-29 20:07:15 jhermann Exp $ from distutils.core import setup, Extension from distutils.util import get_platform +from distutils.command.build_scripts import build_scripts +import sys, os, string from glob import glob -import sys,os + from roundup.templatebuilder import makeHtmlBase + +############################################################################# +### Build script files +############################################################################# + +class build_scripts_create(build_scripts): + """ Overload the build_scripts command and create the scripts + from scratch, depending on the target platform. + + You have to define the name of your package in an inherited + class (due to the delayed instantiation of command classes + in distutils, this cannot be passed to __init__). + + The scripts are created in an uniform scheme: they start the + run() function in the module + + .scripts. + + The mangling of script names replaces '-' and '/' characters + with '-' and '.', so that they are valid module paths. + """ + package_name = None + + def copy_scripts(self): + """ Create each script listed in 'self.scripts' + """ + if not self.package_name: + raise Exception("You have to inherit build_scripts_create and" + " provide a package name") + + to_module = string.maketrans('-/', '_.') + + self.mkpath(self.build_dir) + for script in self.scripts: + outfile = os.path.join(self.build_dir, os.path.basename(script)) + + #if not self.force and not newer(script, outfile): + # self.announce("not copying %s (up-to-date)" % script) + # continue + + if self.dry_run: + self.announce("would create %s" % outfile) + continue + + module = os.path.splitext(os.path.basename(script))[0] + module = string.translate(module, to_module) + script_vars = { + 'python': os.path.normpath(sys.executable), + 'package': self.package_name, + 'module': module, + } + + self.announce("creating %s" % outfile) + file = open(outfile, 'w') + + try: + if sys.platform == "win32": + file.write('@echo off\n' + '%(python)s -c "from %(package)s.scripts.%(module)s import run; run()" %%$\n' + % script_vars) + else: + file.write('#! %(python)s\n' + 'from %(package)s.scripts.%(module)s import run\n' + 'run()\n' + % script_vars) + finally: + file.close() + + +class build_scripts_roundup(build_scripts_create): + package_name = 'roundup' + + +def scriptname(path): + """ Helper for building a list of script names from a list of + module files. + """ + script = os.path.splitext(os.path.basename(path))[0] + script = string.replace(script, '_', '-') + if sys.platform == "win32": + script = script + ".bat" + return script + +# build list of scripts from their implementation modules +roundup_scripts = map(scriptname, glob('roundup/scripts/[!_]*.py')) + + +############################################################################# +### Main setup stuff +############################################################################# + def isTemplateDir(dir): return dir[0] != '.' and dir != 'CVS' and os.path.isdir(dir) \ and os.path.isfile(os.path.join(dir, '__init__.py')) @@ -34,6 +127,7 @@ templates = map(os.path.basename, filter(isTemplateDir, packagelist = [ 'roundup', 'roundup.backends', + 'roundup.scripts', 'roundup.templates' ] installdatafiles = [ @@ -64,13 +158,22 @@ setup( author_email = "richard@users.sourceforge.net", url = 'http://sourceforge.net/projects/roundup/', packages = packagelist, - scripts = ['roundup-admin', 'roundup-mailgw', 'roundup-server'], + + # Override certain command classes with our own ones + cmdclass = { + 'build_scripts': build_scripts_roundup, + }, + scripts = roundup_scripts, + data_files = installdatafiles ) # # $Log: not supported by cvs2svn $ +# Revision 1.29 2002/01/23 06:05:36 richard +# prep work for release +# # Revision 1.28 2002/01/11 03:24:15 richard # minor changes for 0.4.0b2 # -- 2.30.2