diff --git a/lsyncd.lua b/lsyncd.lua index 13470a4..09a7d9e 100644 --- a/lsyncd.lua +++ b/lsyncd.lua @@ -454,25 +454,25 @@ local Inlet, InletControl = (function() ----- -- Returns a list of file/dirnames of all events in list. -- - getNames = function(elist) - local dlist = el2dl[elist] - if not dlist then - error("cannot find delay list from event list.") - end - local pl = {} - local i = 1 - for k, d in pairs(dlist) do - if type(k) == "number" then - pl[i] = string.match(d.path, "[^/]+/?$") - i = i + 1 - if d.path2 then - pl[i] = string.match(d.path2, "[^/]+/?$") - i = i + 1 - end - end - end - return pl - end, + --getNames = function(elist) + -- local dlist = el2dl[elist] + -- if not dlist then + -- error("cannot find delay list from event list.") + -- end + -- local pl = {} + -- local i = 1 + -- for k, d in pairs(dlist) do + -- if type(k) == "number" then + -- pl[i] = string.match(d.path, "[^/]+/?$") + -- i = i + 1 + -- if d.path2 then + -- pl[i] = string.match(d.path2, "[^/]+/?$") + -- i = i + 1 + -- end + -- end + -- end + -- return pl + --end, ----- -- Returns a list of paths of all events in list. @@ -507,25 +507,25 @@ local Inlet, InletControl = (function() ----- -- Returns a list of absolutes local paths in list. -- - getSourcePaths = function(elist) - local dlist = el2dl[elist] - if not dlist then - error("cannot find delay list from event list.") - end - local pl = {} - local i = 1 - for k, d in pairs(dlist) do - if type(k) == "number" then - pl[i] = sync.source .. d.path - i = i + 1 - if d.path2 then - pl[i] = sync.source .. d.path2 - i = i + 1 - end - end - end - return pl - end, + --getSourcePaths = function(elist) + -- local dlist = el2dl[elist] + -- if not dlist then + -- error("cannot find delay list from event list.") + -- end + -- local pl = {} + -- local i = 1 + -- for k, d in pairs(dlist) do + -- if type(k) == "number" then + -- pl[i] = sync.source .. d.path + -- i = i + 1 + -- if d.path2 then + -- pl[i] = sync.source .. d.path2 + -- i = i + 1 + -- end + -- end + -- end + -- return pl + --end, } @@ -2484,7 +2484,7 @@ local rsync_exitcodes = { ----- -- Exitcodes to retry on network failures of rsync. -- -local rsync_ssh = { +local ssh_exitcodes = { [255] = "again", } @@ -2601,27 +2601,60 @@ local default_rsyncssh = { action = function(inlet) local event = inlet.getEvent() local config = inlet.getConfig() + + -- makes move local on host if event.etype == 'Move' then - -- makes move local on host + log("Normal", "Moving ",event.path," -> ",event.path2) spawn(event, "/usr/bin/ssh", config.host, "mv", config.targetdir .. event.path, config.targetdir .. event.path2) return end + + -- uses ssh to delete files on remote host + -- instead of constructing rsync filters + if event.etype == 'Delete' then + local elist = inlet.getEvents( + function(e) + return e.etype == "Delete" + end) + + local paths = elist.getPaths( + function(etype, path1, path2) + if path2 then + return config.targetdir..path1, config.targetdir..path2 + else + return config.targetdir..path1 + end + end) + + for _, v in pairs(paths) do + if string.match(v, "^%s*/+%s*$") then + log("Error", "refusing to `rm -rf /` the target!") + terminate(-1) -- ERRNO + end + end + + local sPaths = table.concat(paths, "\n") + log("Normal", "Deleting list\n", sPaths) + spawn(event, "/usr/bin/ssh", + "<", sPaths, + config.host, "xargs", "echo", "rm -rf") + return + end + -- for everything else spawn a rsync - -- gets all events that are not Move - local elist = inlet.getEvents(function(e) - return e.etype ~= "Move" + local elist = inlet.getEvents( + function(e) + return e.etype ~= "Move" and e.etype ~= "Delete" end) local paths = table.concat(elist.getPaths(), "\n") - log("Normal", "rsyncing list\n", spaths) + log("Normal", "Rsyncing list\n", paths) spawn(elist, "/usr/bin/rsync", - "<", spaths, - config.rsyncOps, "r", - "--delete", - "--include-from=-", - "--exclude=*", + "<", paths, + config.rsyncOps, + "--files-from=-", config.source, config.host .. ":" .. config.targetdir) end, diff --git a/tests/churn-rsync.lua b/tests/churn-rsync.lua new file mode 100755 index 0000000..9584b25 --- /dev/null +++ b/tests/churn-rsync.lua @@ -0,0 +1,43 @@ +#!/usr/bin/lua +-- a heavy duty test. +-- makes thousends of random changes to the source tree +-- checks every X changes if lsyncd managed to keep target tree in sync. +require("posix") +dofile("tests/testlib.lua") + +local tdir = mktempd().."/" +cwriteln("using ", tdir, " as test root") + +local srcdir = tdir.."src/" +local trgdir = tdir.."trg/" + +posix.mkdir(srcdir) +posix.mkdir(trgdir) + +local logs = {} +--logs = {"-log", "Inotify", "-log", "Exec" } +local pid = spawn("./lsyncd", "-nodaemon", + "-rsync", srcdir, trgdir, unpack(logs)) + +cwriteln("waiting for Lsyncd to startup") +posix.sleep(1) + +churn(srcdir, 100) + +cwriteln("waiting for Lsyncd to finish its jobs.") +posix.sleep(20) + +cwriteln("killing the Lsyncd daemon") +posix.kill(pid) +local _, exitmsg, lexitcode = posix.wait(lpid) +cwriteln("Exitcode of Lsyncd = ", exitmsg, " ", lexitcode) + +exitcode = os.execute("diff -r "..srcdir.." "..trgdir) +cwriteln("Exitcode of diff = '", exitcode, "'") +if exitcode ~= 0 then + os.exit(1) +else + os.exit(0) +end + + diff --git a/tests/randrsync.lua b/tests/churn-rsyncssh.lua similarity index 83% rename from tests/randrsync.lua rename to tests/churn-rsyncssh.lua index 9fb2c97..9552d82 100755 --- a/tests/randrsync.lua +++ b/tests/churn-rsyncssh.lua @@ -5,9 +5,6 @@ require("posix") dofile("tests/testlib.lua") --- always makes the same "random", so failures can be debugged. -math.randomseed(os.getenv("SEED")) - local tdir = mktempd().."/" cwriteln("using ", tdir, " as test root") @@ -19,7 +16,11 @@ posix.mkdir(trgdir) local logs = {} --logs = {"-log", "Inotify", "-log", "Exec" } -local pid = spawn("./lsyncd","-nodaemon","-rsync",srcdir,trgdir, unpack(logs)) +--logs = {"-log", "all" } + +local pid = spawn("./lsyncd", "-nodaemon", + "-rsyncssh", srcdir, "localhost", trgdir, + unpack(logs)) cwriteln("waiting for Lsyncd to startup") posix.sleep(1) diff --git a/tests/testlib.lua b/tests/testlib.lua index 38f2848..5e824a6 100755 --- a/tests/testlib.lua +++ b/tests/testlib.lua @@ -13,6 +13,16 @@ function cwriteln(...) io.write(c0, "\n") end +----- +-- initializes the pseudo random generator +-- if environemnt "SEED" is set, use that as seed. +local seed = os.getenv("SEED") +if not seed then + seed = os.time() +end +math.randomseed(seed) +cwriteln("random seed: ", seed) + ----- -- creates a tmp directory --