81 lines
2.0 KiB
Python
81 lines
2.0 KiB
Python
# Copyright (C) 2015-2017 Custodia Project Contributors - see LICENSE file
|
|
from __future__ import absolute_import
|
|
|
|
import argparse
|
|
import os
|
|
|
|
|
|
class AbsFileType(argparse.FileType):
|
|
"""argparse file type with absolute path
|
|
"""
|
|
def __call__(self, string):
|
|
if string != '-':
|
|
string = os.path.abspath(string)
|
|
return super(AbsFileType, self).__call__(string)
|
|
|
|
|
|
class ConfigfileAction(argparse.Action):
|
|
"""Default action handler for configfile
|
|
"""
|
|
default_path = '/etc/custodia/custodia.conf'
|
|
default_instance = '/etc/custodia/{instance}.conf'
|
|
|
|
def __call__(self, parser, namespace, values, option_string=None):
|
|
if values is None:
|
|
if namespace.instance is not None:
|
|
values = self.default_instance.format(
|
|
instance=namespace.instance
|
|
)
|
|
else:
|
|
values = self.default_path
|
|
values = self.type(values)
|
|
setattr(namespace, self.dest, values)
|
|
|
|
|
|
def instance_name(string):
|
|
"""Check for valid instance name
|
|
"""
|
|
invalid = ':/@'
|
|
if set(string).intersection(invalid):
|
|
msg = 'Invalid instance name {}'.format(string)
|
|
raise argparse.ArgumentTypeError(msg)
|
|
return string
|
|
|
|
|
|
default_argparser = argparse.ArgumentParser(
|
|
prog='custodia',
|
|
description='Custodia server'
|
|
)
|
|
default_argparser.add_argument(
|
|
'--debug',
|
|
action='store_true',
|
|
help='Debug mode'
|
|
)
|
|
default_argparser.add_argument(
|
|
'--instance',
|
|
type=instance_name,
|
|
help='Instance name',
|
|
default=None
|
|
)
|
|
default_argparser.add_argument(
|
|
'configfile',
|
|
nargs='?',
|
|
action=ConfigfileAction,
|
|
type=AbsFileType('r'),
|
|
help=('Path to custodia server config (default: '
|
|
'/etc/custodia/{instance}/custodia.conf)'),
|
|
)
|
|
|
|
|
|
def parse_args(args=None, argparser=None):
|
|
if argparser is None:
|
|
argparser = default_argparser
|
|
|
|
# namespace with default values
|
|
namespace = argparse.Namespace(
|
|
debug=False,
|
|
instance=None,
|
|
)
|
|
|
|
return argparser.parse_args(args, namespace)
|