| Index: run.py |
| =================================================================== |
| --- a/run.py |
| +++ b/run.py |
| @@ -1,6 +1,7 @@ |
| #!/usr/bin/env python |
| # coding: utf-8 |
| +import argparse |
| import sys |
| import os |
| import re |
| @@ -8,39 +9,43 @@ |
| import getopt |
| import yaml |
| -def usage(): |
| - print >>sys.stderr, ''' |
| -Usage: %s [-u <user>] [-h <host>|<group>] [-i] ... <command> |
| +def createArgumentParser(**kwargs): |
| + parser = argparse.ArgumentParser(**kwargs) |
| + parser.add_argument( |
| + '-u', metavar='<user>', dest='user', type=str, default='vagrant', |
| + help='user name for use with SSH, must exist on all hosts' |
| + ) |
| -Runs a command on the given hosts or groups of hosts. |
| + parser.add_argument( |
| + '-?', action='help', |
| + help='print this message and exit' |
| + ) |
|
Wladimir Palant
2015/04/07 14:58:04
This is just wrong...
1) This assumes add_help=Fa
mathias
2015/04/07 15:36:51
I just tried to stay consistent with the existing
|
| -Options: |
| - -u <user> User name to use with the SSH command |
| - -h <host|group> Host or group to run the command on (can be specified multiple times) |
| - -i If specified, command will be executed on all hosts despite errors |
| -''' % sys.argv[0] |
| + return parser |
| def parseOptions(args): |
| - try: |
| - options, args = getopt.getopt(args, 'u:h:i') |
| - except getopt.GetoptError, e: |
| - print >>sys.stderr, e |
| - usage() |
| - sys.exit(1) |
| + description = "Run a command on the given hosts or groups of hosts" |
|
Wladimir Palant
2015/04/07 14:58:04
Nit: single quotes, for consistency.
mathias
2015/04/07 15:36:51
Done.
|
| + parser = createArgumentParser(description=description, add_help=False) |
| + parser.add_argument( |
| + '-i', action='store_true', dest='ignore_errors', |
| + help='continue execution on next host in case of an error' |
| + ) |
| - user = None |
| - hosts = [] |
| - ignore_errors = False |
| - for option, value in options: |
| - if option == '-u': |
| - user = value |
| - elif option == '-h': |
| - hosts.append(value) |
| - elif option == '-i': |
| - ignore_errors = True |
| + hosts = set() |
| + parser.add_argument( |
| + '-h', metavar='<host|group>', |
| + help='target host or group, can be specified multiple times', |
| + type=lambda value: hosts.update((value,)) |
|
Wladimir Palant
2015/04/07 14:58:04
Nit: I think this should be a list semantically -
mathias
2015/04/07 15:36:51
Done.
|
| + ) |
| - return user, hosts, ignore_errors, args |
| + parser.add_argument( |
| + 'args', metavar='command', type=str, nargs='+', |
| + help='The command to run on the specified hosts' |
| + ) |
| + options = parser.parse_args(args) |
| + options.hosts = hosts |
| + return options |
| def getValidHosts(): |
| dirname = os.path.dirname(sys.argv[0]) |
| @@ -87,11 +92,11 @@ |
| subprocess.check_call(command) |
| if __name__ == "__main__": |
| - user, hosts, ignore_errors, args = parseOptions(sys.argv[1:]) |
| - selectedHosts = resolveHostList(hosts) |
| + options = parseOptions(sys.argv[1:]) |
| + selectedHosts = resolveHostList(options.hosts) |
| if len(selectedHosts) == 0: |
| print >>sys.stderr, 'No valid hosts or groups specified, nothing to do' |
| sys.exit(0) |
| for host in selectedHosts: |
| print >>sys.stderr, 'Running on %s...' % host |
| - runCommand(user, host, args, ignore_errors=ignore_errors) |
| + runCommand(options.user, host, options.args, options.ignore_errors) |