[Cluster-devel] conga/luci/init.d luci
rmccabe at sourceware.org
rmccabe at sourceware.org
Tue May 22 01:39:51 UTC 2007
CVSROOT: /cvs/cluster
Module name: conga
Branch: EXPERIMENTAL
Changes by: rmccabe at sourceware.org 2007-05-22 01:39:51
Modified files:
luci/init.d : luci
Log message:
Make the init script more robust, and make it log errors for any failures.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/init.d/luci.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.16&r2=1.16.2.1
--- conga/luci/init.d/luci 2007/03/15 16:52:36 1.16
+++ conga/luci/init.d/luci 2007/05/22 01:39:51 1.16.2.1
@@ -1,10 +1,9 @@
#!/bin/sh
#
-# Copyright (C) 2005 Red Hat, Inc.
+# Copyright (C) 2005-2007 Red Hat, Inc.
#
-# This program is Free Software. You may modify and/or redistribute it under
-# the terms of the GNU General Public License version 2, or (at your option)
-# any later version.
+# This program is Free Software. You may modify and/or redistribute it under
+# the terms of the GNU General Public License version 2.
#
# description: Starts and stops Red Hat Cluster and Storage Remote \
# Configuration Web Interface (luci)
@@ -23,22 +22,26 @@
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH
-ID="luci"
-LUCID="/var/lib/luci/bin/runzope"
-PIDFILE="/var/lib/luci/var/Z2.pid"
-GLOB_PIDFILE="/var/run/luci.pid"
-GLOB_LOCKFILE="/var/lock/subsys/luci"
+ID='luci'
+LUCID='/var/lib/luci/bin/runzope'
+PIDFILE='/var/lib/luci/var/Z2.pid'
+GLOB_PIDFILE='/var/run/luci.pid'
+GLOB_LOCKFILE='/var/lock/subsys/luci'
-LUCI_USER="luci"
-LUCI_GROUP="luci"
+LUCI_USER='luci'
+LUCI_GROUP='luci'
LUCI_URL="https://`/bin/hostname`:$LUCI_HTTPS_PORT"
-HTTPS_PUBKEY="/var/lib/luci/var/certs/https.pem"
-HTTPS_PRIVKEY="/var/lib/luci/var/certs/https.key.pem"
-STUNNEL_D="/usr/sbin/stunnel"
-STUNNEL_PID="/var/lib/luci/var/stunnel/pid"
-STUNNEL_CONF="/var/lib/luci/etc/stunnel.conf"
+HTTPS_PUBKEY='/var/lib/luci/var/certs/https.pem'
+HTTPS_PRIVKEY='/var/lib/luci/var/certs/https.key.pem'
+
+KEY_LIFE_DAYS='1825'
+KEY_BITS='2048'
+
+STUNNEL_D='/usr/sbin/stunnel'
+STUNNEL_PID='/var/lib/luci/var/stunnel/pid'
+STUNNEL_CONF='/var/lib/luci/etc/stunnel.conf'
#
# Only root wants to run this...
@@ -53,186 +56,273 @@
https_certs_ok()
{
- if [ ! -e $HTTPS_PRIVKEY ] ; then
- return 1
- fi
- if [ ! -e $HTTPS_PUBKEY ] ; then
- return 2
- fi
- return 0
-}
+ if [ ! -f "$HTTPS_PRIVKEY" ]; then
+ return 1
+ fi
-generate_https_certs()
-{
- rm -f $HTTPS_PRIVKEY $HTTPS_PUBKEY
- echo -n "generating https SSL certificates... "
- /usr/bin/openssl genrsa -out $HTTPS_PRIVKEY 2048 > /dev/null 2>&1
- /usr/bin/openssl req -new -x509 -key $HTTPS_PRIVKEY -out $HTTPS_PUBKEY -days 1825 -config /var/lib/luci/var/certs/cacert.config
- /bin/chown $LUCI_USER:$LUCI_GROUP $HTTPS_PRIVKEY $HTTPS_PUBKEY
- /bin/chmod 600 $HTTPS_PRIVKEY
- /bin/chmod 644 $HTTPS_PUBKEY
- echo "done"
- return $?
+ if [ ! -f "$HTTPS_PUBKEY" ]; then
+ return 2
+ fi
+
+ return 0
}
-start()
+generate_https_certs()
{
- $LUCID >/dev/null 2>/dev/null &
-
- https_certs_ok
- if [ "1$?" != "10" ] ; then
- generate_https_certs
- fi
- sleep 4
- sed -e s,\\\(^accept.*=\ \\\)\\\(.*\\\),\\\1$LUCI_HTTPS_PORT, $STUNNEL_CONF | $STUNNEL_D -fd 0
- sleep 4
+ echo -n "Generating https SSL certificates... "
+ old_umask=`umask`
+ umask 077
+
+ rm -f "$HTTPS_PRIVKEY" "$HTTPS_PUBKEY"
+ /usr/bin/openssl genrsa -out "$HTTPS_PRIVKEY" "$KEY_BITS" >&/dev/null
+ /usr/bin/openssl req -new -x509 -key "$HTTPS_PRIVKEY" -out "$HTTPS_PUBKEY" -days "$KEY_LIFE_DAYS" -config /var/lib/luci/var/certs/cacert.config
+ /bin/chmod 600 "$HTTPS_PRIVKEY"
+ /bin/chmod 644 "$HTTPS_PUBKEY"
+ /bin/chown $LUCI_USER:$LUCI_GROUP "$HTTPS_PRIVKEY" "$HTTPS_PUBKEY"
+ ret=$?
+
+ umask $old_umask
+ echo "done"
+ return $ret
}
stop_luci()
{
- pid_num=`cat $PIDFILE`
- kill $pid_num
- sleep 2
+ pid_num=`cat $PIDFILE 2>/dev/null`
+ ret=$?
+ if [ $ret -eq 0 ]; then
+ kill $pid_num >& /dev/null
+ ret=$?
+ fi
+
+ if [ $ret -ne 0 ]; then
+ pkill -u "$LUCI_USER" python >&/dev/null
+ ret=$?
+ fi
+ return $ret
}
stop_stunnel()
{
- pid_num=`cat $STUNNEL_PID`
- kill $pid_num
- sleep 2
+ pid_num=`cat $STUNNEL_PID 2>/dev/null`
+ ret=$?
+ if [ $ret -eq 0 ]; then
+ kill $pid_num >& /dev/null
+ ret=$?
+ fi
+
+ if [ $ret -ne 0 ]; then
+ pkill -u "$LUCI_USER" stunnel >&/dev/null
+ ret=$?
+ fi
+ return $ret
}
stop()
{
- stop_luci
- stop_stunnel
+ stop_stunnel
+ if [ $? -ne 0 ]; then
+ errmsg='Failed to stop stunnel'
+ return 1
+ fi
+ stop_luci
+ if [ $? -ne 0 ]; then
+ errmsg='Failed to stop luci'
+ return 1
+ fi
+ return 0
}
-system_running()
+start()
{
- # luci
- LUCI_UP=1
- if [ -e $PIDFILE ] ; then
- pid_num=`cat $PIDFILE`
- res=`ps -Af | grep python | grep $LUCI_USER | grep $pid_num`
- if [ "1$res" != "1" ] ; then
- LUCI_UP=0
- fi
- fi
-
- # stunnel
- ST_UP=2
- if [ -e $STUNNEL_PID ] ; then
- pid_num=`cat $STUNNEL_PID`
- res=`ps -Af | grep stunnel | grep $LUCI_USER | grep $pid_num`
- if [ "1$res" != "1" ] ; then
- ST_UP=0
- fi
- fi
-
- # resolve
- let res=$LUCI_UP+$ST_UP
- if [ "1$res" = "10" ] ; then
+ https_certs_ok
+ if [ $? -ne 0 ]; then
+ generate_https_certs
+ if [ $? -ne 0 ]; then
+ errmsg='An error occurred while generating certificates'
+ return 1
+ fi
+ fi
+
+ $LUCID >&/dev/null &
+ sleep 4
+
+ sed -e s,\\\(^accept.*=\ \\\)\\\(.*\\\),\\\1$LUCI_HTTPS_PORT, $STUNNEL_CONF | $STUNNEL_D -fd 0
+ if [ $? -ne 0 ]; then
+ errmsg='An error occurred while starting stunnel'
+ stop_luci
+ return 1
+ fi
return 0
- fi
- if [ "1$res" = "11" ] ; then
- # only stunnel running -> stop it
- stop_stunnel
- fi
- if [ "1$res" = "12" ] ; then
- # only luci running -> stop it
- stop_luci
- fi
- return 1
}
+luci_running()
+{
+ LUCI_UP=1
+ pgrep -u "$LUCI_USER" python >&/dev/null
+ if [ $? -ne 0 ]; then
+ LUCI_UP=0
+ fi
+
+ if [ -f "$PIDFILE" ] && [ $LUCI_UP -eq 0 ]; then
+ # stale pidfile
+ rm -f "$PIDFILE" >& /dev/null
+ fi
+ return $LUCI_UP
+}
+
+stunnel_running()
+{
+ ST_UP=2
+ pgrep -u "$LUCI_USER" stunnel >&/dev/null
+ if [ $? -ne 0 ]; then
+ ST_UP=0
+ fi
+ if [ -f "$STUNNEL_PID" ] && [ $ST_UP -eq 0 ]; then
+ # stale pidfile
+ rm -f "$STUNNEL_PID"
+ fi
+ return $ST_UP
+}
+
+system_running()
+{
+ luci_running
+ LUCI_UP=$?
+
+ stunnel_running
+ STUNNEL_UP=$?
+
+ res=`echo $LUCI_UP $STUNNEL_UP + p | /usr/bin/dc`
+ if [ $res -eq 0 ]; then
+ # none up
+ return 0
+ elif [ $res -eq 3 ]; then
+ # both up
+ return 1
+ elif [ $res -eq 1 ]; then
+ # only luci up
+ stop_luci
+ if [ $? -ne 0 ]; then
+ errmsg='Only luci was running and it could not be stopped'
+ return 3
+ fi
+ elif [ $res -eq 2 ]; then
+ # only stunnel up
+ stop_stunnel
+ if [ $? -ne 0 ]; then
+ errmsg='Only stunnel was running and it could not be stopped'
+ return 4
+ fi
+ fi
+ return 0
+}
case $1 in
start)
- if ! /bin/grep True /var/lib/luci/.default_password_has_been_reset 2>&1 >/dev/null; then
- echo ""
- echo "luci's 'admin' password has to be changed before server is allowed to start"
- echo "To do so, execute (as root): "
- echo -e "\tluci_admin password"
- echo ""
- /usr/bin/logger -t $ID "startup failed (password not reset): execute 'luci_admin password'"
- exit 1
+ if ! /bin/grep True /var/lib/luci/.default_password_has_been_reset 2>&1 >/dev/null; then
+ echo ""
+ echo "The admin user password must be set before the luci can start"
+ echo "To do so, execute (as root): "
+ echo -e "\tluci_admin password\n"
+ /usr/bin/logger -t "$ID" "Luci startup failed: admin password not set (execute 'luci_admin password')"
+ exit 1
fi
-
+
echo -n "Starting $ID: "
system_running
- rtrn=$?
- if [ "1$rtrn" != "10" ] ; then
- start
+ ret=$?
+ if [ $ret -eq 0 ]; then
+ start
+ elif [ $ret -eq 1 ]; then
+ # already running
+ echo_success
+ echo
+ exit 0
+ elif [ $ret -gt 2 ]; then
+ # one of the two processes was running and couldn't be stopped.
+ /usr/bin/logger -t "$ID" "Luci startup failed: $errmsg"
+ exit 1
fi
+
system_running
- rtrn=$?
- if [ "1$rtrn" = "10" ] ; then
- echo_success
- cat $PIDFILE > $GLOB_PIDFILE
- touch $GLOB_LOCKFILE
- /usr/bin/logger -t $ID "startup succeeded"
- /usr/bin/logger -t $ID "Listening on port $LUCI_HTTPS_PORT; accessible using url $LUCI_URL"
- echo; echo
- echo "Please, point your web browser to $LUCI_URL to access luci"
- echo
+ if [ $? -eq 1 ]; then
+ echo_success
+ cat "$PIDFILE" > "$GLOB_PIDFILE"
+ touch "$GLOB_LOCKFILE"
+ /usr/bin/logger -t "$ID" "Luci startup succeeded"
+ /usr/bin/logger -t "$ID" "Listening on port $LUCI_HTTPS_PORT; accessible via URL $LUCI_URL"
+ echo; echo
+ echo "Point your web browser to $LUCI_URL to access luci"
+ echo
else
- echo_failure
- /usr/bin/logger -t $ID "startup failed"
- echo
+ echo_failure
+ /usr/bin/logger -t "$ID" "Luci startup failed $errmsg"
+ echo
fi
- ;;
+ ;;
- restart)
+ restart)
$0 stop
- $0 start
rtrn=$?
- ;;
-
- condrestart)
- system_running
+ if [ $rtrn -eq 0 ]; then
+ $0 start
+ rtrn=$?
+ fi
+ ;;
+
+ condrestart)
+ system_running
rtrn=$?
- if [ "1$rtrn" = "10" ] ; then
- $0 restart
- rtrn=$?
+ if [ $? -eq 1 ] ; then
+ $0 restart
+ rtrn=$?
fi
- ;;
+ ;;
status)
- system_running
- rtrn=$?
- if [ "1$rtrn" = "10" ] ; then
- echo "$ID is running..."
+ system_running
+ if [ $? -eq 1 ]; then
+ echo "$ID is running..."
+ rtrn=0
else
- echo "$ID is stopped"
+ echo "$ID is stopped"
+ rtrn=1
fi
- ;;
+ ;;
stop)
echo -n "Shutting down $ID: "
system_running
rtrn=$?
- if [ "1$rtrn" = "10" ] ; then
- stop
- /usr/bin/logger -t $ID "shutdown succeeded"
- fi
- echo_success
- rm -f $GLOB_PIDFILE
- rm -f $GLOB_LOCKFILE
- rtrn=0
- echo
- ;;
+ if [ $rtrn -eq 1 ]; then
+ stop
+ if [ $? -eq 0 ]; then
+ rm -f "$GLOB_PIDFILE"
+ rm -f "$GLOB_LOCKFILE"
+ /usr/bin/logger -t "$ID" "Luci shutdown succeeded"
+ rtrn=0
+ else
+ /usr/bin/logger -t "$ID" "Luci shutdown failed"
+ fi
+ fi
+ if [ $rtrn -eq 0 ]; then
+ echo_success
+ else
+ echo_failure
+ fi
+ echo
+ ;;
- reload)
- rtrn=0
- ;;
+ reload)
+ rtrn=0
+ ;;
*)
echo "Usage: $0 {start|stop|status|restart|condrestart|reload}"
rtrn=1
- ;;
-
+ ;;
esac
exit $rtrn
More information about the Cluster-devel
mailing list