2025-08-12 22:28:56 +02:00

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)