--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- gpfs-direct
--
--    A (Layer 2) configuration.
--
-- Author: Jan Meyer <jan.meyer@desy.de>
--
--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--
-- configuration parameters
--
settings {
	statusFile = "/space/projects/live-viewer/lsyncd.stat",
	statusInterval = 1,
    nodaemon = true
}

local formats = { jpg = true, tif = true, cbf = true, log = true }
local folders = { "/local", "/current/raw", "/commissioning/raw" }

gpfs = {
--    maxProcesses = 50,

	onCreate = function(event)
		-- check if in relevant subfolder
		local location = false
		for i, path in ipairs(folders) do
			if string.sub(event.path, 1, string.len(path)) == path then
				location = true
				break
			end
		end
		if location == false then return end

		if event.isdir then
			for i, path in ipairs(folders) do
				if path == event.pathname then return end
			end
			spawn(
				event,
				'/bin/mkdir',
				event.targetPath
			)
		else
			-- check filetype
			local extension = string.match(event.name, ".*%.([^.]+)$")
			if formats[extension] ~= true then return end

			spawn (
				event,
				'/usr/bin/python',
                '/space/projects/live-viewer/ZeroMQTunnel/wrapper_script.py',
                '--mv_source',
				event.sourcePath,
                '--mv_target',
				event.targetPathdir
			)

--			spawn(
--				event,
--				'/bin/mv',
--				event.sourcePath,
--				event.targetPathdir
--			)
		end
	end,

	onModify = function(event)
		if event.isdir then
			error("Do not know how to handle 'Modify' on dirs")
		else
			-- check if in relevant subfolder
			local location = false
			for i, path in ipairs(folders) do
				if string.sub(event.path, 1, string.len(path)) == path then
					location = true
					break
				end
			end
			if location == false then return end

			-- check filetype
			local extension = string.match(event.name, ".*%.([^.]+)$")
			if formats[extension] ~= true then return end

			spawn (
				event,
				'/usr/bin/python',
                '/space/projects/live-viewer/ZeroMQTunnel/wrapper_script.py',
                '--mv_source',
				event.sourcePath,
                '--mv_target',
				event.targetPathdir
			)

--			spawn(
--				event,
--				'/bin/mv',
--				event.sourcePath,
--				event.targetPathdir
--			)
		end
	end,

	--
	-- Called when collecting a finished child process
	--
	collect = function(agent, exitcode)
		local config = agent.config

		if not agent.isList and agent.etype == "Blanket" then
			if exitcode == 0 then
				log("Normal", "Startup of '",agent.source,"' finished.")
			elseif config.exitcodes and
				config.exitcodes[exitcode] == "again"
			then
				log("Normal", "Retrying startup of '",agent.source,"'.")
				return "again"
			else
				log("Error", "Failure on startup of '",agent.source,"'.")
			end
			return
		end

		local rc = config.exitcodes and config.exitcodes[exitcode]
		if rc == "die" then
			return rc
		end

		if agent.isList then
			if rc == "again" then
				log("Normal", "Retrying a list on exitcode = ",exitcode)
			else
				log("Normal", "Finished a list = ",exitcode)
			end
		else
			if rc == "again" then
				log("Normal", "Retrying ", agent.etype, " on ", agent.sourcePath, " = ", exitcode)
			else
				log("Normal", "Finished ", agent.etype, " on ", agent.sourcePath, " = ", exitcode)
			end
		end
		return rc
	end,
}

sync {
	gpfs,
	delay=0,
	init=false,
	source="/space/projects/live-viewer/source",
	target="/space/projects/live-viewer/target",
}
