Hash :
92cb362f
Author :
Date :
2013-11-09T12:33:33
Hello ! Please welcome Adams, our new assistant DevOps.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
;;
;; adams - Remote system administration tools
;;
;; Copyright 2013 Thomas de Grivel <billitch@gmail.com>
;;
;; Permission to use, copy, modify, and distribute this software for any
;; purpose with or without fee is hereby granted, provided that the above
;; copyright notice and this permission notice appear in all copies.
;;
;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
;; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
;; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
;; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
;; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
;; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
;;
(in-package :adams)
;; Host
(defclass host ()
((name :type string :initarg :hostname :reader hostname)
(shell :type shell :accessor host-shell)))
(defgeneric host-connect (host))
(defgeneric host-disconnect (host))
(defmethod print-object ((host host) stream)
(print-unreadable-object (host stream :type t :identity t)
(write-string (hostname host) stream)))
(defmethod slot-unbound (class (host host) (slot (eql 'shell)))
(host-connect host))
(defmethod host-disconnect ((host host))
(when (slot-boundp host 'shell)
(shell-close (host-shell host))
(slot-makunbound host 'shell)))
(defmacro with-connected-host ((var hostname) &body body)
(let ((g!host (gensym "HOST-")))
`(let ((,g!host (make-instance 'ssh-host :hostname ,hostname)))
(unwind-protect (let ((,var ,g!host)) ,@body)
(host-disconnect ,g!host)))))
(defun host-run (host command &rest format-args)
(apply #'shell-run (host-shell host) command format-args))
;; localhost
(defvar *localhost* (load-time-value
(make-instance 'host :hostname "localhost")))
(defmethod host-connect ((host (eql *localhost*)))
(setf (host-shell host) (make-shell)))
;; SSH host
(defclass ssh-host (host) ())
(defmethod host-connect ((host ssh-host))
(setf (host-shell host) (make-shell `("/usr/bin/ssh" ,(hostname host)))))
;; High level API
(defvar *host* *localhost*)
(defmacro with-host (hostname &body body)
`(with-connected-host (*host* ,hostname)
,@body))
(defun run (command &rest format-args)
(apply #'host-run *host* command format-args))