bin/zoneconf: Abstract out command substitution machinery.
[zoneconf] / bin / zoneconf
index 8e0646d..7ee6d6a 100755 (executable)
@@ -980,6 +980,24 @@ define-configuration-space zone ZONECFG {
   }
 
   define view-map {map} {
+
+    ## OK, this needs careful documentation.
+    ##
+    ## The local nameserver presents a number of views according to its
+    ## configuration.  It is our purpose here to generate a configuration
+    ## snippet for such a view.
+    ##
+    ## A user might have several different views of a zone which are meant to
+    ## be presented to different clients.  These map on to the server views
+    ## in a one-to-many fashion.  The `view-map' option defines this mapping.
+    ## The argument is a list of alternating SERVER-VIEW USER-VIEW pairs; the
+    ## SERVER-VIEW may be a glob pattern; the USER-VIEW may be the special
+    ## token `=' to mean `same as the SERVER-VIEW'.
+    ##
+    ## We only keep one copy of the zone file for each user view: if the user
+    ## view is used by many server views, then the zone stanza for each of
+    ## those views refers to the same zone file.
+
     if {[llength $map] % 2} {
       error "view map must have an even number of items"
     }
@@ -1019,6 +1037,17 @@ define-configuration-space toplevel ZONECFG {
 ###--------------------------------------------------------------------------
 ### Processing the results.
 
+proc build-command {command args} {
+  ## Return the COMMAND list, after applying the string map ARGS to each item
+  ## in turn.
+
+  set cmd {}
+  foreach item $command {
+    lappend cmd [string map $args $item]
+  }
+  return $cmd
+}
+
 proc zone-file-name {view config} {
   ## Return the relative file name for the zone described by CONFIG, relative
   ## to the given VIEW.  An absolute filename may be derived later, depending
@@ -1041,7 +1070,7 @@ proc output-file-name {view} {
 
 proc compute-zone-properties {view config} {
   ## Derive interesting information from the zone configuration plist CONFIG,
-  ## relative to the stated VIEW.  Return a new plist.
+  ## relative to the stated server VIEW.  Return a new plist.
 
   array set zone $config
 
@@ -1279,14 +1308,11 @@ provided by the named USER"
     }
     close $chan
 
-    set cmd {}
-    foreach item $zone(checkzone-command) {
-      lappend cmd [string map [list \
-                                  "%z" $name \
-                                  "%v" $view \
-                                  "%f" $tmp] \
-                      $item]
-    }
+    ## Check the zone for sanity.
+    set cmd [build-command $zone(checkzone-command) \
+                "%z" $name \
+                "%v" $view \
+                "%f" $tmp]
     set rc [catch {
       set out [eval exec $cmd]
     } msg]
@@ -1304,14 +1330,9 @@ provided by the named USER"
     file rename -force -- $tmp $zone(file-name)
     set cleanup {}
     foreach view $matchview {
-      set cmd {}
-      foreach item $zone(reload-command) {
-       lappend cmd [string map [list \
-                                    "%v" $view \
-                                    "%z" $zone(name)] \
-                        $item]
-      }
-      eval exec $cmd
+      eval exec $cmd [build-command $zone(reload-command) \
+                         "%v" $view \
+                         "%z" $zone(name)]
     }
   } {
     eval $cleanup