Code

Conversion to generated script stubs
authorjhermann <jhermann@57a73879-2fb5-44c3-a270-3262357dd7e2>
Tue, 29 Jan 2002 20:07:15 +0000 (20:07 +0000)
committerjhermann <jhermann@57a73879-2fb5-44c3-a270-3262357dd7e2>
Tue, 29 Jan 2002 20:07:15 +0000 (20:07 +0000)
git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@606 57a73879-2fb5-44c3-a270-3262357dd7e2

roundup-admin [deleted file]
roundup-mailgw [deleted file]
roundup-server [deleted file]
roundup/scripts/__init__.py [new file with mode: 0644]
roundup/scripts/roundup_admin.py
roundup/scripts/roundup_mailgw.py
roundup/scripts/roundup_server.py
setup.py

diff --git a/roundup-admin b/roundup-admin
deleted file mode 100755 (executable)
index 9a1f74c..0000000
+++ /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 <cr> 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 (executable)
index a75f438..0000000
+++ /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 <instance home> [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<user>[^:]+)(:(?P<pass>.+))?@)?(?P<server>.+)',
-            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 (executable)
index 5c8222c..0000000
+++ /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("<pre>")
-                s = StringIO.StringIO()
-                traceback.print_exc(None, s)
-                self.wfile.write(cgi.escape(s.getvalue()))
-                self.wfile.write("</pre>\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(_('<html><head><title>Roundup instances index</title></head>\n'))
-        w(_('<body><h1>Roundup instances index</h1><ol>\n'))
-        for instance in self.ROUNDUP_INSTANCE_HOMES.keys():
-            w(_('<li><a href="%(instance_url)s/index">%(instance_name)s</a>\n')%{
-                'instance_url': urllib.quote(instance),
-                'instance_name': cgi.escape(instance)})
-        w(_('</ol></body></html>'))
-
-    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 (file)
index 0000000..c0c85c8
--- /dev/null
@@ -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".
+'''
index 42fffb8c78dfb3f6f791079b9ece85a7917b7a19..9596fe048dd182e7a38a9e809f241d5c42f3c2ac 100644 (file)
@@ -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
 #
index 8e6faac74cdd7af7ffb3797f021e825f66ea8a4e..faec3d997cd1b5053957d540ee3b70bb7860971f 100644 (file)
@@ -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.
 #
index a6a2083737bb1da684d099a29389d15bb38d01d3..60d32e03c2fcde167f87d7fc28c7596adea3169c 100644 (file)
@@ -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
 #
index 4e2717aa35c3ca46cb24310a43a17f97d3836cb2..68fc3cde7f80ec78f24bea98a9b9c14707ccc23b 100644 (file)
--- a/setup.py
+++ b/setup.py
 # 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
+
+            <packagename>.scripts.<mangled_scriptname>
+
+        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
 #