|
Packit Service |
a2ae7a |
(*
|
|
Packit Service |
a2ae7a |
Module: Dns_Zone
|
|
Packit Service |
a2ae7a |
Lens for parsing DNS zone files
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
Authors:
|
|
Packit Service |
a2ae7a |
Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
About: Reference
|
|
Packit Service |
a2ae7a |
RFC 1035, RFC 2782, RFC 3403
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
About: License
|
|
Packit Service |
a2ae7a |
This file is licensed under the LGPL v2+
|
|
Packit Service |
a2ae7a |
*)
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
module Dns_Zone =
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
autoload xfm
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let eol = del /([ \t\n]*(;[^\n]*)?\n)+/ "\n"
|
|
Packit Service |
a2ae7a |
let opt_eol = del /([ \t\n]*(;[^\n]*)?\n)*/ ""
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let ws = del /[ \t]+|(([ \t\n]*;[^\n]*)?\n)+[ \t]*/ " "
|
|
Packit Service |
a2ae7a |
let opt_ws = del /(([ \t\n]*;[^\n]*)?\n)*[ \t]*/ ""
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let token = /([^ \t\n";()\\]|\\\\.)+|"([^"\\]|\\\\.)*"/
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let control = [ key /\$[^ \t\n\/]+/
|
|
Packit Service |
a2ae7a |
. Util.del_ws_tab
|
|
Packit Service |
a2ae7a |
. store token
|
|
Packit Service |
a2ae7a |
. eol ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let labeled_token (lbl:string) (re:regexp) (sep:lens) =
|
|
Packit Service |
a2ae7a |
[ label lbl . store re . sep ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let regexp_token (lbl:string) (re:regexp) =
|
|
Packit Service |
a2ae7a |
labeled_token lbl re Util.del_ws_tab
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let type_token (re:regexp) = regexp_token "type" re
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let simple_token (lbl:string) = regexp_token lbl token
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let enclosed_token (lbl:string) = labeled_token lbl token ws
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let last_token (lbl:string) = labeled_token lbl token eol
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let class_re = /IN/
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let ttl = regexp_token "ttl" /[0-9]+[DHMWdhmw]?/
|
|
Packit Service |
a2ae7a |
let class = regexp_token "class" class_re
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let rr =
|
|
Packit Service |
a2ae7a |
let simple_type = /[A-Z]+/ - class_re - /MX|NAPTR|SOA|SRV/
|
|
Packit Service |
a2ae7a |
in type_token simple_type . last_token "rdata"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let mx = type_token "MX"
|
|
Packit Service |
a2ae7a |
. simple_token "priority"
|
|
Packit Service |
a2ae7a |
. last_token "exchange"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let naptr = type_token "NAPTR"
|
|
Packit Service |
a2ae7a |
. simple_token "order"
|
|
Packit Service |
a2ae7a |
. simple_token "preference"
|
|
Packit Service |
a2ae7a |
. simple_token "flags"
|
|
Packit Service |
a2ae7a |
. simple_token "service"
|
|
Packit Service |
a2ae7a |
. simple_token "regexp"
|
|
Packit Service |
a2ae7a |
. last_token "replacement"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let soa = type_token "SOA"
|
|
Packit Service |
a2ae7a |
. simple_token "mname"
|
|
Packit Service |
a2ae7a |
. simple_token "rname"
|
|
Packit Service |
a2ae7a |
. Util.del_str "("
|
|
Packit Service |
a2ae7a |
. opt_ws
|
|
Packit Service |
a2ae7a |
. enclosed_token "serial"
|
|
Packit Service |
a2ae7a |
. enclosed_token "refresh"
|
|
Packit Service |
a2ae7a |
. enclosed_token "retry"
|
|
Packit Service |
a2ae7a |
. enclosed_token "expiry"
|
|
Packit Service |
a2ae7a |
. labeled_token "minimum" token opt_ws
|
|
Packit Service |
a2ae7a |
. Util.del_str ")"
|
|
Packit Service |
a2ae7a |
. eol
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let srv = type_token "SRV"
|
|
Packit Service |
a2ae7a |
. simple_token "priority"
|
|
Packit Service |
a2ae7a |
. simple_token "weight"
|
|
Packit Service |
a2ae7a |
. simple_token "port"
|
|
Packit Service |
a2ae7a |
. last_token "target"
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let record = seq "owner"
|
|
Packit Service |
a2ae7a |
. ((ttl? . class?) | (class . ttl))
|
|
Packit Service |
a2ae7a |
. (rr|mx|naptr|soa|srv)
|
|
Packit Service |
a2ae7a |
let ws_record = [ Util.del_ws_tab . record ]
|
|
Packit Service |
a2ae7a |
let records (k:regexp) = [ key k . counter "owner" . ws_record+ ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let any_record_block = records /[^ \t\n;\/$][^ \t\n;\/]*/
|
|
Packit Service |
a2ae7a |
let non_root_records = records /@[^ \t\n;\/]+|[^ \t\n;\/$@][^ \t\n;\/]*/
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let root_records = [ del /@?/ "@"
|
|
Packit Service |
a2ae7a |
. Util.del_ws_tab
|
|
Packit Service |
a2ae7a |
. label "@"
|
|
Packit Service |
a2ae7a |
. counter "owner"
|
|
Packit Service |
a2ae7a |
. [ record ]
|
|
Packit Service |
a2ae7a |
. ws_record* ]
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let lns = opt_eol
|
|
Packit Service |
a2ae7a |
. control*
|
|
Packit Service |
a2ae7a |
. ( (root_records|non_root_records)
|
|
Packit Service |
a2ae7a |
. (control|any_record_block)* )?
|
|
Packit Service |
a2ae7a |
|
|
Packit Service |
a2ae7a |
let filter = incl "/var/bind/pri/*.zone"
|
|
Packit Service |
a2ae7a |
let xfm = transform Dns_Zone.lns filter
|