diff --git a/examples/lftp.lua b/examples/lftp.lua new file mode 100644 index 0000000..56b5839 --- /dev/null +++ b/examples/lftp.lua @@ -0,0 +1,163 @@ +--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- lftp.lua +-- +-- Syncs with lftp +-- A (Layer 1) configuration. +--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +lftp = { + + ----- + -- Spawns rsync for a list of events + -- + action = function(inlet) + + -- gets all events ready for syncing + local elist = inlet.getEvents( + function(event) + return event.etype ~= 'Init' and event.etype ~= 'Blanket' + end + ) + + ----- + -- replaces filter rule by literals + -- + local function sub(p) + if not p then + return + end + return p:gsub('%?', '\\?'): + gsub('%*', '\\*'): + gsub('%[', '\\['): + gsub('%]', '\\]') + end + + local config = inlet.getConfig() + + local commands = elist.getPaths( + function(etype, path1, path2) + if etype == 'Delete' then + if string.byte(path1, -1) == 47 then + return 'rm -r '.. + config.targetdir..sub(path1) + else + return 'rm '.. + config.targetdir..sub(path1) + end + elseif + etype == 'Create' or + etype == 'Modify' or + etype == 'Attrib' + then + if string.byte(path1, -1) == 47 then + return 'mirror -R '.. + config.source..sub(path1)..' '.. + config.targetdir..sub(path1) + else + return 'put '.. + config.source..sub(path1).. + ' -o '..config.targetdir..sub(path1) + end + end + end + ) + + if #commands == 0 then + spawn(elist, '/bin/true') + return + end + + commands = table.concat(commands, ';\n') + + log('Normal', 'Calling lftp with commands\n', commands) + + spawn(elist, '/usr/bin/lftp', + '<', commands, + '-u', config.user..','..config.pass, config.host + ) + end, + + ----- + -- Spawns the recursive startup sync + -- + init = function(event) + local config = event.config + local inlet = event.inlet + local excludes = inlet.getExcludes() + local delete = nil + if config.delete then delete = { '--delete', '--ignore-errors' }; end + + if #excludes ~= 0 then + error('lftp does not work with excludes', 4) + end + + log('Normal', 'recursive startup lftp: ', config.source, ' to host: ', config.host) + + spawn(event, '/usr/bin/lftp', + '-c', + 'open -u '..config.user..','..config.pass..' '..config.host..'; '.. + 'mirror -R -e '..config.source..' '..config.targetdir..';' + ) + end, + + ----- + -- Checks the configuration. + -- + prepare = function(config) + + if not config.host then + error('lftps needs "host" configured', 4); + end + + if not config.user then + error('lftps needs "user" configured', 4); + end + + if not config.pass then + error('lftps needs "pass" configured', 4); + end + + if not config.targetdir then + error('lftp needs "targetdir" configured', 4) + end + + if config.target then + error('lftp needs NOT "target" configured', 4) + end + + if config.exclude then + error('lftp does not work with excludes', 4) + end + + if config.rsyncOpts then + error('lftp needs NOT "rsyncOpts" configured', 4) + end + + if string.sub(config.targetdir, -1) == '/' then + error('please make targetdir not end with a /', 4) + end + + end, + + ----- + -- Exit codes for rsync. + -- + exitcodes = { + [ 0] = 'ok', + [ 1] = 'ok', + }, + + ----- + -- Default delay + -- + delay = 1, +} + +sync{ + lftp, + host = 'localhost', + user = 'test', + pass = 'test', + source = 'src', + targetdir = '.', +}