frontend: Allow use of new zone machinery.
[zone] / frontend.lisp
index cafa95a..ef9c090 100644 (file)
 ;;; it under the terms of the GNU General Public License as published by
 ;;; the Free Software Foundation; either version 2 of the License, or
 ;;; (at your option) any later version.
-;;; 
+;;;
 ;;; This program is distributed in the hope that it will be useful,
 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;;; GNU General Public License for more details.
-;;; 
+;;;
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with this program; if not, write to the Free Software Foundation,
 ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 (defvar opt-zones nil
   "Which zones to be emitted.")
 
+(eval-when (:compile-toplevel :load-toplevel)
+  (defopthandler dir (var arg) ()
+    (let ((path (probe-file arg)))
+      (if (and path
+              (not (pathname-name path)))
+         (setf var path)
+         (option-parse-error "path `~A' doesn't name a directory." arg)))))
+
 (define-program
     :version "1.0.0" :usage "ZONEDEF..."
     :help "Generates BIND zone files from Lisp descriptions."
-    :options (options help-opts
+    :options (options help-options
+                     "Parsing options"
+                     (#\f "feature" (:arg "KEYWORD")
+                          (list *features* 'keyword)
+                          "Insert KEYWORD in *features* list.")
+                     (#\s "subnet" (:arg "NET")
+                          (list zone:*preferred-subnets*)
+                          "Designate NET as a preferred subnet.")
                      "Output options"
+                     (#\d "directory" (:arg "DIRECTORY")
+                          (dir *zone-output-path*)
+                          "Write zone and serial files to DIRECTORY.")
                      (#\z "zone" (:arg "NAME") (list opt-zones)
                           "Write information about zone NAME.")))
 
 (defun main ()
   (with-unix-error-reporting ()
-    (let ((seq 54)
-         (files nil))
+    (let ((files nil))
       (unless (option-parse-try
                (do-options ()
                  (nil (rest)
                    (setf files rest))))
        (die-usage))
       (dolist (f files)
-       (let ((*package* (make-package (format nil "zone.scratch-~A"
-                                              (incf seq))
+       (let ((*package* (make-package "ZONE.SCRATCH"
                                       :use '(#:common-lisp #:net #:zone))))
-         (load f :verbose nil :print nil :if-does-not-exist :error)))
+         (load f :verbose nil :print nil :if-does-not-exist :error)
+         (delete-package *package*)))
       (zone-save opt-zones))))
 
 ;;;----- That's all, folks --------------------------------------------------