bin/ansible-inventory: Make the script loadable into a Lisp system.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 8 Jul 2015 10:03:40 +0000 (11:03 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 9 Jul 2015 08:39:00 +0000 (09:39 +0100)
bin/ansible-inventory

index 7e950de..6ffb17a 100755 (executable)
@@ -2,8 +2,7 @@
 ;;; -*-lisp-*-
 
 (cl:defpackage #:ansible-inventory
-  (:use #:common-lisp)
-  (:import-from #:cl-launch #:*arguments*))
+  (:use #:common-lisp))
 
 (in-package #:ansible-inventory)
 
 (defvar *progname*
   #.(or *compile-file-pathname* *load-pathname*))
 
-(let ((pkg (make-package "ANSIBLE-INVENTORY-USER"
-                        :use '("CL" "ANSIBLE-INVENTORY")))
-      (args *arguments*))
+(defvar *user-package*
+  (make-package "ANSIBLE-INVENTORY-USER"
+               :use '("CL" "ANSIBLE-INVENTORY")))
+
+(defun load-input (file)
+  (let ((*package* *user-package*))
+    (load file :verbose nil)))
+
+(defun parse-command-line (args)
   (loop (let* ((arg (pop args))
               (len (length arg)))
          (cond ((string= arg "--") (return))
                                    (pathname-name *progname*)))
                       (t (error "unknown option `-~A'" (char arg i)))))))
                (t (push arg args) (return)))))
-  (dolist (arg args)
-    (let ((*package* pkg))
-      (load arg :verbose nil))))
+  (mapc #'load-input args))
 
 ;;;--------------------------------------------------------------------------
 ;;; Run the hooks.
 
-(setf *hostproc-hooks* (sort *hostproc-hooks* #'< :key #'hook-entry-prio))
-(mapc (compose #'hook-entry-func #'funcall) *hostproc-hooks*)
+(defun run-hooks ()
+  (setf *hostproc-hooks* (sort *hostproc-hooks* #'< :key #'hook-entry-prio))
+  (mapc (compose #'hook-entry-func #'funcall) *hostproc-hooks*))
 
 ;;;--------------------------------------------------------------------------
 ;;; Output the definitions.
 
-(setf *print-right-margin* 77)
-(print-json
-  (print-json-map
-    (print-json-mapping "all"
-      (print-json-list (maphosts #'print-json-simple)))
-    (dolist (assoc *groups*)
-      (print-json-mapping (car assoc)
-       (print-json-list
-         (mapc #'print-json-simple (cdr assoc)))))
-    (print-json-mapping "_meta"
+(defun output ()
+  (let ((*print-right-margin* 77))
+    (print-json
       (print-json-map
-       (print-json-mapping "hostvars"
+       (print-json-mapping "all"
+         (print-json-list (maphosts #'print-json-simple)))
+       (dolist (assoc *groups*)
+         (print-json-mapping (car assoc)
+           (print-json-list
+             (mapc #'print-json-simple (cdr assoc)))))
+       (print-json-mapping "_meta"
          (print-json-map
-           (maphash (lambda (host plist)
-                      (print-json-mapping host
-                        (print-json-map
-                          (do ((plist plist (cddr plist)))
-                              ((endp plist))
-                            (print-json-mapping (car plist)
-                              (print-json-simple (cadr plist)))))))
-                    *hosts*)))))))
+           (print-json-mapping "hostvars"
+             (print-json-map
+               (maphash (lambda (host plist)
+                          (print-json-mapping host
+                            (print-json-map
+                              (do ((plist plist (cddr plist)))
+                                  ((endp plist))
+                                (print-json-mapping (car plist)
+                                  (print-json-simple (cadr plist)))))))
+                        *hosts*)))))))))
+
+;;;--------------------------------------------------------------------------
+;;; Main program.
+
+#+cl-launch
+(progn
+  (parse-command-line cl-launch:*arguments*)
+  (run-hooks)
+  (output))
 
 ;;;----- That's all, folks --------------------------------------------------