define-simple dir-mode 2775
define-simple zone-file "%v/%z.zone"
define-simple soa-format increment
+ define-simple allow-query nil
define-list views *
define-list sign-views {}
define-list signzone-command \
"-Sfail" \
"-Wfail" \
"%z" "%f"]
+ define-list also-notify nil
define setvar {name value} {
dict set ZONECFG(var) $name $value
}
define primary {map} {
+ ## There's a grim hack here: a primary-address entry may have the form
+ ## REAL!FAKE. If the REAL address is not a local address then this
+ ## is used as the master address; otherwise the FAKE address is used.
+ ## This is useful for inter-view updates of dynamic zones on the same
+ ## host. I suggest abusing 127.0.0.0/8 addresses for this kind of
+ ## chicanery.
if {[llength $map] % 2} {
error "master map must have an even number of items"
}
if {[info exists zone(mapped-view)]} {
foreach {outview hosts} $zone(master-map) {
if {[string match $outview $zone(mapped-view)]} {
- set zone(masters) $hosts
+ set masters {}
set zone(config-type) slave
foreach host $hosts {
- if {[local-address-p $host]} {
+ set bang [string first "!" $host]
+ if {$bang >= 0} {
+ set after [string range $host [expr {$bang + 1}] end]
+ if {$bang} {
+ set before [string range $host 0 [expr {$bang - 1}]]
+ } else {
+ set before $after
+ }
+ if {[local-address-p $before]} {
+ set host $after
+ } else {
+ set host $before
+ }
+ } elseif {[local-address-p $host]} {
set zone(config-type) master
}
+ lappend masters $host
}
+ set zone(masters) $masters
break
}
}
master {
puts $chan "\ttype master;"
puts $chan "\tfile \"$zone(server-file-name)\";"
+ if {![string equal $zone(also-notify) "nil"]} {
+ puts $chan "\talso-notify { [join $zone(also-notify) {; }]; };"
+ }
switch -exact -- $zone(type) {
dynamic {
write-ddns-update-policy "\t" $chan $config
}
}
}
+ if {![string equal $zone(allow-query) nil]} {
+ puts $chan "\tallow-query {$zone(allow-query)};"
+ }
puts $chan "};";
}