proc local-address-p {addr} {
## Answer whether the ADDR is one of the host's addresses.
+ global env
- if {[catch { set sk [socket -server {} -myaddr $addr 0] }]} {
- return false
+ if {[info exists env(ZONECONF_LOCAL_ADDRESSES)]} {
+ if {[string match "*:$addr:*" ":$env(ZONECONF_LOCAL_ADDRESSES):"]} {
+ return true
+ } else {
+ return false
+ }
} else {
- close $sk
- return true
+ if {[catch { set sk [socket -server {} -myaddr $addr 0] }]} {
+ return false
+ } else {
+ close $sk
+ return true
+ }
}
}
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
foreach host $hosts {
set bang [string first "!" $host]
if {$bang >= 0} {
- set before [string range $host 0 [expr {$bang - 1}]]
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 {
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 "};";
}