#!/usr/bin/env python # -*- coding: utf-8 -*- # Started 16/05/2011 by Seblu <seblu@seblu.net> ''' InstallSystems Repository Manipulation Tool ''' import os import installsystems import installsystems.argparse as argparse # To remove when default to python 2.7 from installsystems.printer import * from installsystems.repository import Repository, RepositoryConfig from installsystems.image import PackageImage from installsystems.config import ConfigFile class DebugAction(argparse.Action): '''Set installsystems in debug mode. Argparse callback''' def __call__(self, parser, namespace, values, option_string=None): if installsystems.debug == False: installsystems.debug = True debug("Debug on") def init(args): '''Create an empty fresh repo tree''' # call init from library try: Repository.create(args.repository, verbose=args.verbose) except Exception as e: raise Exception("init failed: %s" % e) def add(args): '''Add a package to repository''' try: repo = Repository(args.repository, verbose=args.verbose) pkg = PackageImage(args.path, verbose=args.verbose) repo.add(pkg) except Exception as e: raise Exception("add failed: %s" % e) def delete(args): '''Remove a package from repository''' try: repo = Repository(args.repository, verbose=args.verbose) repo.delete(args.image_name, args.image_version) except Exception as e: raise Exception("del failed: %s" % e) # Top level argument parsing p_main = argparse.ArgumentParser() p_main.add_argument("-V", "--version", action="version", version=installsystems.version, help="show installsystems version") p_main.add_argument('-d', "--debug", action=DebugAction, nargs=0, help="active debug mode") p_main.add_argument('-q', "--quiet", action="store_false", dest="verbose", default=True, help="active quiet mode") p_main.add_argument("-c", "--config", dest="config", type=str, default=None, help="config file path") p_main.add_argument("-r", "--repo-name", dest="repo_name", type=str, default=None, help="repository name in config file") subparsers = p_main.add_subparsers() # Init command parser p_init = subparsers.add_parser("init", help=init.__doc__.lower()) p_init.set_defaults(func=init) # Add command parser p_add = subparsers.add_parser("add", help=add.__doc__.lower()) p_add.add_argument("path", type=str) p_add.set_defaults(func=add) # Del command parser #p_del = subparsers.add_parser("del", help=delete.__doc__.lower()) #p_del.add_argument("image_name", type=str) #p_del.add_argument("image_version", type=str) #p_del.set_defaults(func=delete) try: # Parse and run args = p_main.parse_args() # load config config = ConfigFile("isrepo", args.config) # filtering on repository name if present if args.repo_name is not None: repos = filter(lambda x: x.name == args.repo_name, config.repos) else: repos = config.repos if len(repos) == 1: args.repository = repos[0] elif len(repos) > 1: raise Exception("Please select a repository with -r") if len(repos) == 0 or not isinstance(args.repository, RepositoryConfig): raise Exception("No image repository found") debug("Repository: %s" % args.repository.path) args.func(args) except Exception as e: p_main.print_usage() error(e) except KeyboardInterrupt: warn("Keyboard Interrupted")