mirror of
https://github.com/octoleo/lsyncd.git
synced 2024-11-14 17:14:04 +00:00
164 lines
3.3 KiB
Lua
164 lines
3.3 KiB
Lua
--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
-- 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 = '.',
|
|
}
|