Browse code

2007-05-26 Michal Ludvig <michal@logix.cz>

* s3cmd: Patch from Basil Shubin <basil.shubin@gmail.com>
adding support for "s3cmd du" command.



git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3cmd/trunk@117 830e0280-6d2a-0410-9c65-932aecc39d9d

Michal Ludvig authored on 2007/05/26 15:09:16
Showing 2 changed files
... ...
@@ -1,5 +1,7 @@
1 1
 2007-05-26  Michal Ludvig  <michal@logix.cz>
2 2
 
3
+	* s3cmd: Patch from Basil Shubin <basil.shubin@gmail.com>
4
+	  adding support for "s3cmd du" command.
3 5
 	* setup.cfg: Require Python 2.5 in RPM. Otherwise it needs
4 6
 	  to require additional python modules (e.g. ElementTree)
5 7
 	  which may have different names in different distros. It's 
... ...
@@ -24,6 +24,49 @@ from S3.S3Uri import *
24 24
 def output(message):
25 25
 	print message
26 26
 
27
+def cmd_du(args):
28
+	s3 = S3(Config())
29
+	if len(args) > 0:
30
+		uri = S3Uri(args[0])
31
+		if uri.type == "s3" and uri.has_bucket():
32
+			subcmd_bucket_usage(s3, uri)
33
+			return
34
+	subcmd_bucket_usage_all(s3)
35
+
36
+def subcmd_bucket_usage_all(s3):
37
+	response = s3.list_all_buckets()
38
+
39
+	buckets_size = 0
40
+	for bucket in response["list"]:
41
+		size = subcmd_bucket_usage(s3, S3Uri("s3://" + bucket["Name"]))
42
+		if size != None:
43
+			buckets_size += size
44
+		output("")
45
+	total_size, size_coeff = formatSize(buckets_size, Config().human_readable_sizes)
46
+	output("Total Disk Usage: %s%s" % (str(total_size).rjust(8), size_coeff.ljust(1)))
47
+
48
+def subcmd_bucket_usage(s3, uri):
49
+	bucket = uri.bucket()
50
+	object = uri.object()
51
+
52
+	if object.endswith('*'):
53
+		object = object[:-1]
54
+	try:
55
+		response = s3.bucket_list(bucket, prefix = object)
56
+	except S3Error, e:
57
+		if S3.codes.has_key(e.Code):
58
+			error(S3.codes[e.Code] % bucket)
59
+			return
60
+		else:
61
+			raise
62
+	bucket_size = 0
63
+	for object in response["list"]:
64
+		size, size_coeff = formatSize(object["Size"], False)
65
+		bucket_size += size
66
+	total_size, size_coeff = formatSize(bucket_size, Config().human_readable_sizes)
67
+	output("Bucket %s Usage: %s%s" % (bucket, str(total_size).rjust(8), size_coeff.ljust(1)))
68
+	return total_size
69
+
27 70
 def cmd_ls(args):
28 71
 	s3 = S3(Config())
29 72
 	if len(args) > 0:
... ...
@@ -229,6 +272,7 @@ commands_list = [
229 229
 	{"cmd":"mb", "label":"Make bucket", "param":"s3://BUCKET", "func":cmd_bucket_create, "argc":1},
230 230
 	{"cmd":"rb", "label":"Remove bucket", "param":"s3://BUCKET", "func":cmd_bucket_delete, "argc":1},
231 231
 	{"cmd":"ls", "label":"List objects or buckets", "param":"[s3://BUCKET[/PREFIX]]", "func":cmd_ls, "argc":0},
232
+	{"cmd":"du", "label":"Disk usage by buckets", "param":"[s3://BUCKET[/PREFIX]]", "func":cmd_du, "argc":0},
232 233
 	{"cmd":"la", "label":"List all object in all buckets", "param":"", "func":cmd_buckets_list_all_all, "argc":0},
233 234
 	{"cmd":"put", "label":"Put file into bucket", "param":"FILE [FILE...] s3://BUCKET[/PREFIX]", "func":cmd_object_put, "argc":2},
234 235
 	{"cmd":"get", "label":"Get file from bucket", "param":"s3://BUCKET/OBJECT LOCAL_FILE", "func":cmd_object_get, "argc":1},