This patch enables two options to copyfile: --force and --backup. My
earlier patch from the e-mail entitled "[PATCH] Add checksumming feature to
copyfile module" must be applied to the func source before this patch is
applied.
My earlier patch caused func to calculate a checksum for the source
and target files (the latter only if it exists). If the checksums are
identical then the target file is not overwritten. The --force options skips
this check. The checksum is not calculated on either the overlord or minion
and the target file will be overwritten even if it is identical to the source
file.
The --backup option creates a dated backup of the target file before
it is overwritten. This takes advantage of the already-present _backuplocal
function in the CopyFile class. The backup is only created prior to
overwriting the target file, e.g if the source and target checksums differ or
if --force is enabled.
It looks as though the original copyfile function of the CopyFile
class automatically did a backup every time. Making a backup is not the
default in my code.
--
Marcus
diff -rupN func/func//minion/modules/copyfile.py func.new/func//minion/modules/copyfile.py
--- func/func//minion/modules/copyfile.py 2010-12-14 19:16:55.000000000 -0500
+++ func.new/func//minion/modules/copyfile.py 2010-12-14 20:16:18.000000000 -0500
@@ -59,16 +59,20 @@ class CopyFile(func_module.FuncModule):
hexdig = thissum.hexdigest()
return hexdig
- def open(self, filepath, remote_sum, 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):
- local_sum = self.checksum(filepath)
+ if not force:
+ local_sum = self.checksum(filepath)
+ if remote_sum == local_sum:
+ return 0
- if remote_sum == local_sum:
- return 0
+ if backup:
+ if not self._backuplocal(filepath):
+ return -1
# Create empty file
try:
diff -rupN func/func//overlord/cmd_modules/copyfile.py func.new/func//overlord/cmd_modules/copyfile.py
--- func/func//overlord/cmd_modules/copyfile.py 2010-12-14 19:16:37.000000000 -0500
+++ func.new/func//overlord/cmd_modules/copyfile.py 2010-12-14 19:09:38.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/func//overlord/modules/copyfile.py func.new/func//overlord/modules/copyfile.py
--- func/func//overlord/modules/copyfile.py 2010-12-14 19:16:55.000000000 -0500
+++ func.new/func//overlord/modules/copyfile.py 2010-12-14 20:17:23.000000000 -0500
@@ -38,7 +38,7 @@ class copyfile(overlord_module.BaseModul
hexdig = thissum.hexdigest()
return hexdig
- 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:
@@ -49,9 +49,13 @@ class copyfile(overlord_module.BaseModul
mode = stat.S_IMODE(st.st_mode)
uid = st.st_uid
gid = st.st_gid
- local_sum = self.checksum(localpath)
- open_result = self.parent.run("copyfile", "open", [remotepath, local_sum, mode, uid, gid])
+ if force:
+ local_sum = -1
+ else:
+ local_sum = self.checksum(localpath)
+
+ open_result = self.parent.run("copyfile", "open", [remotepath, local_sum, mode, uid, gid, backup, force])
while True:
data=f.read(bufsize)
_______________________________________________
Func-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/func-list