9 logger = logging.getLogger(__name__)
12 class ActionNoYes(argparse.Action):
22 msg = 'You must provide a default with Yes/No action'
25 if len(option_strings) != 1:
26 msg = 'Only single argument is allowed with YesNo action'
29 opt = option_strings[0]
30 if not opt.startswith('--'):
31 msg = 'Yes/No arguments must be prefixed with --'
36 opts = ['--' + opt, '--no_' + opt]
47 def __call__(self, parser, namespace, values, option_strings=None):
49 option_strings.startswith('--no-') or
50 option_strings.startswith('--no_')
52 setattr(namespace, self.dest, False)
54 setattr(namespace, self.dest, True)
58 if isinstance(v, bool):
60 return string_utils.to_bool(v)
63 def valid_ip(ip: str) -> str:
64 s = string_utils.extract_ip_v4(ip.strip())
67 msg = f"{ip} is an invalid IP address"
69 raise argparse.ArgumentTypeError(msg)
72 def valid_mac(mac: str) -> str:
73 s = string_utils.extract_mac_address(mac)
76 msg = f"{mac} is an invalid MAC address"
78 raise argparse.ArgumentTypeError(msg)
81 def valid_percentage(num: str) -> float:
85 msg = f"{num} is an invalid percentage; expected 0 <= n <= 100.0"
87 raise argparse.ArgumentTypeError(msg)
90 def valid_filename(filename: str) -> str:
94 msg = f"{filename} was not found and is therefore invalid."
96 raise argparse.ArgumentTypeError(msg)