X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/d351d679283a797c98f5f65d18aa757c18e56305..1638d5a206cd79e9619f0d3334fed29eaddc6b51:/src/slave.sml diff --git a/src/slave.sml b/src/slave.sml index 64613ed..01d872c 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)) @@ -195,4 +201,27 @@ fun lineInFile fname line = 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 moveDirCreate {from, to} = + (mkDirAll to; + if Posix.FileSys.access (from, []) then + (ignore (OS.Process.system ("rm -rf " ^ to)); + ignore (OS.Process.system ("cp -r " ^ from ^ " " ^ to)); + ignore (OS.Process.system ("rm -rf " ^ from))) + else + ()) + end