... | ... |
@@ -547,6 +547,17 @@ class S3(object): |
547 | 547 |
response = self.send_request(request) |
548 | 548 |
return response |
549 | 549 |
|
550 |
+ def get_multipart(self, uri): |
|
551 |
+ request = self.create_request("BUCKET_LIST", bucket = uri.bucket(), extra = "?uploads") |
|
552 |
+ response = self.send_request(request) |
|
553 |
+ return response |
|
554 |
+ |
|
555 |
+ def abort_multipart(self, uri, id): |
|
556 |
+ request = self.create_request("OBJECT_DELETE", uri=uri, |
|
557 |
+ extra = ("?uploadId=%s" % id)) |
|
558 |
+ response = self.send_request(request) |
|
559 |
+ return response |
|
560 |
+ |
|
550 | 561 |
def get_accesslog(self, uri): |
551 | 562 |
request = self.create_request("BUCKET_LIST", bucket = uri.bucket(), extra = "?logging") |
552 | 563 |
response = self.send_request(request) |
... | ... |
@@ -1244,6 +1244,34 @@ def cmd_delpolicy(args): |
1244 | 1244 |
output(u"%s: Policy deleted" % uri) |
1245 | 1245 |
|
1246 | 1246 |
|
1247 |
+def cmd_multipart(args): |
|
1248 |
+ s3 = S3(cfg) |
|
1249 |
+ uri = S3Uri(args[0]) |
|
1250 |
+ |
|
1251 |
+ #id = '' |
|
1252 |
+ #if(len(args) > 1): id = args[1] |
|
1253 |
+ |
|
1254 |
+ response = s3.get_multipart(uri) |
|
1255 |
+ debug(u"response - %s" % response['status']) |
|
1256 |
+ output(u"%s" % uri) |
|
1257 |
+ tree = getTreeFromXml(response['data']) |
|
1258 |
+ debug(parseNodes(tree)) |
|
1259 |
+ output(u"Initiated\tId\tPath") |
|
1260 |
+ for mpupload in parseNodes(tree): |
|
1261 |
+ try: |
|
1262 |
+ output("%s\t%s\t%s" % (mpupload['Initiated'], mpupload['UploadId'], mpupload['Key'])) |
|
1263 |
+ except: |
|
1264 |
+ pass |
|
1265 |
+ |
|
1266 |
+def cmd_abort_multipart(args): |
|
1267 |
+ '''{"cmd":"abortmp", "label":"abort a multipart upload", "param":"s3://BUCKET Id", "func":cmd_abort_multipart, "argc":2},''' |
|
1268 |
+ s3 = S3(cfg) |
|
1269 |
+ uri = S3Uri(args[0]) |
|
1270 |
+ id = args[1] |
|
1271 |
+ response = s3.abort_multipart(uri, id) |
|
1272 |
+ debug(u"response - %s" % response['status']) |
|
1273 |
+ output(u"%s" % uri) |
|
1274 |
+ |
|
1247 | 1275 |
def cmd_accesslog(args): |
1248 | 1276 |
s3 = S3(cfg) |
1249 | 1277 |
bucket_uri = S3Uri(args.pop()) |
... | ... |
@@ -1598,6 +1626,9 @@ def get_commands_list(): |
1598 | 1598 |
{"cmd":"setpolicy", "label":"Modify Bucket Policy", "param":"FILE s3://BUCKET", "func":cmd_setpolicy, "argc":2}, |
1599 | 1599 |
{"cmd":"delpolicy", "label":"Delete Bucket Policy", "param":"s3://BUCKET", "func":cmd_delpolicy, "argc":1}, |
1600 | 1600 |
|
1601 |
+ {"cmd":"multipart", "label":"show multipart uploads", "param":"s3://BUCKET [Id]", "func":cmd_multipart, "argc":1}, |
|
1602 |
+ {"cmd":"abortmp", "label":"abort a multipart upload", "param":"s3://BUCKET/OBJECT Id", "func":cmd_abort_multipart, "argc":2}, |
|
1603 |
+ |
|
1601 | 1604 |
{"cmd":"accesslog", "label":"Enable/disable bucket access logging", "param":"s3://BUCKET", "func":cmd_accesslog, "argc":1}, |
1602 | 1605 |
{"cmd":"sign", "label":"Sign arbitrary string using the secret key", "param":"STRING-TO-SIGN", "func":cmd_sign, "argc":1}, |
1603 | 1606 |
{"cmd":"signurl", "label":"Sign an S3 URL to provide limited public access with expiry", "param":"s3://BUCKET/OBJECT expiry_epoch", "func":cmd_signurl, "argc":2}, |