diff roundup-admin @ 27:e5e9ea306a09

moving the bin files to facilitate out-of-the-boxness
author Richard Jones <richard@users.sourceforge.net>
date Mon, 23 Jul 2001 03:46:48 +0000
parents
children 671203878652
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/roundup-admin	Mon Jul 23 03:46:48 2001 +0000
@@ -0,0 +1,274 @@
+#! /usr/bin/python
+
+# $Id: roundup-admin,v 1.1 2001-07-23 03:46:48 richard Exp $
+
+import sys
+if int(sys.version[0]) < 2:
+    print 'Roundup requires python 2.0 or later.'
+    sys.exit(1)
+
+import string, os, getpass
+from roundup import date, roundupdb, init
+
+def determineLogin(instance, argv, n = 2):
+    name = password = ''
+    if argv[2] == '-u':
+        l = argv[3].split(':')
+        name = l[0]
+        if len(l) > 1:
+            password = l[1]
+        n = 4
+    elif os.environ.has_key('ROUNDUP_LOGIN'):
+        l = os.environ['ROUNDUP_LOGIN'].split(':')
+        name = l[0]
+        if len(l) > 1:
+            password = l[1]
+    while not name:
+        name = raw_input('Login name: ')
+    while not password:
+        password = getpass.getpass('  password: ')
+    # TODO use the password...
+    return n, instance.open(name)
+
+def usage(message=''):
+    if message: message = 'Problem: '+message+'\n'
+    print '''%sUsage:
+
+ roundup [-i instance] init template
+   -- initialise the database
+ roundup [-i instance] spec classname
+   -- show the properties for a classname
+ roundup [-i instance] create [-u login] classname propname=value ...
+   -- create a new entry of a given class
+ roundup [-i instance] list [-c] classname
+   -- list the instances of a class
+ roundup [-i instance] history [-c] designator
+   -- show the history entries of a designator
+ roundup [-i instance] get [-c] designator[,designator,...] propname
+   -- get the given property of one or more designator(s)
+ roundup [-i instance] set [-u login] designator[,designator,...] propname=value ...
+   -- set the given property of one or more designator(s)
+ roundup [-i instance] find [-c] classname propname=value ...
+   -- find the class instances with a given property
+ roundup [-i instance] retire designator[,designator,...]
+   -- "retire" a designator
+ roundup help    
+   -- this help
+ roundup morehelp
+   -- even more detailed help
+'''%message
+
+def moreusage(message=''):
+    usage(message)
+    print '''
+All commands (except help) require an instance specifier. This is just the path
+to the roundup instance you're working with. It may be specified in the environment
+variable ROUNDUP_INSTANCE or on the command line as "-i instance".
+
+A designator is a classname and a nodeid concatenated, eg. bug1, user10, ...
+
+Property values are represented as strings in command arguments and in the
+printed results:
+ . Strings are, well, strings.
+ . Date values are printed in the full date format in the local time zone, and
+   accepted in the full format or any of the partial formats explained below.
+ . Link values are printed as node designators. When given as an argument,
+   node designators and key strings are both accepted.
+ . Multilink values are printed as lists of node designators joined by commas.
+   When given as an argument, node designators and key strings are both
+   accepted; an empty string, a single node, or a list of nodes joined by
+   commas is accepted.
+
+When multiple nodes are specified to the roundup get or roundup set
+commands, the specified properties are retrieved or set on all the listed
+nodes. 
+
+When multiple results are returned by the roundup get or roundup find
+commands, they are printed one per line (default) or joined by commas (with
+the -c) option. 
+
+Where the command changes data, a login name/password is required. The
+login may be specified as either "name" or "name:password".
+ . ROUNDUP_LOGIN environment variable
+ . the -u command-line option
+If either the name or password is not supplied, they are obtained from the
+command-line. 
+
+Date format examples:
+  "2000-04-17.03:45" means <Date 2000-04-17.08:45:00>
+  "2000-04-17" means <Date 2000-04-17.00:00:00>
+  "01-25" means <Date yyyy-01-25.00:00:00>
+  "08-13.22:13" means <Date yyyy-08-14.03:13:00>
+  "11-07.09:32:43" means <Date yyyy-11-07.14:32:43>
+  "14:25" means <Date yyyy-mm-dd.19:25:00>
+  "8:47:11" means <Date yyyy-mm-dd.13:47:11>
+  "." means "right now"
+'''
+
+def main():
+    argv = sys.argv
+
+    if len(argv) == 1:
+        usage('No command specified')
+        return 1
+
+    # handle help now
+    if argv[1] == 'help':
+        usage()
+        return 0
+    if argv[1] == 'morehelp':
+        moreusage()
+        return 0
+
+    # figure the instance home
+    n = 1
+    if argv[1] == '-i':
+        if len(argv) == 2:
+            usage()
+            return 1
+        instance_home = argv[2]
+        n = 3
+    else:
+        instance_home = os.environ.get('ROUNDUP_INSTANCE', '')
+    if not instance_home:
+        usage('No instance home specified')
+        return 1
+
+    # now figure the command
+    command = argv[n]
+    n = n + 1
+
+    if command == 'init':
+        adminpw = ''
+        confirm = 'x'
+        while adminpw != confirm:
+            adminpw = getpass.getpass('Admin Password:')
+            confirm = getpass.getpass('       Confirm:')
+        init.init(instance_home, argv[n],  adminpw)
+        return 0
+
+    # get the instance
+    path, instance = os.path.split(instance_home)
+    sys.path.insert(0, path)
+    try:
+        instance = __import__(instance)
+    finally:
+        del sys.path[0]
+
+    if command == 'get':
+        db = instance.open()
+        designators = string.split(argv[n], ',')
+        propname = argv[n+1]
+        # TODO: handle the -c option
+        for designator in designators:
+            classname, nodeid = roundupdb.splitDesignator(designator)
+            print db.getclass(classname).get(nodeid, propname)
+
+    elif command == 'set':
+        n, db = determineLogin(instance, argv, n)
+        designators = string.split(argv[n], ',')
+        props = {}
+        for prop in argv[n+1:]:
+            key, value = prop.split('=')
+            props[key] = value
+        for designator in designators:
+            classname, nodeid = roundupdb.splitDesignator(designator)
+            cl = db.getclass(classname)
+            properties = cl.getprops()
+            for key, value in props.items():
+                type =  properties[key]
+                if type.isStringType:
+                    continue
+                elif type.isDateType:
+                    props[key] = date.Date(value)
+                elif type.isIntervalType:
+                    props[key] = date.Interval(value)
+                elif type.isLinkType:
+                    props[key] = value
+                elif type.isMultilinkType:
+                    props[key] = value.split(',')
+            apply(cl.set, (nodeid, ), props)
+
+    elif command == 'find':
+        db = instance.open()
+        classname = argv[n]
+        cl = db.getclass(classname)
+
+        # look up the linked-to class and get the nodeid that has the value
+        propname, value = argv[n+1:].split('=')
+        propcl = cl[propname].classname
+        nodeid = propcl.lookup(value)
+
+        # now do the find
+        # TODO: handle the -c option
+        print cl.find(propname, nodeid)
+
+    elif command == 'spec':
+        db = instance.open()
+        classname = argv[n]
+        cl = db.getclass(classname)
+        for key, value in cl.properties.items():
+            print '%s: %s'%(key, value)
+
+    elif command == 'create':
+        n, db = determineLogin(instance, argv, n)
+        classname = argv[n]
+        cl = db.getclass(classname)
+        props = {}
+        properties = cl.getprops()
+        for prop in argv[n+1:]:
+            key, value = prop.split('=')
+            type =  properties[key]
+            if type.isStringType:
+                props[key] = value 
+            elif type.isDateType:
+                props[key] = date.Date(value)
+            elif type.isIntervalType:
+                props[key] = date.Interval(value)
+            elif type.isLinkType:
+                props[key] = value
+            elif type.isMultilinkType:
+                props[key] = value.split(',')
+        print apply(cl.create, (), props)
+
+    elif command == 'list':
+        db = instance.open()
+        classname = argv[n]
+        cl = db.getclass(classname)
+        key = cl.getkey() or cl.properties.keys()[0]
+        # TODO: handle the -c option
+        for nodeid in cl.list():
+            value = cl.get(nodeid, key)
+            print "%4s: %s"%(nodeid, value)
+
+    elif command == 'history':
+        db = instance.open()
+        classname, nodeid = roundupdb.splitDesignator(argv[n])
+        # TODO: handle the -c option
+        print db.getclass(classname).history(nodeid)
+
+    elif command == 'retire':
+        n, db = determineLogin(instance, argv, n)
+        designators = string.split(argv[n], ',')
+        for designator in designators:
+            classname, nodeid = roundupdb.splitDesignator(designator)
+            db.getclass(classname).retire(nodeid)
+
+    else:
+        print "Unknown command '%s'"%command
+        usage()
+        return 1
+
+    db.close()
+    return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
+
+#
+# $Log: not supported by cvs2svn $
+# Revision 1.1  2001/07/22 11:15:45  richard
+# More Grande Splite stuff
+#
+#
+

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