import os import sys import distutils import wizard from wizard import app, command, git, prompt, shell, util from wizard.install import installopt, interactive def main(argv, baton): old_options, args = parse_args(argv, baton) input = prompt.make(old_options.prompt, old_options.non_interactive) if len(args) < 1: # XXX: Obviously not correct ;-) appstr = "mediawiki" else: appstr = args[0] first_time = True locker = None # XXX: this is kind of grody while 1: if len(args) < 2: # XXX: Scripts specific if first_time: type = input.menu(""" Who are you performing this install for? If you don't know, select 1.""", cmdopt="directory", choices=[ ("1", "Your personal Athena account"), ("2", "A locker you control (i.e. a club or course)"), ]) if type == "1": locker = os.getenv("ATHENA_USER") or os.getenv("USER") else: locker = input.inputbox(""" Enter the name of the selected locker that you control. For locker /mit/lsc, you would simply enter lsc. Locker name:""") # XXX: check for control/existence of locker. # fi path = input.inputbox(""" Your new install will appear on the web at a URL that starts with \ http://%s.scripts.mit.edu/. Please decide on a complete URL and \ enter it below. You must enter one or more characters after mit.edu. \ The completed address must contain only a-z, 0-9 and /. Desired address:""" % locker, init="http://%s.scripts.mit.edu/" % locker) dir = os.path.join("/mit", locker, "web_scripts", path) else: dir = args[1] if os.path.exists(dir): if locker: input.msgbox("Directory already exists; please select another address or delete the old directory.") first_time = False continue raise DirectoryExistsError break appname, _, version = appstr.partition('-') application = app.applications()[appname] # get configuration schema = application.install_schema options = None if old_options.non_interactive: handler = installopt.Controller(dir, schema) parser = command.WizardOptionParser() handler.push(parser) options, _ = parser.parse_all(args[2:] + command.make_base_args(old_options)) # accumulate handler.handle(options) else: handler = interactive.Controller(dir, schema, input) handler.ask(old_options) options = old_options sh = shell.Shell() input.infobox("Copying files (this may take a while)...") sh.call("git", "clone", "-q", "--shared", application.repository(old_options.srv_path), dir) with util.ChangeDirectory(dir): if version: # XXX: do something smart if -scripts is not at the end sh.call("git", "reset", "-q", "--hard", appstr) input.infobox("Installing...") application.install(distutils.version.LooseVersion(version), options) git.commit_configure() input.infobox("Congratulations, your new install is now accessible at http://%s%s" % (options.web_host, options.web_path)) def parse_args(argv, baton): usage = """usage: %prog install [APP [DIR -- [SETUPARGS]]] Autoinstalls the application APP in the directory DIR. SETUPARGS are arguments that are passed to 'wizard configure', see 'wizard configure APP --help' for possible arguments. If arguments are missing this command will interactively ask for them. """ parser = command.WizardOptionParser(usage) parser.add_option("--prompt", dest="prompt", action="store_true", default=False, help="Force to use non-ncurses interactive interface") parser.add_option("--non-interactive", dest="non_interactive", action="store_true", default=False, help="Force program to be non-interactive") baton.push(parser, "srv_path") return parser.parse_all(argv) class DirectoryExistsError(wizard.Error): def __str__(self): return "Directory already exists"