X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/31b50af0d7e9779f3b0bd3f67acfc9104512a39d..dfd19067c2b670d13415a04291caaa51b025d3d6:/src/slave.sml diff --git a/src/slave.sml b/src/slave.sml index 7a507fa..7e3f9d8 100644 --- a/src/slave.sml +++ b/src/slave.sml @@ -22,9 +22,12 @@ structure Slave :> SLAVE = struct datatype file_action = Add - | Delete + | Delete of bool | Modify +fun isDelete (Delete _) = true + | isDelete _ = false + type file_status = {action : file_action, domain : string, dir : string, @@ -58,10 +61,13 @@ fun registerPostHandler handler = fun handleChanges fs = (!preHandler (); app (fn recd as {action, file, ...} => (!fileHandler recd; - if action = Delete andalso Posix.FileSys.access (file, []) then - OS.FileSys.remove file - else - ())) fs; + case action of + Delete b => + if b 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)) @@ -76,6 +82,39 @@ fun shellF (ss, msg) = ErrorMsg.error NONE (msg s) end +fun run (program, argv) = + let + val proc = Unix.execute (program, argv) + + fun loop inf = + case TextIO.inputLine inf of + NONE => () + | SOME line => loop inf + (* Programs that output will fail unless we eat their output *) + val () = loop (Unix.textInstreamOf proc) + in + OS.Process.isSuccess (Unix.reap proc) + end + +fun shellOutput ss = + let + val proc = Unix.execute ("/bin/bash", ["-c", String.concat ss ^ " 2>&1"]) + val inf = Unix.textInstreamOf proc + + fun loop out = + case TextIO.inputLine inf of + NONE => String.concat (rev out) + | SOME line => loop (line :: out) + + val lines = loop [] + in + print lines; + if OS.Process.isSuccess (Unix.reap proc) then + NONE + else + SOME lines + end + fun hostname () = let val inf = TextIO.openIn "/etc/hostname" @@ -209,17 +248,12 @@ fun removeDups ls = List.foldr (fn (x, 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)) + (ignore (OS.Process.system ("rm -rf " ^ to)); + ignore (OS.Process.system ("cp -r " ^ from ^ " " ^ to)); + ignore (OS.Process.system ("rm -rf " ^ from))) else ())