/etc/init.d script for domtool-server
authorAdam Chlipala <adamc@hcoop.net>
Mon, 12 Feb 2007 00:45:34 +0000 (00:45 +0000)
committerAdam Chlipala <adamc@hcoop.net>
Mon, 12 Feb 2007 00:45:34 +0000 (00:45 +0000)
Makefile
scripts/domtool-admin-sudo [new file with mode: 0755]
scripts/domtool-server [new file with mode: 0755]
scripts/domtool-server-logged [new file with mode: 0755]
src/main-admin.sml
src/main.sig
src/main.sml

index 15a2272..4fb0853 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -136,6 +136,8 @@ install:
        cp scripts/domtool-addcert /usr/local/bin/
        cp scripts/domtool-addacl /usr/local/bin/
        cp scripts/domtool-rmuser /usr/local/bin/
+       cp scripts/domtool-admin-sudo /usr/local/bin/
+       cp scripts/domtool-server-logged /usr/local/bin/
        cp openssl/openssl_sml.so /usr/local/lib/
        -cp bin/domtool-server /usr/local/sbin/
        -cp bin/domtool-slave /usr/local/sbin/
diff --git a/scripts/domtool-admin-sudo b/scripts/domtool-admin-sudo
new file mode 100755 (executable)
index 0000000..19076c7
--- /dev/null
@@ -0,0 +1,3 @@
+kinit -k -t /etc/keytabs/domtool.keytab domtool/deleuze.hcoop.net
+aklog
+domtool-admin $* >/dev/null 2>/dev/null
diff --git a/scripts/domtool-server b/scripts/domtool-server
new file mode 100755 (executable)
index 0000000..6d45215
--- /dev/null
@@ -0,0 +1,56 @@
+#!/usr/bin/pagsh.openafs
+
+# This script should go in /etc/init.d/ on Debian Linux systems running Domtool dispatchers.
+
+SELF=$(cd $(dirname $0); pwd -P)/$(basename $0)
+PIDFILE="/var/run/k5start-domtool-server.pid"
+
+set -e
+
+case $1 in
+  start)
+       # Start daemon
+       echo -n "Starting Domtool dispatcher: domtool-server"
+       if sudo -u domtool domtool-admin-sudo ping; then
+               echo "...already running."
+       else
+               start-stop-daemon --start --pidfile $PIDFILE \
+                       -c domtool:domtool \
+                       --exec /usr/bin/k5start -- -b -f /etc/keytabs/domtool.keytab \
+                       -K 300 -t -p $PIDFILE \
+                       domtool/deleuze.hcoop.net \
+                       domtool-server-logged
+               echo "."
+       fi
+       ;;
+
+  stop)
+       echo -n "Stopping Domtool dispatcher: domtool-server"
+       if sudo -u domtool domtool-admin-sudo shutdown; then
+               echo "."
+       else
+               start-stop-daemon --stop --pidfile $PIDFILE
+               echo "."
+        fi
+       rm -f $PIDFILE
+       ;;
+
+  restart|reload|force-reload)
+       $SELF stop
+       $SELF start
+       ;;
+
+  status)
+       if sudo -u domtool domtool-admin-sudo ping; then
+               echo "Domtool dispatcher is running."
+       else
+               echo "Domtool dispatcher is stopped."
+               exit 3
+       fi
+       ;;
+
+  *)
+       echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
+       exit 1
+       ;;
+esac
diff --git a/scripts/domtool-server-logged b/scripts/domtool-server-logged
new file mode 100755 (executable)
index 0000000..9f8f285
--- /dev/null
@@ -0,0 +1 @@
+domtool-server >>/var/log/domtool.log 2>>/var/log/domtool.log
index 1eda532..ef59a22 100644 (file)
@@ -45,4 +45,5 @@ val _ =
       | "rmdom" :: doms => Main.requestRmdom doms
       | ["regen"] => Main.requestRegen ()
       | ["rmuser", user] => Main.requestRmuser user
+      | ["ping"] => OS.Process.exit (Main.requestPing ())
       | _ => print "Invalid command-line arguments\n"
index 87f3028..63f24e5 100644 (file)
@@ -34,6 +34,7 @@ signature MAIN = sig
     val request : string -> unit
     val requestDir : string -> unit
 
+    val requestPing : unit -> OS.Process.status
     val requestShutdown : unit -> unit
     val requestGrant : Acl.acl -> unit
     val requestRevoke : Acl.acl -> unit
index 8bb2d4e..cb39416 100644 (file)
@@ -275,6 +275,15 @@ fun requestDir dname =
     end
     handle ErrorMsg.Error => ()
 
+fun requestPing () =
+    let
+       val (_, bio) = requestBio (fn () => ())
+    in
+       OpenSSL.close bio;
+       OS.Process.success
+    end
+    handle _ => OS.Process.failure
+
 fun requestShutdown () =
     let
        val (_, bio) = requestBio (fn () => ())
@@ -745,10 +754,12 @@ fun service () =
                              | MsgMultiConfig codes => doConfig codes
 
                              | MsgShutdown =>
-                               if Acl.query {user = user, class = "priv", value = "shutdown"} then
-                                   print ("Domtool dispatcher shutting down at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n")
+                               if Acl.query {user = user, class = "priv", value = "all"}
+                                  orelse Acl.query {user = user, class = "priv", value = "shutdown"} then
+                                   print ("Domtool dispatcher shutting down at " ^ Date.toString (Date.fromTimeUniv (Time.now ())) ^ "\n\n")
                                else
-                                   (OpenSSL.close bio
+                                   (print "Unauthorized shutdown command!\n";
+                                    OpenSSL.close bio
                                     handle OpenSSL.OpenSSL _ => ();
                                     loop ())