X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/77a8fca278b561808959fa1aa7d9f02c5cfe7720..f208fe7eb343486d3a464e0813d1cdce19b1ac5f:/src/domain.sml diff --git a/src/domain.sml b/src/domain.sml index ca2f993..3d8290b 100644 --- a/src/domain.sml +++ b/src/domain.sml @@ -654,56 +654,70 @@ val _ = Env.type_one "mail_node" orelse (hasPriv "mail" andalso List.exists (fn x => x = node) Config.mailNodes_admin)) -fun rmdom dom = +fun rmdom doms = let - val domPath = String.concatWith "/" (rev (String.fields (fn ch => ch = #".") dom)) - fun doNode (node, _) = let val dname = OS.Path.joinDirFile {dir = Config.resultRoot, file = node} - val dname = OS.Path.concat (dname, domPath) - fun visitDom (dom, dname, actions) = + fun doDom (dom, actions) = let - val dir = Posix.FileSys.opendir dname - - fun loop actions = - case Posix.FileSys.readdir dir of - NONE => actions - | SOME fname => - let - val fnameFull = OS.Path.joinDirFile {dir = dname, - file = fname} - in - if Posix.FileSys.ST.isDir (Posix.FileSys.stat fnameFull) then - loop (visitDom (fname ^ "." ^ dom, - fnameFull, - actions)) - else - loop ({action = Slave.Delete, - domain = dom, - dir = dname, - file = fnameFull} :: actions) - end + val domPath = String.concatWith "/" (rev (String.fields (fn ch => ch = #".") dom)) + val dname = OS.Path.concat (dname, domPath) + + fun visitDom (dom, dname, actions) = + let + val dir = Posix.FileSys.opendir dname + + fun loop actions = + case Posix.FileSys.readdir dir of + NONE => actions + | SOME fname => + let + val fnameFull = OS.Path.joinDirFile {dir = dname, + file = fname} + in + if Posix.FileSys.ST.isDir (Posix.FileSys.stat fnameFull) then + loop (visitDom (fname ^ "." ^ dom, + fnameFull, + actions)) + else + loop ({action = Slave.Delete, + domain = dom, + dir = dname, + file = fnameFull} :: actions) + end + in + loop actions + before Posix.FileSys.closedir dir + end + handle OS.SysErr _ => + (print ("Warning: System error deleting domain " ^ dom ^ " on " ^ node ^ ".\n"); + actions) in - loop actions - before Posix.FileSys.closedir dir + visitDom (dom, dname, actions) end - val actions = visitDom (dom, dname, []) + val actions = foldl doDom [] doms in handleSite (node, actions) end - handle IO.Io _ => print ("Warning: IO error deleting domain " ^ dom ^ " on " ^ node ^ ".\n") + handle IO.Io _ => print ("Warning: IO error deleting domains on " ^ node ^ ".\n") fun cleanupNode (node, _) = let - val dname = OS.Path.joinDirFile {dir = Config.resultRoot, - file = node} - val dname = OS.Path.concat (dname, domPath) + fun doDom dom = + let + val domPath = String.concatWith "/" (rev (String.fields (fn ch => ch = #".") dom)) + val dname = OS.Path.joinDirFile {dir = Config.resultRoot, + file = node} + val dname = OS.Path.concat (dname, domPath) + in + ignore (OS.Process.system (Config.rm ^ " -rf " ^ dname)) + end in - ignore (OS.Process.system (Config.rm ^ " -rf " ^ dname)) + app doDom doms end in app doNode Config.nodeIps;