[isidorus-cvs] r637 - in trunk/src: . rest_interface shell_scripts

lgiessmann at common-lisp.net lgiessmann at common-lisp.net
Mon Jul 18 11:08:01 UTC 2011


Author: lgiessmann
Date: Mon Jul 18 04:07:59 2011
New Revision: 637

Log:
fixed ticket #113 => hunchentoot defines a new admin interface that allows to sut down the server from a predefined ip address; each time a shut down is initiated a backup file in the working directory and the name of the form backup_dd.mm.yyyy:hh:mm:ss is created.

Added:
   trunk/src/rest_interface/admin-interface.lisp
   trunk/src/shell_scripts/
   trunk/src/shell_scripts/shutdown-isidorus.sh   (contents, props changed)
Modified:
   trunk/src/isidorus.asd
   trunk/src/rest_interface/rest-interface.lisp

Modified: trunk/src/isidorus.asd
==============================================================================
--- trunk/src/isidorus.asd	Sun Jul 17 13:50:32 2011	(r636)
+++ trunk/src/isidorus.asd	Mon Jul 18 04:07:59 2011	(r637)
@@ -111,6 +111,8 @@
                                             :depends-on ("rest-interface"))
 				     (:file "set-up-json-interface"
 					    :depends-on ("rest-interface"))
+				     (:file "admin-interface"
+					    :depends-on ("rest-interface"))
                                      (:file "read" 
                                             :depends-on ("rest-interface")))
 		       	:depends-on ("model" "atom" "xml" "TM-SPARQL"

Added: trunk/src/rest_interface/admin-interface.lisp
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/src/rest_interface/admin-interface.lisp	Mon Jul 18 04:07:59 2011	(r637)
@@ -0,0 +1,77 @@
+;;+-----------------------------------------------------------------------------
+;;+  Isidorus
+;;+  (c) 2008-2010 Marc Kuester, Christoph Ludwig, Lukas Georgieff
+;;+
+;;+  Isidorus is freely distributable under the LLGPL license.
+;;+  You can find a detailed description in trunk/docs/LLGPL-LICENSE.txt and
+;;+  trunk/docs/LGPL-LICENSE.txt.
+;;+-----------------------------------------------------------------------------
+
+(in-package :rest-interface)
+
+;;TODO: add functions to export statement
+
+;the prefix to get a fragment by the psi -> localhost:8000/json/get/<fragment-psi>
+(defparameter *admin-backup* "/admin/backup")
+;the prefix to get a fragment by the psi -> localhost:8000/json/rdf/get/<fragment-psi>
+(defparameter *admin-shutdown* "/admin/shutdown")
+
+
+(defun set-up-admin-interface ()
+  (push
+   (create-regex-dispatcher *admin-backup* #'admin-backup)
+   hunchentoot:*dispatch-table*)
+  (push
+   (create-regex-dispatcher *admin-shutdown* #'admin-shutdown)
+   hunchentoot:*dispatch-table*))
+
+
+
+(defun admin-shutdown()
+  (handler-case
+      (if (string= *admin-remote-name* (hunchentoot:remote-addr*))
+	  (progn
+	    (when elephant:*store-controller*
+	      (xtm-exporter:export-as-xtm
+	       (concat "backup_" (make-date-string (get-universal-time)) ".xtm")
+	       :tm-id "http://isidor.us/backup-tm"
+	       :revision 0))
+	    (shutdown-json-engine)
+	    (shutdown-atom-engine)
+	    (shutdown-admin-server)
+	    (close-tm-store)) ;in case the json and atom services are not running
+	  (setf (hunchentoot:return-code*) hunchentoot:+http-forbidden+))
+    (condition (err)
+      (progn
+	(tools:close-tm-store)
+	(setf (hunchentoot:return-code*) hunchentoot:+http-internal-server-error+)
+	(setf (hunchentoot:content-type*) "text")
+	(format nil "closed the tm store, but:~%condition: \"~a\"" err)))))
+
+	
+
+
+(defun admin-backup()
+  (handler-case
+      (if (string= "127.0.0.1" (hunchentoot:remote-addr*))
+	  (let ((destination-path
+		 (hunchentoot:url-decode (hunchentoot:get-parameter "path"))))
+	    (xtm-exporter:export-as-xtm destination-path
+					:tm-id "http://isidor.us/backup-tm"
+					:revision 0))
+	  (setf (hunchentoot:return-code*) hunchentoot:+http-forbidden+))
+    (condition (err)
+      (progn
+	(setf (hunchentoot:return-code*) hunchentoot:+http-internal-server-error+)
+	(setf (hunchentoot:content-type*) "text")
+	(format nil "Condition: \"~a\"" err)))))
+
+
+(defun make-date-string (universal-time)
+  (tools:concat
+   (write-to-string (nth-value 3 (decode-universal-time universal-time))) "."
+   (write-to-string (nth-value 4 (decode-universal-time universal-time))) "."
+   (write-to-string (nth-value 5 (decode-universal-time universal-time))) ":"
+   (write-to-string (nth-value 2 (decode-universal-time universal-time))) ":"
+   (write-to-string (nth-value 1 (decode-universal-time universal-time))) ":"
+   (write-to-string (nth-value 0 (decode-universal-time universal-time)))))
\ No newline at end of file

Modified: trunk/src/rest_interface/rest-interface.lisp
==============================================================================
--- trunk/src/rest_interface/rest-interface.lisp	Sun Jul 17 13:50:32 2011	(r636)
+++ trunk/src/rest_interface/rest-interface.lisp	Mon Jul 18 04:07:59 2011	(r637)
@@ -30,8 +30,13 @@
            :read-fragment-feed
            :start-json-engine
 	   :start-atom-engine
+	   :start-admin-server
 	   :shutdown-json-engine
 	   :shutdown-atom-engine
+	   :shutdown-admin-server
+	   :*admin-host-name*
+	   :*admin-port*
+	   :*admin-remote-name*
 	   :*json-get-prefix*
 	   :*get-rdf-prefix*
 	   :*json-commit-url*
@@ -69,6 +74,31 @@
 
 (defvar *json-server-acceptor* nil)
 (defvar *atom-server-acceptor* nil)
+(defvar *admin-server-acceptor* nil)
+(defvar *admin-host-name* "127.0.0.1")
+(defvar *admin-port* 11008)
+(defvar *admin-remote-name* "127.0.0.1")
+
+
+(defun start-admin-server ()
+  (when *admin-server-acceptor*
+    (error "The admin-server is already running"))
+  (set-up-admin-interface )
+  (setf hunchentoot:*show-lisp-errors-p* t)
+  (setf hunchentoot:*hunchentoot-default-external-format* 
+	(flex:make-external-format :utf-8 :eol-style :lf))
+  (setf *admin-server-acceptor*
+	(make-instance 'hunchentoot:acceptor
+		       :address *admin-host-name*
+		       :port *admin-port*))
+  (hunchentoot:start *admin-server-acceptor*))
+
+
+(defun shutdown-admin-server ()
+  "Shut down the admin server."
+  (when *admin-server-acceptor*
+    (hunchentoot:stop *admin-server-acceptor*))
+  (setf *admin-server-acceptor* nil))
 
 
 (defun start-json-engine (repository-path &key
@@ -93,7 +123,8 @@
 
 (defun shutdown-json-engine ()
   "Shut down the Topic Map Engine, only the json part."
-  (hunchentoot:stop *json-server-acceptor*)
+  (when *json-server-acceptor*
+    (hunchentoot:stop *json-server-acceptor*))
   (setf *json-server-acceptor* nil)
   (close-tm-store))
 
@@ -122,6 +153,7 @@
 
 (defun shutdown-atom-engine ()
   "Shut down the Topic Map Engine, only the atom part."
-  (hunchentoot:stop *atom-server-acceptor*)
+  (when *atom-server-acceptor*
+    (hunchentoot:stop *atom-server-acceptor*))
   (setf *atom-server-acceptor* nil)
   (close-tm-store))
\ No newline at end of file

Added: trunk/src/shell_scripts/shutdown-isidorus.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/src/shell_scripts/shutdown-isidorus.sh	Mon Jul 18 04:07:59 2011	(r637)
@@ -0,0 +1,62 @@
+#!/bin/bash
+##+-----------------------------------------------------------------------------
+##+  Isidorus
+##+  (c) 2008-2010 Marc Kuester, Christoph Ludwig, Lukas Georgieff
+##+
+##+  Isidorus is freely distributable under the LLGPL license.
+##+  You can find a detailed description in trunk/docs/LLGPL-LICENSE.txt and
+##+  trunk/docs/LGPL-LICENSE.txt.
+##+-----------------------------------------------------------------------------
+
+
+## This script can be used to invoke hunchentoot's admin interface and shut down
+## the server. The default ip address is set to 127.0.0.1 and can be changed via
+## the switch -host <ip-address>. The default url that determines the server's
+## callback binding is set to /admin/shutdown, but this behavior can also be
+## changed by using the switch -url <url-fragment>.
+## a sample call would be ./shutdown-isidorus.sh -host 12.34.56.78 -url /admin/shutdown
+
+url="/admin/shutdown";
+host="127.0.0.1:11008";
+
+if [ $# -eq 0 ]; then
+    :
+elif [ $# -eq 1 -a $1 = "?" ]; then
+    echo "you can pass the arguments -host <host-url> and -url </url-fragment>, if no arguments are passed the default values 127.0.0.1 and 11008 are used";
+    exit;
+elif [ $# -eq 2 ]; then
+    if [ $1 = "-host" ]; then
+	host=$2;
+    elif [ $1 = "-url" ]; then
+	url=$2;
+    else
+	echo "only the arguments -host and -url are supported, use ? for more information";
+	exit;
+    fi
+elif [ $# -eq 4 ]; then
+    if [ $1 = "-host" ]; then
+	host=$2;
+    elif [ $1 = "-url" ]; then
+	url=$2;
+    else
+	echo "only the arguments -host and -url are supported, use ? for more information";
+	exit;
+    fi
+    
+    if [ $3 = "-host" ]; then
+	host=$4;
+    elif [ $3 = "-url" ]; then
+	url=$4;
+    else
+	echo "only the arguments -host and -url are supported, use ? for more information";
+	exit;
+    fi
+else
+    echo "only the arguments -host and -url are supported, use ? for more information";
+    exit;
+fi
+	    
+curl $host$url
+
+
+




More information about the Isidorus-cvs mailing list