X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/ed9fda3a0e2edcf4ed546e0eb9ac128865538276..2e96b9d42f6d2619f961c753ac3bbc9ba57c5147:/src/slave.sml diff --git a/src/slave.sml b/src/slave.sml index d43a8fa..719b417 100644 --- a/src/slave.sml +++ b/src/slave.sml @@ -27,8 +27,9 @@ datatype file_action = type file_status = {action : file_action, domain : string, + dir : string, file : string} - + val fileHandler = ref (fn _ : file_status => ()) val preHandler = ref (fn () => ()) val postHandler = ref (fn () => ()) @@ -55,7 +56,12 @@ fun registerPostHandler handler = end fun handleChanges fs = (!preHandler (); - app (!fileHandler) fs; + app (fn recd as {action, file, ...} => + (!fileHandler recd; + if action = Delete andalso Posix.FileSys.access (file, []) then + OS.FileSys.remove file + else + ())) fs; !postHandler ()) fun shell ss = OS.Process.isSuccess (OS.Process.system (String.concat ss)) @@ -70,6 +76,15 @@ fun shellF (ss, msg) = ErrorMsg.error NONE (msg s) end +fun hostname () = + let + val inf = TextIO.openIn "/etc/hostname" + in + case TextIO.inputLine inf of + NONE => (TextIO.closeIn inf; raise Fail "No line in /etc/hostname") + | SOME line => (TextIO.closeIn inf; String.substring (line, 0, size line - 1)) + end + fun concatTo p fname = let fun visitDir dname = @@ -87,17 +102,17 @@ fun concatTo p fname = visitDir path else if p fname' then shellF ([Config.cat, " ", path, " >>", fname], - fn cl => "Error concatenating: " ^ cl) + fn cl => "Error concatenating: " ^ cl) else (); loop () end in - TextIO.closeOut (TextIO.openOut fname); loop () end in - visitDir Config.resultRoot + TextIO.closeOut (TextIO.openOut fname); + visitDir (OS.Path.joinDirFile {dir = Config.resultRoot, file = hostname ()}) end fun enumerateTo p sep fname = @@ -105,7 +120,7 @@ fun enumerateTo p sep fname = val outf = TextIO.openOut fname val first = ref true - val baseLen = length (String.fields (fn ch => ch = #"/") Config.resultRoot) + val baseLen = length (String.fields (fn ch => ch = #"/") Config.resultRoot) + 1 fun visitDir dname = let @@ -140,7 +155,29 @@ fun enumerateTo p sep fname = loop () end in - visitDir Config.resultRoot; + visitDir (OS.Path.joinDirFile {dir = Config.resultRoot, file = hostname ()}); + TextIO.closeOut outf + end + +fun readList fname = + let + val inf = TextIO.openIn fname + + fun loop acc = + case TextIO.inputLine inf of + NONE => rev acc + | SOME line => loop (String.substring (line, 0, size line - 1) :: acc) + in + loop [] + before TextIO.closeIn inf + end + +fun writeList (fname, ls) = + let + val outf = TextIO.openOut fname + in + app (fn s => (TextIO.output (outf, s); + TextIO.output1 (outf, #"\n"))) ls; TextIO.closeOut outf end