rename reload from plc.d/functions into plc_reload
[myplc.git] / plc.d / functions
index 92a236f..3ca315b 100644 (file)
@@ -1,12 +1,9 @@
 # -*-Shell-script-*-
-#
 # Common functions for PLC startup/shutdown scripts
 #
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id: functions,v 1.3 2006/04/10 15:53:49 mlhuang Exp $
-#
 
 export PATH=/sbin:/bin:/usr/bin:/usr/sbin
 
@@ -17,20 +14,17 @@ export PATH=/sbin:/bin:/usr/bin:/usr/sbin
 ERRORS=0
 
 # Count the exit status of the last command
-check ()
-{
+function check () {
     ERRORS=$(($ERRORS+$?))
 }
 
 # Print status header
-dialog ()
-{
+function dialog () {
     echo -n "PLC: $*: " >&3
 }
 
 # Print result
-result ()
-{
+function result () {
     if [ $ERRORS -eq 0 ] ; then
        success "$*" >&3
     else
@@ -40,8 +34,7 @@ result ()
 }
 
 # Start up a program with a plc_ prefix
-plc_daemon ()
-{
+function plc_daemon () {
     base=${1##*/}
 
     # See if it's already running. Look *only* at the pid file.
@@ -56,7 +49,16 @@ plc_daemon ()
     [ -n "${pid:-}" -a -z "${force:-}" ] && return
 
     # And start it up.
-    (exec -a plc_${base} $*)
+    # Thierry -- June 18 2007
+    # when invoking, e.g. service plc start httpd from an ssh connection
+    # ssh stupidly hangs when everything is done
+    # it turns out the forked ssh daemon exhibits the following stack at that point
+    # (gdb) where
+    # #0  0x001d6402 in __kernel_vsyscall ()
+    # #1  0x003c2e7d in ___newselect_nocancel () from /lib/libc.so.6
+    # #2  0x004387b4 in main () from /usr/sbin/sshd
+    # So I figured the various file descriptors used were not properly closed
+    (exec 3>&- 4>&- ; exec -a plc_${base} $*)
     ret=$?
 
     if [ -f /var/run/${base}.pid ] ; then
@@ -67,27 +69,76 @@ plc_daemon ()
 }
 
 # Print IP address of hostname if resolvable
-gethostbyname ()
-{
-    perl -MSocket -e '($a,$b,$c,$d,@addrs) = gethostbyname($ARGV[0]); print inet_ntoa($addrs[0]) . "\n";' $1 2>/dev/null
-}
-
-# Print the CNAME of an SSL certificate
-ssl_cname ()
-{
-    openssl x509 -noout -in $1 -subject | \
-       sed -n -e 's@.*/CN=\([^/]*\).*@\1@p'
+function gethostbyname () {
+    python -c 'import socket; import sys; print socket.gethostbyname(sys.argv[1])' $1 2>/dev/null
 }
 
 # Forcefully make a symlink
-symlink ()
-{
+function symlink () {
     mkdir -p $(dirname $2)
     rm -f $2
     ln -s $1 $2
 }
 
+# Argument(s) or stdin to lowercase stdout
+function lower () {
+    if [ ${#*} -ge 1 ] ; then
+       tr A-Z a-z <<<$*
+    else
+       tr A-Z a-z
+    fi
+}
+
+# Argument(s) or stdin to uppercase stdout
+function upper () {
+    if [ ${#*} -ge 1 ] ; then
+       tr a-z A-Z <<<$*
+    else
+       tr a-z A-Z
+    fi
+}
+
+# Regenerate configuration files
+function plc_reload () {
+    force=$1
+
+    # Regenerate the main configuration file from default values
+    # overlaid with site-specific and current values.
+    # Thierry -- 2007-07-05 : values in plc_config.xml are *not* taken into account here
+    files=(
+        /etc/planetlab/default_config.xml
+        /etc/planetlab/configs/site.xml
+    )
+
+    for file in "${files[@]}" ; do
+    if [ -n "$force" -o $file -nt /etc/planetlab/plc_config.xml ] ; then
+        tmp=$(mktemp /tmp/plc_config.xml.XXXXXX)
+        plc-config --xml "${files[@]}" >$tmp
+        if [ $? -eq 0 ] ; then
+        mv $tmp /etc/planetlab/plc_config.xml
+        chmod 444 /etc/planetlab/plc_config.xml
+        else
+        echo "PLC: Warning: Invalid configuration file(s) detected"
+        rm -f $tmp
+        fi
+        break
+    fi
+    done
+
+    # Convert configuration to various formats
+    if [ -n "$force" -o /etc/planetlab/plc_config.xml -nt /etc/planetlab/plc_config ] ; then
+    plc-config --shell >/etc/planetlab/plc_config
+    fi
+    if [ -n "$force" -o /etc/planetlab/plc_config.xml -nt /etc/planetlab/plc_config.py ] ; then
+    plc-config --python >/etc/planetlab/plc_config.py
+    fi
+    if [ -n "$force" -o /etc/planetlab/plc_config.xml -nt /etc/planetlab/php/plc_config.php ] ; then
+    mkdir -p /etc/planetlab/php
+    plc-config --php >/etc/planetlab/php/plc_config.php
+    fi
+}
+
 # Make copies of stdout and stderr. The plc initscript redirects
 # stdout and stderr to a logfile if -v is not specified.
-[ ! -e /dev/fd/3 ] && exec 3>&1
-[ ! -e /dev/fd/4 ] && exec 4>&2
+[ ! -e /proc/self/fd/3 ] && exec 3>&1
+[ ! -e /proc/self/fd/4 ] && exec 4>&2