X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/86e132be99dcdbf2271119267cea6b91eb8207c3..314ce7bdcb5f54a7d1763e8b6d405dc66cb65d2b:/src/domain.sml diff --git a/src/domain.sml b/src/domain.sml index 4944a34..67ff449 100644 --- a/src/domain.sml +++ b/src/domain.sml @@ -790,4 +790,96 @@ fun homedirOf uname = fun homedir () = homedirOf (getUser ()) +type subject = {node : string, domain : string} + +val describers : (subject -> string) list ref = ref [] + +fun registerDescriber f = describers := f :: !describers + +fun describeOne arg = String.concat (map (fn f => f arg) (!describers)) + +val line = "-------------------------------\n" +val dline = "===============================\n" + +fun describe dom = + String.concat (List.mapPartial + (fn node => + case describeOne {node = node, domain = dom} of + "" => NONE + | s => + SOME (String.concat [dline, "Node ", node, "\n", dline, "\n", s])) + nodes) + +datatype description = + Filename of { filename : string, heading : string} + | Extension of { extension : string, heading : string -> string } + +fun considerAll ds {node, domain} = + let + val ds = map (fn d => (d, ref [])) ds + + val path = Config.resultRoot + val jdf = OS.Path.joinDirFile + val path = jdf {dir = path, file = node} + val path = foldr (fn (more, path) => jdf {dir = path, file = more}) + path (String.tokens (fn ch => ch = #".") domain) + in + if Posix.FileSys.access (path, []) then + let + val dir = Posix.FileSys.opendir path + + fun loop () = + case Posix.FileSys.readdir dir of + NONE => () + | SOME fname => + let + fun readFile entries = + let + val fname = OS.Path.joinDirFile {dir = path, + file = fname} + + val inf = TextIO.openIn fname + + fun loop entries = + case TextIO.inputLine inf of + NONE => entries + | SOME line => loop (line :: entries) + in + loop entries + before TextIO.closeIn inf + end + in + app (fn (d, entries) => + case d of + Filename {filename, heading} => + if fname = filename then + entries := "\n" :: readFile ("\n" :: line :: ":\n" :: heading :: line :: !entries) + else + () + | Extension {extension, heading} => + let + val {base, ext} = OS.Path.splitBaseExt fname + in + case ext of + NONE => () + | SOME extension' => + if extension' = extension then + entries := "\n" :: readFile ("\n" :: line :: ":\n" :: heading base :: line :: !entries) + else + () + end) ds; + loop () + end + in + loop (); + Posix.FileSys.closedir dir; + String.concat (List.concat (map (fn (_, entries) => rev (!entries)) ds)) + end + else + "" + end + +val () = registerDescriber (considerAll [Filename {filename = "soa", + heading = "DNS SOA"}]) + end