X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=demo.py;h=0cc4a38af39abf37d96675c7b351d4528ecc3a99;hb=9976de4f1761b47dc459f10c4b28c311de84e103;hp=b047e843418c9d099117b49bdae17a08ed48e4fd;hpb=191944f21e9fff7817ba52a28f2e3691681f9d46;p=roundup.git diff --git a/demo.py b/demo.py index b047e84..0cc4a38 100644 --- a/demo.py +++ b/demo.py @@ -1,30 +1,64 @@ #! /usr/bin/env python # # Copyright (c) 2003 Richard Jones (richard@mechanicalcat.net) -# -# $Id: demo.py,v 1.5 2003-07-28 23:17:50 richard Exp $ +# -import sys, os, string, re, urlparse -import shutil, socket, errno, BaseHTTPServer +import errno +import os +import socket +import sys +import urlparse from glob import glob +import getopt + +from roundup import configuration +from roundup.scripts import roundup_server + +def install_demo(home, backend, template): + """Install a demo tracker + + Parameters: + home: + tracker home directory path + backend: + database backend name + template: + tracker template + + """ + + from roundup import init, instance, password, backends + + # set up the config for this tracker + config = configuration.CoreConfig() + config['TRACKER_HOME'] = home + config['MAIL_DOMAIN'] = 'localhost' + config['DATABASE'] = 'db' + config['WEB_DEBUG'] = True + if backend in ('mysql', 'postgresql'): + config['RDBMS_HOST'] = 'localhost' + config['RDBMS_USER'] = 'rounduptest' + config['RDBMS_PASSWORD'] = 'rounduptest' + config['RDBMS_NAME'] = 'rounduptest' -def install_demo(home): - # create the instance - if os.path.exists(home): - shutil.rmtree(home) - from roundup import init, instance, password - init.install(home, os.path.join('templates', 'classic')) + # see if we have further db nuking to perform + module = backends.get_backend(backend) + if module.db_exists(config): + module.db_nuke(config) + + template_dir = os.path.join('share', 'roundup', 'templates', template) + init.install(home, template_dir) # don't have email flying around - os.remove(os.path.join(home, 'detectors', 'nosyreaction.py')) - try: - os.remove(os.path.join(home, 'detectors', 'nosyreaction.pyc')) - except os.error, error: - if error.errno != errno.ENOENT: - raise - init.write_select_db(home, 'anydbm') + nosyreaction = os.path.join(home, 'detectors', 'nosyreaction.py') + if os.path.exists(nosyreaction): + os.remove(nosyreaction) + nosyreaction += 'c' + if os.path.exists(nosyreaction): + os.remove(nosyreaction) + init.write_select_db(home, backend) # figure basic params for server - hostname = socket.gethostname() + hostname = 'localhost' # pick a fairly odd, random port port = 8917 while 1: @@ -42,59 +76,106 @@ def install_demo(home): s.close() print 'already in use.' port += 100 - url = 'http://%s:%s/demo/'%(hostname, port) + config['TRACKER_WEB'] = 'http://%s:%s/demo/'%(hostname, port) # write the config - f = open(os.path.join(home, 'config.py'), 'r') - s = f.read().replace('http://tracker.example/cgi-bin/roundup.cgi/bugs/', - url) - f.close() - f = open(os.path.join(home, 'config.py'), 'w') - f.write(s) - f.close() + config['INSTANT_REGISTRATION'] = 1 + config.save(os.path.join(home, config.INI_FILE)) - # initialise the database - init.initialise(home, 'admin') + # open the tracker and initialise + tracker = instance.open(home) + tracker.init(password.Password('admin')) # add the "demo" user - tracker = instance.open(home) db = tracker.open('admin') - db.user.create(username='demo', password=password.Password('demo'), - realname='Demo User', roles='User') + # FIXME: Move tracker-specific demo initialization into the tracker templates. + if (template == 'minimal'): + db.user.create(username='demo', password=password.Password('demo'), + roles='User') + else: + db.user.create(username='demo', password=password.Password('demo'), + realname='Demo User', roles='User') db.commit() db.close() -def run_demo(): - ''' Run a demo server for users to play with for instant gratification. - - Sets up the web service on localhost. Disables nosy lists. - ''' - home = os.path.abspath('demo') - if not os.path.exists(home) or sys.argv[-1] == 'nuke': - install_demo(home) - - f = open(os.path.join(home, 'config.py'), 'r') - url = re.search(r'^TRACKER_WEB\s*=\s*[\'"](http.+/)[\'"]$', f.read(), - re.M|re.I).group(1) - f.close() +def run_demo(home): + """Run the demo tracker installed in ``home``""" + cfg = configuration.CoreConfig(home) + url = cfg["TRACKER_WEB"] hostname, port = urlparse.urlparse(url)[1].split(':') port = int(port) + success_message = '''Server running - connect to: + %s +1. Log in as "demo"/"demo" or "admin"/"admin". +2. Hit Control-C to stop the server. +3. Re-start the server by running "roundup-demo" again. +4. Re-initialise the server by running "roundup-demo nuke". + +Demo tracker is set up to be accessed by localhost browser. If you +run demo on a server host, please stop the demo, open file +"demo/config.ini" with your editor, change the host name in the "web" +option in section "[tracker]", save the file, then re-run the demo +program. If you want to change backend types, you must use "nuke". + +''' % url + + # disable command line processing in roundup_server + sys.argv = sys.argv[:1] + ['-p', str(port), 'demo=' + home] + roundup_server.run(success_message=success_message) + + +def usage(msg = ''): + + if msg: print msg + print 'Usage: %s [options] [nuke]'%sys.argv[0] + print """ +Options: + -h -- print this help message + -t template -- specify the tracker template to use + -b backend -- specify the database backend to use +""" + + +def main(): + """Run a demo server for users to play with for instant gratification. + + Sets up the web service on localhost. Disables nosy lists. + """ - # ok, so start up the server - from roundup.scripts.roundup_server import RoundupRequestHandler - RoundupRequestHandler.TRACKER_HOMES = {'demo': home} - httpd = BaseHTTPServer.HTTPServer((hostname, port), RoundupRequestHandler) - print 'Server running - connect to:\n %s'%url - print '1. Log in as "demo"/"demo" or "admin"/"admin".' - print '2. Hit Control-C to stop the server.' - print '3. Re-start the server by running "python demo.py" again.' - print '4. Re-initialise the server by running "python demo.py nuke".' try: - httpd.serve_forever() - except KeyboardInterrupt: - print 'Keyboard Interrupt: exiting' + opts, args = getopt.getopt(sys.argv[1:], 't:b:h') + except getopt.GetoptError, e: + usage(str(e)) + return 1 + + home = os.path.abspath('demo') + nuke = args and args[0] == 'nuke' + if not os.path.exists(home) or nuke: + backend = 'anydbm' + template = 'classic' + for opt, arg in opts: + if opt == '-h': + usage() + return 0 + elif opt == '-t': + template = arg + elif opt == '-b': + backend = arg + if (len(args) > 1 or + (len(args) == 1 and args[0] != 'nuke')): + usage() + return 1 + + install_demo(home, backend, template) + elif opts: + print "Error: Arguments are not allowed when running an existing demo." + print " Use the 'nuke' command to start over." + sys.exit(1) + + run_demo(home) + if __name__ == '__main__': - run_demo() + sys.exit(main()) -# vim: set filetype=python ts=4 sw=4 et si +# vim: set filetype=python sts=4 sw=4 et si :