diff options
Diffstat (limited to 'swiftclient/shell.py')
-rwxr-xr-x | swiftclient/shell.py | 194 |
1 files changed, 150 insertions, 44 deletions
diff --git a/swiftclient/shell.py b/swiftclient/shell.py index ef153c7..c0387bb 100755 --- a/swiftclient/shell.py +++ b/swiftclient/shell.py @@ -22,7 +22,7 @@ import logging from errno import EEXIST, ENOENT from hashlib import md5 -from optparse import OptionParser, SUPPRESS_HELP +from optparse import OptionParser, OptionGroup, SUPPRESS_HELP from os import environ, listdir, makedirs, utime, _exit as os_exit from os.path import dirname, getmtime, getsize, isdir, join, \ sep as os_path_sep @@ -1356,9 +1356,14 @@ def parse_args(parser, args, enforce_requires=True): if len(args) > 0 and args[0] == 'tempurl': return options, args - if (not (options.auth and options.user and options.key)): - # Use 2.0 auth if none of the old args are present - options.auth_version = '2.0' + if options.auth_version == '3.0': + # tolerate sloppy auth_version + options.auth_version = '3' + + if (not (options.auth and options.user and options.key) + and options.auth_version != '3'): + # Use keystone auth if any of the old-style args are missing + options.auth_version = '2.0' # Use new-style args if old ones not present if not options.auth and options.os_auth_url: @@ -1370,8 +1375,15 @@ def parse_args(parser, args, enforce_requires=True): # Specific OpenStack options options.os_options = { + 'user_id': options.os_user_id, + 'user_domain_id': options.os_user_domain_id, + 'user_domain_name': options.os_user_domain_name, 'tenant_id': options.os_tenant_id, 'tenant_name': options.os_tenant_name, + 'project_id': options.os_project_id, + 'project_name': options.os_project_name, + 'project_domain_id': options.os_project_domain_id, + 'project_domain_name': options.os_project_domain_name, 'service_type': options.os_service_type, 'endpoint_type': options.os_endpoint_type, 'auth_token': options.os_auth_token, @@ -1384,12 +1396,23 @@ def parse_args(parser, args, enforce_requires=True): if (options.os_options.get('object_storage_url') and options.os_options.get('auth_token') and - options.auth_version == '2.0'): + (options.auth_version == '2.0' or options.auth_version == '3')): return options, args - if enforce_requires and \ - not (options.auth and options.user and options.key): - exit(''' + if enforce_requires: + if options.auth_version == '3': + if not options.auth: + exit('Auth version 3 requires OS_AUTH_URL to be set or ' + + 'overridden with --os-auth-url') + if not (options.user or options.os_user_id): + exit('Auth version 3 requires either OS_USERNAME or ' + + 'OS_USER_ID to be set or overridden with ' + + '--os-username or --os-user-id respectively.') + if not options.key: + exit('Auth version 3 requires OS_PASSWORD to be set or ' + + 'overridden with --os-password') + elif not (options.auth and options.user and options.key): + exit(''' Auth version 1.0 requires ST_AUTH, ST_USER, and ST_KEY environment variables to be set or overridden with -A, -U, or -K. @@ -1409,13 +1432,20 @@ def main(arguments=None): version = client_version parser = OptionParser(version='%%prog %s' % version, usage=''' -usage: %%prog [--version] [--help] [--snet] [--verbose] +usage: %%prog [--version] [--help] [--os-help] [--snet] [--verbose] [--debug] [--info] [--quiet] [--auth <auth_url>] [--auth-version <auth_version>] [--user <username>] [--key <api_key>] [--retries <num_retries>] [--os-username <auth-user-name>] [--os-password <auth-password>] + [--os-user-id <auth-user-id>] + [--os-user-domain-id <auth-user-domain-id>] + [--os-user-domain-name <auth-user-domain-name>] [--os-tenant-id <auth-tenant-id>] [--os-tenant-name <auth-tenant-name>] + [--os-project-id <auth-project-id>] + [--os-project-name <auth-project-name>] + [--os-project-domain-id <auth-project-domain-id>] + [--os-project-domain-name <auth-project-domain-name>] [--os-auth-url <auth-url>] [--os-auth-token <auth-token>] [--os-storage-url <storage-url>] [--os-region-name <region-name>] [--os-service-type <service-type>] @@ -1449,12 +1479,25 @@ Examples: %%prog --os-auth-url https://api.example.com/v2.0 --os-tenant-name tenant \\ --os-username user --os-password password list + %%prog --os-auth-url https://api.example.com/v3 --auth-version 3\\ + --os-project-name project1 --os-project-domain-name domain1 \\ + --os-username user --os-user-domain-name domain1 \\ + --os-password password list + + %%prog --os-auth-url https://api.example.com/v3 --auth-version 3\\ + --os-project-id 0123456789abcdef0123456789abcdef \\ + --os-user-id abcdef0123456789abcdef0123456789 \\ + --os-password password list + %%prog --os-auth-token 6ee5eb33efad4e45ab46806eac010566 \\ --os-storage-url https://10.1.5.2:8080/v1/AUTH_ced809b6a4baea7aeab61a \\ list %%prog list --lh '''.strip('\n') % globals()) + parser.add_option('--os-help', action='store_true', dest='os_help', + help='Show OpenStack authentication options.') + parser.add_option('--os_help', action='store_true', help=SUPPRESS_HELP) parser.add_option('-s', '--snet', action='store_true', dest='snet', default=False, help='Use SERVICENET internal network.') parser.add_option('-v', '--verbose', action='count', dest='verbose', @@ -1472,7 +1515,9 @@ Examples: help='URL for obtaining an auth token.') parser.add_option('-V', '--auth-version', dest='auth_version', - default=environ.get('ST_AUTH_VERSION', '1.0'), + default=environ.get('ST_AUTH_VERSION', + (environ.get('OS_AUTH_VERSION', + '1.0'))), type=str, help='Specify a version for authentication. ' 'Defaults to 1.0.') @@ -1484,47 +1529,112 @@ Examples: help='Key for obtaining an auth token.') parser.add_option('-R', '--retries', type=int, default=5, dest='retries', help='The number of times to retry a failed connection.') - parser.add_option('--os-username', + default_val = config_true_value(environ.get('SWIFTCLIENT_INSECURE')) + parser.add_option('--insecure', + action="store_true", dest="insecure", + default=default_val, + help='Allow swiftclient to access servers without ' + 'having to verify the SSL certificate. ' + 'Defaults to env[SWIFTCLIENT_INSECURE] ' + '(set to \'true\' to enable).') + parser.add_option('--no-ssl-compression', + action='store_false', dest='ssl_compression', + default=True, + help='This option is deprecated and not used anymore. ' + 'SSL compression should be disabled by default ' + 'by the system SSL library.') + + os_grp = OptionGroup(parser, "OpenStack authentication options") + os_grp.add_option('--os-username', metavar='<auth-user-name>', default=environ.get('OS_USERNAME'), help='OpenStack username. Defaults to env[OS_USERNAME].') - parser.add_option('--os_username', + os_grp.add_option('--os_username', + help=SUPPRESS_HELP) + os_grp.add_option('--os-user-id', + metavar='<auth-user-id>', + default=environ.get('OS_USER_ID'), + help='OpenStack user ID. ' + 'Defaults to env[OS_USER_ID].') + os_grp.add_option('--os_user_id', + help=SUPPRESS_HELP) + os_grp.add_option('--os-user-domain-id', + metavar='<auth-user-domain-id>', + default=environ.get('OS_USER_DOMAIN_ID'), + help='OpenStack user domain ID. ' + 'Defaults to env[OS_USER_DOMAIN_ID].') + os_grp.add_option('--os_user_domain_id', + help=SUPPRESS_HELP) + os_grp.add_option('--os-user-domain-name', + metavar='<auth-user-domain-name>', + default=environ.get('OS_USER_DOMAIN_NAME'), + help='OpenStack user domain name. ' + 'Defaults to env[OS_USER_DOMAIN_NAME].') + os_grp.add_option('--os_user_domain_name', help=SUPPRESS_HELP) - parser.add_option('--os-password', + os_grp.add_option('--os-password', metavar='<auth-password>', default=environ.get('OS_PASSWORD'), help='OpenStack password. Defaults to env[OS_PASSWORD].') - parser.add_option('--os_password', + os_grp.add_option('--os_password', help=SUPPRESS_HELP) - parser.add_option('--os-tenant-id', + os_grp.add_option('--os-tenant-id', metavar='<auth-tenant-id>', default=environ.get('OS_TENANT_ID'), help='OpenStack tenant ID. ' 'Defaults to env[OS_TENANT_ID].') - parser.add_option('--os_tenant_id', + os_grp.add_option('--os_tenant_id', help=SUPPRESS_HELP) - parser.add_option('--os-tenant-name', + os_grp.add_option('--os-tenant-name', metavar='<auth-tenant-name>', default=environ.get('OS_TENANT_NAME'), help='OpenStack tenant name. ' 'Defaults to env[OS_TENANT_NAME].') - parser.add_option('--os_tenant_name', + os_grp.add_option('--os_tenant_name', help=SUPPRESS_HELP) - parser.add_option('--os-auth-url', + os_grp.add_option('--os-project-id', + metavar='<auth-project-id>', + default=environ.get('OS_PROJECT_ID'), + help='OpenStack project ID. ' + 'Defaults to env[OS_PROJECT_ID].') + os_grp.add_option('--os_project_id', + help=SUPPRESS_HELP) + os_grp.add_option('--os-project-name', + metavar='<auth-project-name>', + default=environ.get('OS_PROJECT_NAME'), + help='OpenStack project name. ' + 'Defaults to env[OS_PROJECT_NAME].') + os_grp.add_option('--os_project_name', + help=SUPPRESS_HELP) + os_grp.add_option('--os-project-domain-id', + metavar='<auth-project-domain-id>', + default=environ.get('OS_PROJECT_DOMAIN_ID'), + help='OpenStack project domain ID. ' + 'Defaults to env[OS_PROJECT_DOMAIN_ID].') + os_grp.add_option('--os_project_domain_id', + help=SUPPRESS_HELP) + os_grp.add_option('--os-project-domain-name', + metavar='<auth-project-domain-name>', + default=environ.get('OS_PROJECT_DOMAIN_NAME'), + help='OpenStack project domain name. ' + 'Defaults to env[OS_PROJECT_DOMAIN_NAME].') + os_grp.add_option('--os_project_domain_name', + help=SUPPRESS_HELP) + os_grp.add_option('--os-auth-url', metavar='<auth-url>', default=environ.get('OS_AUTH_URL'), help='OpenStack auth URL. Defaults to env[OS_AUTH_URL].') - parser.add_option('--os_auth_url', + os_grp.add_option('--os_auth_url', help=SUPPRESS_HELP) - parser.add_option('--os-auth-token', + os_grp.add_option('--os-auth-token', metavar='<auth-token>', default=environ.get('OS_AUTH_TOKEN'), help='OpenStack token. Defaults to env[OS_AUTH_TOKEN]. ' 'Used with --os-storage-url to bypass the ' 'usual username/password authentication.') - parser.add_option('--os_auth_token', + os_grp.add_option('--os_auth_token', help=SUPPRESS_HELP) - parser.add_option('--os-storage-url', + os_grp.add_option('--os-storage-url', metavar='<storage-url>', default=environ.get('OS_STORAGE_URL'), help='OpenStack storage URL. ' @@ -1532,48 +1642,44 @@ Examples: 'Overrides the storage url returned during auth. ' 'Will bypass authentication when used with ' '--os-auth-token.') - parser.add_option('--os_storage_url', + os_grp.add_option('--os_storage_url', help=SUPPRESS_HELP) - parser.add_option('--os-region-name', + os_grp.add_option('--os-region-name', metavar='<region-name>', default=environ.get('OS_REGION_NAME'), help='OpenStack region name. ' 'Defaults to env[OS_REGION_NAME].') - parser.add_option('--os_region_name', + os_grp.add_option('--os_region_name', help=SUPPRESS_HELP) - parser.add_option('--os-service-type', + os_grp.add_option('--os-service-type', metavar='<service-type>', default=environ.get('OS_SERVICE_TYPE'), help='OpenStack Service type. ' 'Defaults to env[OS_SERVICE_TYPE].') - parser.add_option('--os_service_type', + os_grp.add_option('--os_service_type', help=SUPPRESS_HELP) - parser.add_option('--os-endpoint-type', + os_grp.add_option('--os-endpoint-type', metavar='<endpoint-type>', default=environ.get('OS_ENDPOINT_TYPE'), help='OpenStack Endpoint type. ' 'Defaults to env[OS_ENDPOINT_TYPE].') - parser.add_option('--os-cacert', + os_grp.add_option('--os_endpoint_type', + help=SUPPRESS_HELP) + os_grp.add_option('--os-cacert', metavar='<ca-certificate>', default=environ.get('OS_CACERT'), help='Specify a CA bundle file to use in verifying a ' 'TLS (https) server certificate. ' 'Defaults to env[OS_CACERT].') - default_val = config_true_value(environ.get('SWIFTCLIENT_INSECURE')) - parser.add_option('--insecure', - action="store_true", dest="insecure", - default=default_val, - help='Allow swiftclient to access servers without ' - 'having to verify the SSL certificate. ' - 'Defaults to env[SWIFTCLIENT_INSECURE] ' - '(set to \'true\' to enable).') - parser.add_option('--no-ssl-compression', - action='store_false', dest='ssl_compression', - default=True, - help='This option is deprecated and not used anymore. ' - 'SSL compression should be disabled by default ' - 'by the system SSL library.') parser.disable_interspersed_args() + # call parse_args before adding os options group so that -h, --help will + # print a condensed help message without the os options + (options, args) = parse_args(parser, argv[1:], enforce_requires=False) + parser.add_option_group(os_grp) + if options.os_help: + # if openstack option help has been explicitly requested then force + # help message, now that os_options group has been added to parser + argv = ['-h'] (options, args) = parse_args(parser, argv[1:], enforce_requires=False) parser.enable_interspersed_args() |