From: Adam Chlipala Date: Sun, 24 Feb 2008 15:50:24 +0000 (+0000) Subject: Expanding TXT support X-Git-Tag: release_2010-11-19~56 X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/commitdiff_plain/63ac3b82c1cd33605e62688cd97688a6dae3cb9c?hp=e7482df3346f6976f62e3f7e07afbcf419f7411a Expanding TXT support --- diff --git a/lib/bind.dtl b/lib/bind.dtl index 8515154..f781633 100644 --- a/lib/bind.dtl +++ b/lib/bind.dtl @@ -14,13 +14,19 @@ extern val default : bind_pattern; extern val wildcard : bind_pattern; {{A rule applies to every host within the current domain.}} +extern type srv_pattern; +{{Like bind_pattern, but for SRV and TXT records, where underscores are allowed in hostnames}} +extern val srv_literal : srv_domain -> srv_pattern; +extern val srv_default : srv_pattern; +extern val srv_wildcard : srv_pattern; + extern val dnsA : bind_pattern -> ip -> dnsRecord; extern val dnsAAAA : bind_pattern -> ipv6 -> dnsRecord; extern val dnsAFSDB : domain -> dnsRecord; extern val dnsCNAME : bind_pattern -> domain -> dnsRecord; extern val dnsMX : int -> domain -> dnsRecord; extern val dnsNS : domain -> dnsRecord; -extern val dnsSRV : srv_domain -> int -> int -> int -> domain -> dnsRecord; -extern val dnsTXT : bind_pattern -> no_newlines -> dnsRecord; +extern val dnsSRV : srv_pattern -> int -> int -> int -> domain -> dnsRecord; +extern val dnsTXT : srv_pattern -> no_newlines -> dnsRecord; extern val dns : dnsRecord -> [Domain] {TTL : int}; diff --git a/lib/easy_domain.dtl b/lib/easy_domain.dtl index 2f8c0ab..1d845d5 100644 --- a/lib/easy_domain.dtl +++ b/lib/easy_domain.dtl @@ -80,5 +80,7 @@ val dnsMail = \num -> \host -> dns (dnsMX num host); val dnsAlias = \from -> \to -> dns (dnsCNAME (literal from) to); val dnsDefault = \to -> dns (dnsA default to); val dnsDefaultv6 = \to -> dns (dnsAAAA default to); -val dnsText = \from -> \to -> dns (dnsTXT (literal from) to); -val dnsDefaultText = \to -> dns (dnsTXT default to); +val dnsText = \from -> \to -> dns (dnsTXT (srv_literal from) to); +val dnsDefaultText = \to -> dns (dnsTXT srv_default to); + +val dnsKerberos = \to -> dns (dnsTXT (srv_literal "_kerberos") to); diff --git a/src/plugins/bind.sml b/src/plugins/bind.sml index 46bd086..768478f 100644 --- a/src/plugins/bind.sml +++ b/src/plugins/bind.sml @@ -57,7 +57,7 @@ datatype dns_record = | AAAA of host * string | TXT of host * string | AFSDB of string - | SRV of string * int * int * int * string + | SRV of host * int * int * int * string fun hostS (Literal s) = s ^ "." | hostS Wildcard = "*." @@ -71,6 +71,14 @@ val host = fn (EApp ((EVar "literal", _), e), _) => SOME Default | _ => NONE +val srv_host = fn (EApp ((EVar "srv_literal", _), e), _) => + Option.map Literal (Env.string e) + | (EVar "srv_wildcard", _) => + SOME Wildcard + | (EVar "srv_default", _) => + SOME Default + | _ => NONE + val record = fn (EApp ((EApp ((EVar "dnsA", _), e1), _), e2), _) => (case (host e1, Domain.ip e2) of (SOME v1, SOME v2) => SOME (A (v1, v2)) @@ -90,13 +98,13 @@ val record = fn (EApp ((EApp ((EVar "dnsA", _), e1), _), e2), _) => (SOME v1, SOME v2) => SOME (AAAA (v1, v2)) | _ => NONE) | (EApp ((EApp ((EVar "dnsTXT", _), e1), _), e2), _) => - (case (host e1, Env.string e2) of + (case (srv_host e1, Env.string e2) of (SOME v1, SOME v2) => SOME (TXT (v1, v2)) | _ => NONE) | (EApp ((EVar "dnsAFSDB", _), e), _) => Option.map AFSDB (Env.string e) | (EApp ((EApp ((EApp ((EApp ((EApp ((EVar "dnsSRV", _), e1), _), e2), _), e3), _), e4), _), e5), _) => - (case (Env.string e1, Env.int e2, Env.int e3, Env.int e4, Env.string e5) of + (case (srv_host e1, Env.int e2, Env.int e3, Env.int e4, Env.string e5) of (SOME v1, SOME v2, SOME v3, SOME v4, SOME v5) => SOME (SRV (v1, v2, v3, v4, v5)) | _ => NONE) | _ => NONE @@ -162,8 +170,7 @@ fun writeRecord (evs, r) = write "\t"; write host; write ".\n") - | SRV (from, priority, weight, port, to) => (write from; - write "."; + | SRV (from, priority, weight, port, to) => (write (hostS from); writeDom (); write ".\t"; write (Int.toString ttl); @@ -351,16 +358,20 @@ val () = Domain.registerDescriber (Domain.considerAll heading = "DNS zonefile contents:", showEmpty = false}]) -fun validHost_ s = +fun validSrvHost s = size s > 0 andalso size s < 20 andalso CharVector.all (fn ch => Domain.isIdent ch orelse ch = #"-" orelse ch = #"_") s -fun validSRVDomain s = +fun validSrvDomain s = size s > 0 andalso size s < 100 - andalso List.all validHost_ (String.fields (fn ch => ch = #".") s) + andalso List.all validSrvHost (String.fields (fn ch => ch = #".") s) + +val _ = Env.type_one "srv_host" + Env.string + validSrvHost val _ = Env.type_one "srv_domain" Env.string - validSRVDomain + validSrvDomain end