diff env/bin/lss3 @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/bin/lss3	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,113 @@
+#!/Users/pldms/Development/Projects/2020/david-matthews-galaxy/guppy_basecaller/env/bin/python3
+import boto
+from boto.exception import S3ResponseError
+from boto.s3.connection import OrdinaryCallingFormat
+
+
+def sizeof_fmt(num):
+    for x in ['b ', 'KB', 'MB', 'GB', 'TB', 'XB']:
+        if num < 1024.0:
+            return "%3.1f %s" % (num, x)
+        num /= 1024.0
+    return "%3.1f %s" % (num, x)
+
+
+def list_bucket(b, prefix=None, marker=None):
+    """List everything in a bucket"""
+    from boto.s3.prefix import Prefix
+    from boto.s3.key import Key
+    total = 0
+
+    if prefix:
+        if not prefix.endswith("/"):
+            prefix = prefix + "/"
+        query = b.list(prefix=prefix, delimiter="/", marker=marker)
+        print("%s" % prefix)
+    else:
+        query = b.list(delimiter="/", marker=marker)
+
+    num = 0
+    for k in query:
+        num += 1
+        mode = "-rwx---"
+        if isinstance(k, Prefix):
+            mode = "drwxr--"
+            size = 0
+        else:
+            size = k.size
+            for g in k.get_acl().acl.grants:
+                if g.id == None:
+                    if g.permission == "READ":
+                        mode = "-rwxr--"
+                    elif g.permission == "FULL_CONTROL":
+                        mode = "-rwxrwx"
+        if isinstance(k, Key):
+            print("%s\t%s\t%010s\t%s" % (mode, k.last_modified,
+                                         sizeof_fmt(size), k.name))
+        else:
+           #If it's not a Key object, it doesn't have a last_modified time, so
+           #print nothing instead
+            print("%s\t%s\t%010s\t%s" % (mode, ' ' * 24,
+                                         sizeof_fmt(size), k.name))
+        total += size
+    print ("=" * 80)
+    print ("\t\tTOTAL:  \t%010s \t%i Files" % (sizeof_fmt(total), num))
+
+
+def list_buckets(s3, display_tags=False):
+    """List all the buckets"""
+    for b in s3.get_all_buckets():
+        print(b.name)
+        if display_tags:
+            try:
+                tags = b.get_tags()
+                for tag in tags[0]:
+                    print("   %s:%s" % (tag.key, tag.value))
+            except S3ResponseError as e:
+                if e.status != 404:
+                    raise
+
+
+def main():
+    import optparse
+    import sys
+
+    usage = "usage: %prog [options] [BUCKET1] [BUCKET2]"
+    description = "List all S3 buckets OR list keys in the named buckets"
+    parser = optparse.OptionParser(description=description, usage=usage)
+    parser.add_option('-m', '--marker',
+                      help='The S3 key where the listing starts after it.')
+    parser.add_option('-t', '--tags', action='store_true',
+                      help='Display tags when listing all buckets.')
+    options, buckets = parser.parse_args()
+    marker = options.marker
+
+    if not buckets:
+        list_buckets(boto.connect_s3(), options.tags)
+        sys.exit(0)
+
+    if options.tags:
+        print("-t option only works for the overall bucket list")
+        sys.exit(1)
+
+    pairs = []
+    mixedCase = False
+    for name in buckets:
+        if "/" in name:
+            pairs.append(name.split("/", 1))
+        else:
+            pairs.append([name, None])
+        if pairs[-1][0].lower() != pairs[-1][0]:
+            mixedCase = True
+
+    if mixedCase:
+        s3 = boto.connect_s3(calling_format=OrdinaryCallingFormat())
+    else:
+        s3 = boto.connect_s3()
+
+    for name, prefix in pairs:
+        list_bucket(s3.get_bucket(name), prefix, marker=marker)
+
+
+if __name__ == "__main__":
+    main()