isrepo 3.46 KiB
#!/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")