diff --git a/bin/swift b/bin/swift index 35a7675e..53985987 100755 --- a/bin/swift +++ b/bin/swift @@ -67,13 +67,28 @@ def immediate_exit(signum, frame): stderr.write(" Aborted\n") os_exit(2) +st_delete_options = '''[-all] [--leave-segments] + [--object-threads <threads>] + [--container-threads <threads>] + <container> <object> +''' st_delete_help = ''' -delete [options] --all OR delete container [options] [object] [object] ... - Deletes everything in the account (with --all), or everything in a - container, or a list of objects depending on the args given. Segments of - manifest objects will be deleted as well, unless you specify the - --leave-segments option.'''.strip('\n') +Delete a container or objects within a container + +Positional arguments: + <container> Name of container to delete from + <object> Name of object to delete. Specify multiple times + for multiple objects + +Optional arguments: + --all Delete all containers and objects + --leave-segments Do not delete segments of manifest objects + --object-threads <threads> + Number of threads to use for deleting objects + --container-threads <threads> + Number of threads to use for deleting containers +'''.strip("\n") def st_delete(parser, args, thread_manager): @@ -95,8 +110,9 @@ def st_delete(parser, args, thread_manager): (options, args) = parse_args(parser, args) args = args[1:] if (not args and not options.yes_all) or (args and options.yes_all): - thread_manager.error('Usage: %s [options] %s', - basename(argv[0]), st_delete_help) + thread_manager.error('Usage: %s delete %s\n%s', + basename(argv[0]), st_delete_options, + st_delete_help) return def _delete_segment((container, obj), conn): @@ -218,17 +234,36 @@ def st_delete(parser, args, thread_manager): for obj in args[1:]: object_queue.put((args[0], obj)) +st_download_options = '''[--all] [--marker] [--prefix <prefix>] + [--output <out_file>] [--object-threads <threads>] + [--container-threads <threads>] [--no-download] + <container> <object> +''' st_download_help = ''' -download --all [options] OR download container [options] [object] [object] ... - Downloads everything in the account (with --all), or everything in all - containers in the account matching a prefix (with --all and -p [--prefix]), - or everything in a container, or a subset of a container with -p - [--prefix], or a list of objects depending on the args given. -p or - --prefix is an option that will only download items beginning with that - prefix. For a single object download, you may use the -o [--output] - <filename> option to redirect the output to a specific file or if "-" then - just redirect to stdout.'''.strip('\n') +Download objects from containers + +Positional arguments: + <container> Name of container to download from + <object> Name of object to download. Specify multiple times + for multiple objects + +Optional arguments: + --all Indicates that you really want to download + everything in the account + --marker Marker to use when starting a container or account + download + --prefix <prefix> Only download items beginning with <prefix> + --output <out_file> For a single file download, stream the output to + <out_file>. Specifying "-" as <out_file> will + redirect to stdout + --object-threads <threads> + Number of threads to use for downloading objects + --container-threads <threads> + Number of threads to use for deleting containers + --no-download Perform download(s), but don't actually write anything + to disk +'''.strip("\n") def st_download(parser, args, thread_manager): @@ -263,8 +298,8 @@ def st_download(parser, args, thread_manager): if options.out_file and len(args) != 2: exit('-o option only allowed for single file downloads') if (not args and not options.yes_all) or (args and options.yes_all): - thread_manager.error('Usage: %s [options] %s', basename(argv[0]), - st_download_help) + thread_manager.error('Usage: %s download %s\n%s', basename(argv[0]), + st_download_options, st_download_help) return def _download_object(queue_arg, conn): @@ -448,16 +483,23 @@ def prt_bytes(bytes, human_flag): return(bytes) - +st_list_options = '''[--long] [--lh] [--totals] + [--container-threads <threads>] +''' st_list_help = ''' -list [options] [container] - Lists the containers for the account or the objects for a container. -p or - --prefix is an option that will only list items beginning with that prefix. - -l produces output formatted like 'ls -l' and --lh like 'ls -lh'. - -t used with -l or --lh, only report totals - -d or --delimiter is option (for container listings only) that will roll up - items with the given delimiter (see http://docs.openstack.org/ - api/openstack-object-storage/1.0/content/list-objects.html) +Lists the containers for the account or the objects for a container + +Positional arguments: + <container> Name of container to list object in + +Optional arguments: + --long Long listing format, similar to ls -l + --lh Report sizes in human readable format similar to ls -lh + --totals Used with -l or --ls, only report totals + --prefix Only list items beginning with the prefix + --delimiter Roll up items with the given delimiter. For containers + only. See OpenStack Swift API documentation for what + this means. '''.strip('\n') @@ -470,7 +512,8 @@ def st_list(parser, args, thread_manager): "similar to ls -lh switch, but -h taken", action='store_true', default=False) parser.add_option( - '-t', dest='totals', help='used with -l or --ls, only report totals', + '-t', '--totals', dest='totals', help='used with -l or --ls, ' + 'only report totals', action='store_true', default=False) parser.add_option( '-p', '--prefix', dest='prefix', @@ -484,8 +527,8 @@ def st_list(parser, args, thread_manager): if options.delimiter and not args: exit('-d option only allowed for container listings') if len(args) > 1 or len(args) == 1 and args[0].find('/') >= 0: - thread_manager.error('Usage: %s [options] %s', basename(argv[0]), - st_list_help) + thread_manager.error('Usage: %s list %s\n%s', basename(argv[0]), + st_list_options, st_list_help) return conn = get_conn(options) @@ -559,11 +602,21 @@ def st_list(parser, args, thread_manager): else: thread_manager.error('Container %r not found', args[0]) +st_stat_options = '''[--lh] + <container> <object> +''' + st_stat_help = ''' -stat [container] [object] - Displays information for the account, container, or object depending on the - args given (if any). --lh will print number of objects and total sizes - like 'list --lh' noting number of objs a multiple of 1024'''.strip('\n') +Displays information for the account, container, or object + +Positional arguments: + <container> Name of container to stat from + <object> Name of object to stat. Specify multiple times + for multiple objects + +Optional arguments: + --lh Report sizes in human readable format similar to ls -lh +'''.strip('\n') def st_stat(parser, args, thread_manager): @@ -687,19 +740,38 @@ Write ACL: %s raise thread_manager.error("Object %s/%s not found", args[0], args[1]) else: - thread_manager.error('Usage: %s [options] %s', basename(argv[0]), - st_stat_help) + thread_manager.error('Usage: %s stat %s\n%s', basename(argv[0]), + st_stat_options, st_stat_help) +st_post_options = '''[--read-acl <acl>] [--write-acl <acl>] [--sync-to] + [--sync-key <sync-key>] [--meta <name:value>] + [--header <header>] + <container> <object> +''' + st_post_help = ''' -post [options] [container] [object] - Updates meta information for the account, container, or object depending on - the args given. If the container is not found, it will be created - automatically; but this is not true for accounts and objects. Containers - also allow the -r (or --read-acl) and -w (or --write-acl) options. The -m - or --meta option is allowed on all and used to define the user meta data - items to set in the form Name:Value. This option can be repeated. Example: - post -m Color:Blue -m Size:Large'''.strip('\n') +Updates meta information for the account, container, or object. +If the container is not found, it will be created automatically. + +Positional arguments: + <container> Name of container to post to + <object> Name of object to post. Specify multiple times + for multiple objects + +Optional arguments: + --read-acl <acl> Read ACL for containers. Quick summary of ACL syntax: + .r:*, .r:-.example.com, .r:www.example.com, account1, + account2:user2 + --write-acl <acl> Write ACL for containers. Quick summary of ACL syntax: + account1 account2:user2 + --sync-to <sync-to> Sync To for containers, for multi-cluster replication + --sync-key <sync-key> Sync Key for containers, for multi-cluster replication + --meta <name:value> Sets a meta data item. This option may be repeated. + Example: -m Color:Blue -m Size:Large + --header <header> Set request headers. This option may be repeated. + Example -H "content-type:text/plain" +'''.strip('\n') def st_post(parser, args, thread_manager): @@ -724,7 +796,7 @@ def st_post(parser, args, thread_manager): parser.add_option( '-H', '--header', action='append', dest='header', default=[], help='Set request headers with the syntax header:value. ' - ' This option may be repeated. Example -H content-type:text/plain ' + ' This option may be repeated. Example -H "content-type:text/plain" ' '-H "Content-Length: 4000"') (options, args) = parse_args(parser, args) args = args[1:] @@ -773,18 +845,49 @@ def st_post(parser, args, thread_manager): raise thread_manager.error("Object '%s/%s' not found", args[0], args[1]) else: - thread_manager.error('Usage: %s [options] %s', basename(argv[0]), - st_post_help) + thread_manager.error('Usage: %s post %s\n%s', basename(argv[0]), + st_post_options, st_post_help) +st_upload_options = '''[--changed] [--segment-size <size>] + [--segment-container <container>] [--leave-segments] + [--object-threads <thread>] [--segment-threads <threads>] + [--header <header>] [--use-slo] + <container> <file_or_directory> +''' st_upload_help = ''' -upload [options] container file_or_directory [file_or_directory] [...] - Uploads to the given container the files and directories specified by the - remaining args. -c or --changed is an option that will only upload files - that have changed since the last upload. -S <size> or --segment-size <size> - will upload the files in segments no larger than size. -C <container> or - --segment-container <container> will specify the location of the segments - to <container>. --leave-segments are options as well (see --help for more). +Uploads specified files and directories to the given container + +Positional arguments: + <container> Name of container to upload to + <file_or_directory> Name of file or directory to upload. Specify multiple + times for multiple uploads + +Optional arguments: + --changed Only upload files that have changed since the last + upload + --segment-size <size> Upload files in segments no larger than <size> and + then create a "manifest" file that will download all + the segments as if it were the original file + --segment-container <container> + Upload the segments into the specified container. If + not specified, the segments will be uploaded to a + <container>_segments container so as to not pollute the + main <container> listings. + --leave-segments Indicates that you want the older segments of manifest + objects left alone (in the case of overwrites) + --object-threads <threads> + Number of threads to use for uploading full objects. + Default is 10. + --segment-threads <threads> + Number of threads to use for uploading object segments. + Default is 10. + --header <header> Set request headers with the syntax header:value. + This option may be repeated. + Example -H "content-type:text/plain". + --use-slo When used in conjunction with --segment-size will + create a Static Large Object instead of the default + Dynamic Large Object. '''.strip('\n') @@ -818,17 +921,19 @@ def st_upload(parser, args, thread_manager): parser.add_option( '-H', '--header', action='append', dest='header', default=[], help='Set request headers with the syntax header:value. ' - ' This option may be repeated. Example -H content-type:text/plain ' + ' This option may be repeated. Example -H "content-type:text/plain" ' '-H "Content-Length: 4000"') - parser.add_option('', '--use-slo', action='store_true', default=False, - help='When used in conjuction with --segment-size will ' - 'create a Static Large Object instead of the default ' - 'Dynamic Large Object.') + parser.add_option( + '', '--use-slo', action='store_true', default=False, + help='When used in conjunction with --segment-size will ' + 'create a Static Large Object instead of the default ' + 'Dynamic Large Object.') (options, args) = parse_args(parser, args) args = args[1:] if len(args) < 2: thread_manager.error( - 'Usage: %s [options] %s', basename(argv[0]), st_upload_help) + 'Usage: %s upload %s\n%s', basename(argv[0]), st_upload_options, + st_upload_help) return def _segment_job(job, conn): @@ -1160,18 +1265,37 @@ if __name__ == '__main__': version = version_info.version_string() parser = OptionParser(version='%%prog %s' % version, usage=''' -Usage: %%prog <command> [options] [args] +usage: %%prog [--version] [--help] [--snet] [--verbose] + [--debug] [--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-tenant-id <auth-tenant-id>] + [--os-tenant-name <auth-tenant-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>] + [--os-endpoint-type <endpoint-type>] + [--os-cacert <ca-certificate>] [--insecure] + [--no-ssl-compression] + <subcommand> ... -Commands: - %(st_stat_help)s - %(st_list_help)s - %(st_upload_help)s - %(st_post_help)s - %(st_download_help)s - %(st_delete_help)s +Command-line interface to the OpenStack Swift API. + +Positional arguments: + <subcommand> + delete Delete a container or objects within a container + downlad Download objects from containers + list Lists the containers for the account or the objects + for a container + post Updates meta information for the account, container, + or object + stat Displays information for the account, container, + or object + upload Uploads files or directories to the given container Examples: - %%prog -A https://auth.api.rackspacecloud.com/v1.0 -U user -K key stat -v + %%prog -A https://auth.api.rackspacecloud.com/v1.0 -U user -K api_key stat -v %%prog --os-auth-url https://api.example.com/v2.0 --os-tenant-name tenant \\ --os-username user --os-password password list