X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/36e42cb86393a7b9e333ecd7edfbdd16c7d9a1ac..31b50af0d7e9779f3b0bd3f67acfc9104512a39d:/src/slave.sml diff --git a/src/slave.sml b/src/slave.sml index b1303b8..7a507fa 100644 --- a/src/slave.sml +++ b/src/slave.sml @@ -56,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)) @@ -71,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 = @@ -98,7 +112,7 @@ fun concatTo p fname = end in TextIO.closeOut (TextIO.openOut fname); - visitDir Config.resultRoot + visitDir (OS.Path.joinDirFile {dir = Config.resultRoot, file = hostname ()}) end fun enumerateTo p sep fname = @@ -141,8 +155,72 @@ 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 + +fun lineInFile fname line = + let + val inf = TextIO.openIn fname + val line' = line ^ "\n" + + fun loop () = + case TextIO.inputLine inf of + NONE => false + | SOME line => line = line' orelse loop () + in + loop () + before TextIO.closeIn inf + end handle IO.Io _ => false + +fun inGroup {user, group} = + List.exists (fn x => x = user) + (Posix.SysDB.Group.members (Posix.SysDB.getgrnam group)) + handle OS.SysErr _ => false + +fun mkDirAll dir = ignore (OS.Process.system ("mkdir -p " ^ dir)) + +fun remove (ls, x) = List.filter (fn y => y <> x) ls +fun removeDups ls = List.foldr (fn (x, ls) => + if List.exists (fn y => y = x) ls then + ls + else + x :: ls) [] ls + +fun copyDirCreate {from, to} = + (mkDirAll to; + if Posix.FileSys.access (from, []) then + ignore (OS.Process.system ("cp -r " ^ from ^ " " ^ to)) + else + ()) + +fun moveDirCreate {from, to} = + (mkDirAll to; + if Posix.FileSys.access (from, []) then + ignore (OS.Process.system ("mv " ^ from ^ " " ^ to)) + else + ()) + end