Imported Upstream version 1.4.0
[platform/upstream/augeas.git] / lenses / dns_zone.aug
1 (*
2 Module: Dns_Zone
3   Lens for parsing DNS zone files
4
5 Authors:
6   Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
7
8 About: Reference
9   RFC 1035, RFC 2782, RFC 3403
10
11 About: License
12   This file is licensed under the LGPL v2+
13 *)
14
15 module Dns_Zone =
16
17 autoload xfm
18
19 let eol = del /([ \t\n]*(;[^\n]*)?\n)+/ "\n"
20 let opt_eol = del /([ \t\n]*(;[^\n]*)?\n)*/ ""
21
22 let ws = del /[ \t]+|(([ \t\n]*;[^\n]*)?\n)+[ \t]*/ " "
23 let opt_ws = del /(([ \t\n]*;[^\n]*)?\n)*[ \t]*/ ""
24
25 let token = /([^ \t\n";()\\]|\\\\.)+|"([^"\\]|\\\\.)*"/
26
27
28 let control = [ key /\$[^ \t\n\/]+/
29                 . Util.del_ws_tab
30                 . store token
31                 . eol ]
32
33
34 let labeled_token (lbl:string) (re:regexp) (sep:lens) =
35     [ label lbl . store re . sep ]
36
37 let regexp_token (lbl:string) (re:regexp) =
38     labeled_token lbl re Util.del_ws_tab
39
40 let type_token (re:regexp) = regexp_token "type" re
41
42 let simple_token (lbl:string) = regexp_token lbl token
43
44 let enclosed_token (lbl:string) = labeled_token lbl token ws
45
46 let last_token (lbl:string) = labeled_token lbl token eol
47
48
49 let class_re = /IN/
50
51 let ttl = regexp_token "ttl" /[0-9]+[DHMWdhmw]?/
52 let class = regexp_token "class" class_re
53
54 let rr =
55      let simple_type = /[A-Z]+/ - class_re - /MX|NAPTR|SOA|SRV/
56   in type_token simple_type . last_token "rdata"
57
58
59 let mx = type_token "MX"
60          . simple_token "priority"
61          . last_token "exchange"
62
63 let naptr = type_token "NAPTR"
64             . simple_token "order"
65             . simple_token "preference"
66             . simple_token "flags"
67             . simple_token "service"
68             . simple_token "regexp"
69             . last_token "replacement"
70
71 let soa = type_token "SOA"
72           . simple_token "mname"
73           . simple_token "rname"
74           . Util.del_str "("
75           . opt_ws
76           . enclosed_token "serial"
77           . enclosed_token "refresh"
78           . enclosed_token "retry"
79           . enclosed_token "expiry"
80           . labeled_token "minimum" token opt_ws
81           . Util.del_str ")"
82           . eol
83
84 let srv = type_token "SRV"
85          . simple_token "priority"
86          . simple_token "weight"
87          . simple_token "port"
88          . last_token "target"
89
90
91 let record = seq "owner"
92              . ((ttl? . class?) | (class . ttl))
93              . (rr|mx|naptr|soa|srv)
94 let ws_record = [ Util.del_ws_tab . record ]
95 let records (k:regexp) = [ key k . counter "owner" . ws_record+ ]
96
97 let any_record_block = records /[^ \t\n;\/$][^ \t\n;\/]*/
98 let non_root_records = records /@[^ \t\n;\/]+|[^ \t\n;\/$@][^ \t\n;\/]*/
99
100 let root_records = [ del /@?/ "@"
101                      . Util.del_ws_tab
102                      . label "@"
103                      . counter "owner"
104                      . [ record ]
105                      . ws_record* ]
106
107 let lns = opt_eol
108           . control*
109           . ( (root_records|non_root_records)
110               . (control|any_record_block)* )?
111
112 let filter = incl "/var/bind/pri/*.zone"
113 let xfm = transform Dns_Zone.lns filter