summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/swift77
-rw-r--r--doc/manpages/swift.15
2 files changed, 76 insertions, 6 deletions
diff --git a/bin/swift b/bin/swift
index e30d697..e027df8 100755
--- a/bin/swift
+++ b/bin/swift
@@ -26,7 +26,7 @@ from Queue import Queue
from random import shuffle
from sys import argv, exc_info, exit, stderr, stdout
from threading import enumerate as threading_enumerate, Thread
-from time import sleep, time
+from time import sleep, time, gmtime, strftime
from traceback import format_exception
from urllib import quote, unquote
@@ -492,24 +492,60 @@ def st_download(parser, args, print_queue, error_queue):
put_errors_from_threads(object_threads, error_queue)
+def prt_bytes(bytes, human_flag):
+ """
+ convert a number > 1024 to printable format, either in 4 char -h format as
+ with ls -lh or return as 12 char right justified string (up to 999GB)
+ """
+
+ if human_flag:
+ suffix = ''
+ mods = 'KMGTPEZY'
+ temp = float(bytes)
+ if temp > 0:
+ while (temp > 1023):
+ temp /= 1024.0
+ suffix = mods[0]
+ mods = mods[1:]
+ if suffix != '':
+ if temp > 9:
+ bytes = '%3d%s' % (temp, suffix)
+ else:
+ bytes = '%.1f%s' % (temp, suffix)
+ if suffix == '': # must be < 1024
+ bytes = '%4s' % bytes
+ else:
+ bytes = '%12s' % bytes
+
+ return(bytes)
+
+
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'.
-d or --delimiter is option (for container listings only) that will roll up
- items with the given delimiter (see Cloud Files general documentation for
- what this means).
+ items with the given delimiter (see http://docs.openstack.org/
+ api/openstack-object-storage/1.0/content/list-objects.html)
'''.strip('\n')
def st_list(parser, args, print_queue, error_queue):
parser.add_option(
+ '-l', '--long', dest='long', help='Long listing '
+ 'similar to ls -l command', action='store_true', default=False)
+ parser.add_option(
+ '--lh', dest='human', help='report sizes as human '
+ "similar to ls -lh switch, but -h taken", action='store_true',
+ default=False)
+ parser.add_option(
'-p', '--prefix', dest='prefix',
help='Will only list items beginning with the prefix')
parser.add_option(
'-d', '--delimiter', dest='delimiter',
help='Will roll up items with the given delimiter'
- ' (see Cloud Files general documentation for what this means)')
+ ' (see Cloud Files general documentation for what this means)')
(options, args) = parse_args(parser, args)
args = args[1:]
if options.delimiter and not args:
@@ -533,7 +569,35 @@ def st_list(parser, args, print_queue, error_queue):
if not items:
break
for item in items:
- print_queue.put(item.get('name', item.get('subdir')))
+ item_name = item.get('name')
+
+ if not options.long and not options.human:
+ print_queue.put(item.get('name', item.get('subdir')))
+ else:
+ if len(args) == 0: # listing containers
+ bytes = prt_bytes(item.get('bytes'), options.human)
+ count = item.get('count')
+ try:
+ meta = conn.head_container(item_name)
+ utc = gmtime(float(meta.get('x-timestamp')))
+ datestamp = strftime('%Y-%m-%d %H:%M:%S', utc)
+ except ClientException:
+ datestamp = '????-??-?? ??:??:??'
+ print_queue.put("%5s %s %s %s" %
+ (count, bytes, datestamp, item_name))
+ else: # list container contents
+ subdir = item.get('subdir')
+ if subdir is None:
+ bytes = prt_bytes(item.get('bytes'), options.human)
+ date, xtime = item.get('last_modified').split('T')
+ xtime = xtime.split('.')[0]
+ else:
+ bytes = prt_bytes(0, options.human)
+ date = xtime = ''
+ item_name = subdir
+ print_queue.put("%s %10s %8s %s" %
+ (bytes, date, xtime, item_name))
+
marker = items[-1].get('name', items[-1].get('subdir'))
except ClientException as err:
if err.http_status != 404:
@@ -543,7 +607,6 @@ def st_list(parser, args, print_queue, error_queue):
else:
error_queue.put('Container %s not found' % repr(args[0]))
-
st_stat_help = '''
stat [container] [object]
Displays information for the account, container, or object depending on the
@@ -1160,6 +1223,8 @@ Examples:
%%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('-s', '--snet', action='store_true', dest='snet',
default=False, help='Use SERVICENET internal network')
diff --git a/doc/manpages/swift.1 b/doc/manpages/swift.1
index 71530e9..0fafbe7 100644
--- a/doc/manpages/swift.1
+++ b/doc/manpages/swift.1
@@ -50,6 +50,11 @@ The -p or --prefix is an option that will only list items beginning
with that prefix. The -d or --delimiter is option (for container listings only)
that will roll up items with the given delimiter (see Cloud Files general
documentation for what this means).
+
+The -l and --lh options provide more detail, similar to ls -l and ls -lh, the latter
+providing sizes in human readable format (eg 3K, 12M, etc). These latter 2 switches
+use more overhead to get those details, which is directly proportional to the number
+of container or objects being listed.
.RE
\fBupload\fR [\fIcommand-options\fR] container file_or_directory [\fIfile_or_directory\fR] [...]