My apologies for cutting/pasting/posting without proofing.  

This patch allows s3cmd to utilize md5sums stored in the extended attributes of 
files.  If for any reason, that doesn’t work, the usual md5sum mechanisms are 
used.  This option only has impact if checkmd5 is enabled.
The last patch block corrects a typo in the s3cmd ‘--acl-revoke’ option help 
text.

diff -ru s3cmd-1.5.0-alpha3.orig/S3/Utils.py s3cmd-1.5.0-alpha3/S3/Utils.py
--- s3cmd-1.5.0-alpha3.orig/S3/Utils.py 2013-03-10 15:35:09.000000000 -0700
+++ s3cmd-1.5.0-alpha3/S3/Utils.py      2013-05-13 14:13:22.083721474 -0700
@@ -35,6 +35,12 @@
     import elementtree.ElementTree as ET
from xml.parsers.expat import ExpatError

+try:
+    import xattr
+    hasXattr = True
+except:
+    hasXattr = False
+
__all__ = []
def parseNodes(nodes):
     ## WARNING: Ignores text nodes from mixed xml/text.
@@ -226,7 +232,14 @@
     return mktmpsomething(prefix, randchars, createfunc)
__all__.append("mktmpfile")

-def hash_file_md5(filename):
+def hash_file_md5(filename, xattrName=None):
+    if hasXattr and xattrName is not None:
+        try:
+            md5sum = xattr.get(filename, xattrName)
+            return md5sum
+        except:
+            pass
+
     h = md5()
     f = open(filename, "rb")
     while True:
diff -ru s3cmd-1.5.0-alpha3.orig/s3cmd s3cmd-1.5.0-alpha3/s3cmd
--- s3cmd-1.5.0-alpha3.orig/s3cmd       2013-03-10 17:06:33.000000000 -0700
+++ s3cmd-1.5.0-alpha3/s3cmd    2013-05-13 14:10:33.927609005 -0700
@@ -32,6 +32,12 @@
from logging import debug, info, warning, error
from distutils.spawn import find_executable

+try:
+    import xattr
+    hasXattr = True
+except:
+    hasXattr = False
+
def output(message):
     sys.stdout.write(message + "\n")
     sys.stdout.flush()
@@ -1507,9 +1513,9 @@
                         ret_enc = gpg_encrypt(filename)
                         ret_dec = gpg_decrypt(ret_enc[1], ret_enc[2], False)
                         hash = [
-                            Utils.hash_file_md5(filename),
-                            Utils.hash_file_md5(ret_enc[1]),
-                            Utils.hash_file_md5(ret_dec[1]),
+                            Utils.hash_file_md5(filename, options.xattr),
+                            Utils.hash_file_md5(ret_enc[1], options.xattr),
+                            Utils.hash_file_md5(ret_dec[1], options.xattr),
                         ]
                         os.unlink(filename)
                         os.unlink(ret_enc[1])
@@ -1762,11 +1768,13 @@
     optparser.add_option(      "--skip-existing", dest="skip_existing", 
action="store_true", help="Skip over files that exist at the destination (only 
for [get] and [sync] commands).")
     optparser.add_option("-r", "--recursive", dest="recursive", 
action="store_true", help="Recursive upload, download or removal.")
     optparser.add_option(      "--check-md5", dest="check_md5", 
action="store_true", help="Check MD5 sums when comparing files for [sync]. 
(default)")
+    if hasXattr:
+        optparser.add_option  ("--xattr", dest="xattr", action="store", 
help="If possible, use extended file attribute named (default:%default) instead 
of calculating it [sync].")
     optparser.add_option(      "--no-check-md5", dest="check_md5", 
action="store_false", help="Do not check MD5 sums when comparing files for 
[sync]. Only size will be compared. May significantly speed up transfer but may 
also miss some changed files.")
     optparser.add_option("-P", "--acl-public", dest="acl_public", 
action="store_true", help="Store objects with ACL allowing read for anyone.")
     optparser.add_option(      "--acl-private", dest="acl_public", 
action="store_false", help="Store objects with default ACL allowing access for 
you only.")
     optparser.add_option(      "--acl-grant", dest="acl_grants", type="s3acl", 
action="append", metavar="PERMISSION:EMAIL or USER_CANONICAL_ID", help="Grant 
stated permission to a given amazon user. Permission is one of: read, write, 
read_acp, write_acp, full_control, all")
-    optparser.add_option(      "--acl-revoke", dest="acl_revokes", 
type="s3acl", action="append", metavar="PERMISSION:USER_CANONICAL_ID", 
help="Revoke stated permission for a given amazon user. Permission is one of: 
read, write, read_acp, wr     ite_acp, full_control, all")
+    optparser.add_option(      "--acl-revoke", dest="acl_revokes", 
type="s3acl", action="append", metavar="PERMISSION:USER_CANONICAL_ID", 
help="Revoke stated permission for a given amazon user. Permission is one of: 
read, write, read_acp, write_acp, full_control, all")

     optparser.add_option(      "--delete-removed", dest="delete_removed", 
action="store_true", help="Delete remote objects with no corresponding local 
file [sync]")
     optparser.add_option(      "--no-delete-removed", dest="delete_removed", 
action="store_false", help="Don't delete remote objects.")


------------------------------------------------------------------------------
AlienVault Unified Security Management (USM) platform delivers complete
security visibility with the essential security capabilities. Easily and
efficiently configure, manage, and operate all of your security controls
from a single console and one unified framework. Download a free trial.
http://p.sf.net/sfu/alienvault_d2d
_______________________________________________
S3tools-general mailing list
S3tools-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/s3tools-general

Reply via email to