#!/usr/bin/python2.3
# Copyright 2003-2005 Iustin Pop
#
# This file is part of cfvers.
#
# cfvers is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# cfvers is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cfvers; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# $Id: cfvadmin 222 2005-10-30 12:58:22Z iusty $
import cfvers
import cfvers.cmd
import mx.DateTime
try:
from optparse import OptionParser, OptionGroup
except ImportError:
from optik import OptionParser, OptionGroup
import os, os.path
import sys
import types
class CLI(object):
def __init__(self):
commands = {
'init': (self.cmd_init, "Initializes the repository (do it only ONCE!)", False),
'info': (self.cmd_info, "Display informations about the areas present", True),
'create': (self.cmd_create, "Creates a new area", True),
}
self.curr_cmd = "<command>"
self.usage="usage: %prog [global options] command [command options and arguments]\nwhere command is one of\n"
l = commands.keys()
l.sort()
for i in l:
self.usage += " %-10s %s\n" % (i, commands[i][1])
self.usage += "\nGlobal options:"
self.commands = commands
def get_scp(self, earg):
"""Returns a sub-command parser"""
op = OptionParser(version=cfvers.cmd.CLIScript.get_version(),
usage="%%prog [global options] %s [options] " \
"%s\nFor global options, see %%prog --help" \
% (self.curr_cmd, earg))
return op
def prompt_func(self, key):
prompt = "Please enter the %s: " % key
if "password" in key:
value = getpass.getpass(prompt)
else:
value = raw_input(prompt)
return value
def main(self, argv):
op = OptionParser(version=cfvers.cmd.CLIScript.get_version(),
usage=self.usage)
op.disable_interspersed_args()
op.add_option("--local", dest="server_type",
action="store_const", const="local",
help="connect locally (not through the server)")
op.add_option("--remote", dest="server_type",
action="store_const", const="remote",
help="connect through the server")
ogl = OptionGroup(op, "Local options")
ogl.add_option("--rtype", dest="repo_meth",
type="choice", choices=('postgresql', 'sqlite'),
help="repository type")
ogl.add_option("--rdata", dest="repo_data",
type="string",
help="repository connect information")
op.add_option_group(ogl)
ogr = OptionGroup(op, "Remote options")
ogr.add_option("-s", "--server", dest="host",
help="the host to connect to",
type="string", default=None,
metavar="HOSTNAME")
ogr.add_option("-p", "--port", dest="port",
help="the port on the server",
type="int", default=None,
metavar="PORT")
ogr.add_option("-u", "--username", dest="username",
help="the username for authentication to the server",
type="string", default=None,
metavar="USERNAME")
ogr.add_option("-P", "--PROMPT", dest="do_prompt",
help="prompt for password",
action="store_true", default=False,
)
op.add_option_group(ogr)
(options, args) = op.parse_args(argv)
options.area = None
if len(args) == 0:
op.print_help()
return
command = args.pop(0)
if not command in self.commands:
print "Unknown command %s" % command
op.print_help()
return
func, descr, openflag = self.commands[command]
try:
self.cmdi = cfvers.cmd.AdminCommands(options, self.prompt_func, do_connect=openflag)
except cfvers.ConfigException, e:
print >>sys.stderr, "Error: your configuration is invalid.\nError message: %s." % e
return
except cfvers.RepositoryException, e:
print >>sys.stderr, "Error: repository opening failed.\nError message: %s." % e
return
except cfvers.CommException, e:
print >>sys.stderr, "Error: communication error.\nError message: %s" % (" ".join(e.args),)
return
except Exception, e:
print >>sys.stderr,"Error while initializing: %s" % e
raise
return
self.curr_cmd = command
try:
func(options, args)
finally:
self.cmdi.close()
return
def cmd_init(self, options, args):
"""Initialize the local repository"""
op = self.get_scp("")
op.add_option("--force", dest="force",
help="drop existing schema first",
action="store_true", default=False,
)
op.add_option("--skip-data", dest="doarea",
help="skip data creation",
action="store_false", default=True,
)
(cmdoptions, cmdargs) = op.parse_args(args)
try:
self.cmdi.init_repo(cmdoptions)
except cfvers.ConfigException, e:
print >>sys.stderr, "Error: your configuration is invalid.\nError message: %s." % e
return
except cfvers.RepositoryException, e:
print >>sys.stderr, "Error: repository opening failed.\nError message: %s." % e
return
return
def cmd_create(self, options, args):
"""Creates a new area"""
op = self.get_scp("area_name")
op.add_option("-d", "--description", dest="description",
help="area description",
type="string",
metavar="TEXT")
op.add_option("-p", "--rootpath", dest="root",
help="filesystem root of the area [/]",
type="string", default="/",
metavar="PATH")
(cmdoptions, cmdargs) = op.parse_args(args)
if len(cmdargs) != 1:
print >>sys.stderr, "You must give the area name!!"
return
try:
self.cmdi.create_area(cmdoptions, cmdargs[0])
except cfvers.OperationError, e:
print >>sys.stderr, "Error while creating area: %s" % str(e)
return
def cmd_info(self, options, args):
"""Show informations about the local repository"""
op = self.get_scp("")
(cmdoptions, cmdargs) = op.parse_args(args)
p = self.cmdi.portal
arealist = p.getAreas()
print "Local repository has %d area(s)" % len(arealist)
for a in arealist:
print "-" * 25
print "Name: %s" % a.name
print "Created at %s %s" % (a.ctime.localtime().strftime("%Y-%m-%d %T"), a.ctime.tz)
print "Root path: %s" % a.root
print "Description: %s" % a.description
if a.revno is None:
print "No revisions in this area"
else:
print "Revision number: %d" % a.revno
print "Number of items: %d" % a.numitems
return
if __name__ == "__main__":
cli = CLI()
cli.main(sys.argv[1:])
syntax highlighted by Code2HTML, v. 0.9.1