Wizard is a Git-based autoinstall management system for scripts.
Its commands are:
+ configure Configures an autoinstall (database, etc) to work
errors Lists all broken autoinstall metadata
- info Reports information about an autoinstall
+ install Installs an application
list Lists autoinstalls, with optional filtering
- massmigrate Performs mass migration of autoinstalls of an application
+ mass-migrate Performs mass migration of autoinstalls of an application
+ mass-upgrade Performs mass upgrade of autoinstalls of an application
migrate Migrate autoinstalls from old format to Git-based format
+ prepare-config Prepares configuration files for versioning
+ research Print statistics about a possible upgrade
summary Generate statistics (see help for subcommands)
upgrade Upgrades an autoinstall to the latest version
_, args = parser.parse_args() # no global options
rest_argv = args[1:]
baton = command.OptionBaton()
- baton.add("--versions-path", dest="versions_path",
- default="/afs/athena.mit.edu/contrib/scripts/sec-tools/store/versions",
- help="Location of parallel-find output directory, or a file containing a newline separated list of 'all autoinstalls' (for testing).")
+ baton.add("--versions-path", dest="versions_path", metavar="PATH",
+ default=getenvpath("WIZARD_VERSIONS_PATH") or "/afs/athena.mit.edu/contrib/scripts/sec-tools/store/versions",
+ help="Location of parallel-find output directory, or a file containing a newline separated list of 'all autoinstalls' (for development work). Environment variable is WIZARD_VERSIONS_PATH.")
+ baton.add("--srv-path", dest="srv_path", metavar="PATH",
+ default=getenvpath("WIZARD_SRV_PATH") or "/afs/athena.mit.edu/contrib/scripts/git/autoinstalls",
+ help="Location of autoinstall Git repositories, such that $REPO_PATH/$APP.git is a repository (for development work). Environment variable is WIZARD_SRV_PATH.")
+ baton.add("--dry-run", dest="dry_run", action="store_true",
+ default=False, help="Performs the operation without actually modifying any files. Use in combination with --verbose to see commands that will be run.")
+ # common variables for mass commands
+ baton.add("--seen", dest="seen",
+ default=None, help="File to read/write paths of already processed installs."
+ "These will be skipped.")
+ baton.add("--no-parallelize", dest="no_parallelize", action="store_true",
+ default=False, help="Turn off parallelization")
+ baton.add("--max-processes", dest="max_processes", type="int", metavar="N",
+ default=40, help="Maximum subprocesses to run concurrently")
+ baton.add("--limit", dest="limit", type="int",
+ default=None, help="Limit the number of autoinstalls to look at.")
try:
command_name = args[0]
except IndexError:
parser.print_help()
raise SystemExit(1)
+ baton.add("--log-dir", dest="log_dir",
+ default=getenvpath("WIZARD_LOG_DIR") or "/tmp/wizard-%s" % command_name,
+ help="Log files for Wizard children processes are placed here.")
if command_name == "help":
try:
- get_command(rest_argv[0]).main(['--help'], baton)
- except (AttributeError, ImportError):
+ help_module = get_command(rest_argv[0])
+ except ImportError:
parser.error("invalid action")
except IndexError:
parser.print_help()
raise SystemExit(1)
+ help_module.main(['--help'], baton)
# Dispatch commands
try:
command_module = get_command(command_name)
- except (AttributeError, ImportError):
+ except ImportError:
parser.error("invalid action")
command_module.main(rest_argv, baton)
def get_command(name):
+ name = name.replace("-", "_")
__import__("wizard.command." + name)
return getattr(wizard.command, name)
+def getenvpath(name):
+ val = os.getenv(name)
+ if val:
+ val = os.path.abspath(val)
+ return val
+
if __name__ == "__main__":
main()