This patch is a combination of my two previous patches with a little
code duplication removed. Also, the base directory for the patch is now the
top level of the source tree, not the directory above that.
Applying this patch to the current Func source (pulled from the git
repo) adds the following features:
* If the source and target file are identical then the target will not be
overwritten.
* Adds a --force option to overwrite the target file even if it is identical
to the source file.
* Adds a --backup option to make a timestamped backup of the target file
before it is overwritten.
--
Marcus
diff -rupN func/minion/modules/copyfile.py func.new/minion/modules/copyfile.py
--- func/minion/modules/copyfile.py 2011-01-01 11:45:52.000000000 -0500
+++ func.new/minion/modules/copyfile.py 2011-01-01 11:48:11.000000000 -0500
@@ -26,6 +26,7 @@ import time
import shutil
import func_module
+from func import utils as func_utils
class CopyFile(func_module.FuncModule):
@@ -40,28 +41,39 @@ class CopyFile(func_module.FuncModule):
return thissum.hexdigest()
def checksum(self, thing):
-
CHUNK=2**16
thissum = hashlib.new('sha1')
if os.path.exists(thing):
- fo = open(thing, 'r', CHUNK)
- chunk = fo.read
- while chunk:
+ fo = open(thing, 'r')
+ while True:
chunk = fo.read(CHUNK)
+ if not chunk:
+ break
thissum.update(chunk)
fo.close()
del fo
else:
- # assuming it's a string of some kind
+ # assuming it's a string of some kind
thissum.update(thing)
- return thissum.hexdigest()
+ hexdig = thissum.hexdigest()
+ return hexdig
- def open(self, filepath, mode=None, uid=-1, gid=-1):
+ def open(self, filepath, remote_sum, mode=None, uid=-1, gid=-1, backup=False, force=False):
dirpath = os.path.dirname(filepath)
if not os.path.exists(dirpath):
os.makedirs(dirpath)
+ if os.path.exists(filepath):
+ if not force:
+ local_sum = self.checksum(filepath)
+ if remote_sum == local_sum:
+ return 0
+
+ if backup:
+ if not self._backuplocal(filepath):
+ return -1
+
# Create empty file
try:
fo = open(filepath, 'w')
@@ -82,7 +94,14 @@ class CopyFile(func_module.FuncModule):
return filepath
- def append(self, filepath, filebuf):
+ def append(self, open_result, filebuf):
+ hostname = func_utils.get_hostname_by_route()
+ filepath = open_result[hostname]
+
+ # If the result of the open function was 0 (or -1), do not append, return the same value.
+ if type(filepath) == type(0):
+ return filepath
+
if not os.path.exists(filepath):
# file disaperead
return -1
diff -rupN func/overlord/cmd_modules/copyfile.py func.new/overlord/cmd_modules/copyfile.py
--- func/overlord/cmd_modules/copyfile.py 2011-01-01 11:45:52.000000000 -0500
+++ func.new/overlord/cmd_modules/copyfile.py 2011-01-01 11:48:11.000000000 -0500
@@ -34,6 +34,8 @@ class CopyFile(base_command.BaseCommand)
action="store")
self.parser.add_option("", "--remotepath", dest="remotepath",
action="store")
+ self.parser.add_option("", "--backup", dest="backup",
+ action="store_true")
self.parser.add_option("", "--force", dest="force",
action="store_true")
self.parser.add_option("-v", "--verbose", dest="verbose",
@@ -50,4 +52,4 @@ class CopyFile(base_command.BaseCommand)
self.server_spec = self.parentCommand.server_spec
self.getOverlord()
- return self.overlord_obj.local.copyfile.send(self.options.filename, self.options.remotepath)
+ return self.overlord_obj.local.copyfile.send(self.options.filename, self.options.remotepath, self.options.backup, self.options.force)
diff -rupN func/overlord/modules/copyfile.py func.new/overlord/modules/copyfile.py
--- func/overlord/modules/copyfile.py 2011-01-01 12:08:48.000000000 -0500
+++ func.new/overlord/modules/copyfile.py 2011-01-01 12:10:49.000000000 -0500
@@ -7,7 +7,7 @@ import xmlrpclib
from func.overlord import overlord_module
class copyfile(overlord_module.BaseModule):
- def send(self, localpath, remotepath, bufsize=60000):
+ def send(self, localpath, remotepath, backup=None, force=None, bufsize=60000):
try:
f = open(localpath, "r")
except IOError, e:
@@ -19,12 +19,19 @@ class copyfile(overlord_module.BaseModul
uid = st.st_uid
gid = st.st_gid
- self.parent.run("copyfile", "open", [remotepath, mode, uid, gid])
+ if force:
+ local_sum = -1
+ else:
+ import func.minion.modules.copyfile as CopyFile
+ cf = CopyFile.CopyFile()
+ local_sum = cf.checksum(localpath)
+
+ open_result = self.parent.run("copyfile", "open", [remotepath, local_sum, mode, uid, gid, backup, force])
while True:
data=f.read(bufsize)
if data:
- self.parent.run("copyfile", "append", [remotepath, xmlrpclib.Binary(data)])
+ self.parent.run("copyfile", "append", [open_result, xmlrpclib.Binary(data)])
else:
break
_______________________________________________
Func-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/func-list