Index: bin/hsqldb =================================================================== --- bin/hsqldb.orig 2011-01-14 13:55:34.636488672 +0100 +++ bin/hsqldb 2011-01-14 14:05:37.464628070 +0100 @@ -50,7 +50,7 @@ ### BEGIN INIT INFO # Provides: HSQLDB-Server # Required-Start: $syslog $remote_fs $network $named -# Required-Stop: +# Required-Stop: $syslog $remote_fs $network $named # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Short-Description: HSQLDB-Server @@ -89,19 +89,73 @@ # -- blaine.simpson@admc.com +# Shell functions sourced from /etc/rc.status: +# rc_check check and set local and overall rc status +# rc_status check and set local and overall rc status +# rc_status -v ditto but be verbose in local rc status +# rc_status -v -r ditto and clear the local rc status +# rc_failed set local and overall rc status to failed +# rc_failed set local and overall rc status to +# rc_reset clear local rc status (overall remains) +# rc_exit exit appropriate to overall rc status +. /etc/rc.status + +# First reset status of this service +rc_reset + +# Return values acc. to LSB for all commands but status: +# 0 - success +# 1 - generic or unspecified error +# 2 - invalid or excess argument(s) +# 3 - unimplemented feature (e.g. "reload") +# 4 - insufficient privilege +# 5 - program is not installed +# 6 - program is not configured +# 7 - program is not running +# +# Note that starting an already running service, stopping +# or restarting a not-running service as well as the restart +# with force-reload (in case signalling is not supported) are +# considered a success. + set +u +# "chown" lives in /usr on some UNIXes. +PATH="/bin:/sbin:/usr/sbin" + + +NAME="$(/bin/basename $0)" +unset ISBOOT +if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then + NAME="${NAME:3}" + ISBOOT="1" +fi + +# remove SUSE's rc name +if [ "${NAME:0:2}" = "rc" ]; then + NAME="${NAME:2}" +fi + +# For SELinux we need to use 'runuser' not 'su' +if [ -x "/sbin/runuser" ]; then + SU="/sbin/runuser" +else + SU="/bin/su" +fi + # This is only used for recursive invocations. # Will not necessarily be set correctly at system bootup invocations # (where it is sometimes invoked like "sh... /path/to/hsqldb start"), # but, in those cases there will be no recursion. -INVOC_PATH=`dirname "$0"` || { +INVOC_PATH=`/usr/bin/dirname "$0"` || { echo "'dirname' failed" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -n "$INVOC_PATH" ] && INVOC_PATH="${INVOC_PATH}/" -SYNTAX_MSG="SYNTAX: ${INVOC_PATH}hsqldb start|stop|stopcompact|restart|restartcmpacted|status" +SYNTAX_MSG="Usage: ${INVOC_PATH}/${NAME} start|stop|status|try-restart|restart|force-reload|reload|probe" # You can override any of these default values in your config file: @@ -110,9 +164,12 @@ SU_ECHO_SECS=1 # File used as semaphore. If file is removed, a running pid checker # process will exit. -PIDCHECKER_FLAGFILE=`mktemp /tmp/hsqldb.XXXXXXXX` +PIDCHECKER_FLAGFILE=`/bin/mktemp /tmp/hsqldb.XXXXXXXX` if [ x"$PIDCHECKER_FLAGFILE" = "x" ] ; then - echo "unable to create tmp file"; exit 1 + echo "unable to create tmp file" + rc_failed 1 + rc_status -v + rc_exit fi # The following settings get overridden by optional setting in the config file. # Time to allow for JVM to die after all HSQLDB instances stopped. @@ -168,25 +225,31 @@ done [ -n "$CFGFILE" ] || { echo "No global config file found in any of allowed locations" 1>&2 - exit 11 + rc_failed 1 + rc_status -v + rc_exit } # Sanity check [ -n "$LOGFILE" ] && [ -n "$PIDFILE" ] || { echo "Internal problem in init script" 1>&2 - exit 11 + rc_failed 1 + rc_status -v + rc_exit } [ $# -eq 1 ] || { echo "$SYNTAX_MSG" 1>&2 - exit 4 + exit 1 } # It would be nice to permit some uses, like "status" by non-root users, # but for now our goal is a superuser init script. [ -w / ] || { # Very portable, but perhaps not perfect, test for superuser. echo "Only 'root' may use this init script" 1>&2 - exit 4 + rc_failed 1 + rc_status -v + rc_exit } # Use bsd-style enable/disable if it's in place. @@ -209,11 +272,15 @@ [ -r "$CFGFILE" ] || { echo "Unable to read config file '$CFGFILE'" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -f "$CFGFILE" ] || { echo "'$CFGFILE' is not a regular file" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } HSQLDB_OWNER= JAVA_EXECUTABLE= @@ -221,6 +288,28 @@ SERVER_HOME= SHUTDOWN_URLIDS= . "$CFGFILE" + +[ -z "$JAVA_EXECUTABLE" ] && { + # JPackage source Java config + . /etc/java/java.conf + + if [ -n "$JAVA_HOME" ]; then + JAVA_EXECUTABLE=${JAVA_HOME}/bin/java + else + JAVA_EXECUTABLE=${JVM_ROOT}/java/bin/java + fi + + if [ -z "$JAVA_HOME" ]; then + if [ -d "$JVM_ROOT/java" ]; then + JAVA_EXECUTABLE=$JVM_ROOT/java/bin/java + else + JAVA_EXECUTABLE=$JVM_ROOT/jre/bin/java + fi + else + JAVA_EXECUTABLE=$JAVA_HOME/bin/java + fi +} + # Suffix delimiter to $SERVER_ADDL_CLASSPATH, if it is set. [ -n "$SERVER_ADDL_CLASSPATH" ] && SERVER_ADDL_CLASSPATH="${SERVER_ADDL_CLASSPATH}:" @@ -229,15 +318,21 @@ [ -n "$SERVER_HOME" ] || { echo "Config file '$CFGFILE' does not set one or more of following variables JAVA_EXECUTABLE, HSQLDB_JAR_PATH, SERVER_HOME" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -d "$SERVER_HOME" ] || { echo "SERVER_HOME variable in '$CFGFILE' is set to a non-directory." 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -f "$JAVA_EXECUTABLE" ] && [ -f "$HSQLDB_JAR_PATH" ] || { echo "JAVA_EXECUTABLE or HSQLDB_JAR_PATH in '$CFGFILE' is set to a non-file." 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } # PROPERTY_FILE is a derived value. @@ -246,28 +341,36 @@ WebServer) PROPERTY_FILE="$SERVER_HOME"/webserver.properties;; *) echo 'Unsupported value for $TARGET_CLASS: '"$TARGET_CLASS" 1>&2 - exit 2;; + rc_failed 2 + rc_status -v + rc_exit + ;; esac [ -f "$PROPERTY_FILE" ] || { echo "'$PROPERTY_FILE' is missing" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -r "$PROPERTY_FILE" ] || { echo "'$PROPERTY_FILE' isn't readable" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -r "$HSQLDB_JAR_PATH" ] || { echo "'$HSQLDB_JAR_PATH' isn't readable" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -x "$JAVA_EXECUTABLE" ] || { echo "No Java executable found at '$JAVA_EXECUTABLE'" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } -# "chown" lives here on some UNIXes. -PATH="$PATH:/usr/sbin" - # Make a good effort (but not bullet-proof) check on permissions of the # auth file. Unfortunately, if auth-file is not specified, this depends # upon both (a) $HOME being set; and (b) SqlToolSprayer and SqlTool defaults. @@ -279,15 +382,21 @@ [ -n "${_AUTH_TEST_PATH}" ] || _AUTH_TEST_PATH="$HOME/sqltool.rc" [ -f "$_AUTH_TEST_PATH" ] || { echo "No auth file found at '$_AUTH_TEST_PATH'" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } [ -r "$_AUTH_TEST_PATH" ] || { echo "Auth file '$_AUTH_TEST_PATH' not readable" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } ls -ld "$_AUTH_TEST_PATH" | grep '^-..------' > /dev/null 2>&1 || { echo "Fix permissions on '$_AUTH_TEST_PATH' like 'chmod 600 $_AUTH_TEST_PATH'" 1>&2 - exit 2 + rc_failed 1 + rc_status -v + rc_exit } fi @@ -296,29 +405,37 @@ [ -r "$PIDFILE" ] && { [ -f "$PIDFILE" ] || { echo "'$PIDFILE' is not a regular file" 1>&2 - exit 6 + rc_failed 1 + rc_status -v + rc_exit } [ -w "$PIDFILE" ] || { echo "'$PIDFILE' is not writable" 1>&2 - exit 6 + rc_failed 1 + rc_status -v + rc_exit } HSQLDB_PID="`cat $PIDFILE`" || { echo "Failed to read pid file '$PIDFILE'" 1>&2 - exit 6 + rc_failed 1 + rc_status -v + rc_exit } case "$HSQLDB_PID" in *[a-zA-Z/!@#$%*+=_~]*) HSQLDB_PID=;; *'^'*) HSQLDB_PID=;; esac [ -n "$HSQLDB_PID" ] || { - echo "Pid file '$PIDFILE' does not contain a valid process identifier" 1>&2 - exit 6 + rc_failed 7 + rc_status -v + rc_exit } kill -0 "$HSQLDB_PID" > /dev/null 2>&1 || { echo 'Removing stale pid file' rm -f "$PIDFILE" || { - echo "Failed to remove pid file '$PIDFILE'" 1>&2 - exit 6 + rc_failed 1 + rc_status -v + rc_exit } HSQLDB_PID= } @@ -329,7 +446,9 @@ status) [ -n "$HSQLDB_PID" ] || { echo "I don't know of any running hsqldb server." - exit 0 + rc_failed 7 + rc_status -v + rc_exit } echo "There is an hsqldb server loaded from $HSQLDB_JAR_PATH running with pid $HSQLDB_PID." @@ -348,32 +467,42 @@ "-Dsqltoolsprayer.propfile=$PROPERTY_FILE" \ "-Dsqltoolsprayer.monfile=$PIDFILE" \ org.hsqldb.util.SqlToolSprayer '--;' + rc_failed 0 + rc_status -v + rc_exit ;; start) [ -n "$HSQLDB_PID" ] && { echo "There is already a hsqldb server running with pid $HSQLDB_PID." 1>&2 - exit 1 + rc_failed 0 + rc_status -v + rc_exit } TLS_SWITCHES= [ -n "$TLS_KEYSTORE" ] && TLS_SWITCHES="-Djavax.net.ssl.keyStore=$TLS_KEYSTORE -Djavax.net.ssl.keyStorePassword=$TLS_PASSWORD" if [ -n "$HSQLDB_OWNER" ]; then touch "$PIDFILE" || { - echo "Failed to create pid file" 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit } chown "$HSQLDB_OWNER" "$PIDFILE" || { echo "Failed to chown pid file to '$HSQLDB_OWNER'" 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit } # Some OSes choke if there are newlines in this string. # N.b.!!! The shell of the -c command is the target user's default # login shell, so keep this command shell-independent! - nohup su "$HSQLDB_OWNER" -c "cd '$SERVER_HOME' && echo "'$$'" > '$PIDFILE' && exec '$JAVA_EXECUTABLE' $SERVER_JVMARGS $TLS_SWITCHES -classpath '${SERVER_ADDL_CLASSPATH}${HSQLDB_JAR_PATH}' org.hsqldb.util.MainInvoker org.hsqldb.$TARGET_CLASS $INVOC_ADDL_ARGS" >> "$LOGFILE" 2>&1 & + /usr/bin/nohup $SU "$HSQLDB_OWNER" -c "cd '$SERVER_HOME' && echo "'$$'" > '$PIDFILE' && exec '$JAVA_EXECUTABLE' $SERVER_JVMARGS $TLS_SWITCHES -classpath '${SERVER_ADDL_CLASSPATH}${HSQLDB_JAR_PATH}' org.hsqldb.util.MainInvoker org.hsqldb.$TARGET_CLASS $INVOC_ADDL_ARGS" >> "$LOGFILE" 2>&1 & else cd "$SERVER_HOME" || { echo "Failed to cd to '$SERVER_HOME'" 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit } export JAVA_EXECUTABLE export HSQLDB_JAR_PATH @@ -382,10 +511,12 @@ export SERVER_JVMARGS export TARGET_CLASS export INVOC_ADDL_ARGS - nohup sh -c ' + /usr/bin/nohup sh -c ' echo $$ > "$PIDFILE" || { echo "Failed to write pid to pid file" 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit } eval exec "$JAVA_EXECUTABLE" $SERVER_JVMARGS $TLS_SWITCHES -classpath "${SERVER_ADDL_CLASSPATH}${HSQLDB_JAR_PATH}" org.hsqldb.util.MainInvoker org.hsqldb.$TARGET_CLASS $INVOC_ADDL_ARGS ' >> "$LOGFILE" 2>&1 & @@ -404,7 +535,9 @@ # but regardless of why, the pid file does not contain a valid pid. touch "$PIDCHECKER_FLAGFILE" || { echo "Failed to touch file '$PIDCHECKER_FLAGFILE'" 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit } export PIDCHECKER_FLAGFILE export PIDFILE @@ -414,7 +547,9 @@ [ -f "$PIDCHECKER_FLAGFILE" ] || exit 0 kill -0 "`cat $PIDFILE`" > /dev/null 2>&1 || { rm -f "$PIDFILE" "$PIDCHECKER_FLAGFILE" - exit 1 + rc_failed 1 + rc_status -v + rc_exit } sleep 1 done @@ -426,18 +561,24 @@ org.hsqldb.util.SqlToolSprayer '--;' && { rm -f "$PIDCHECKER_FLAGFILE" echo "org.hsqldb.$TARGET_CLASS started with pid `cat $PIDFILE`" - exit 0 + rc_failed 0 + rc_status -v + rc_exit } rm -f "$PIDCHECKER_FLAGFILE" echo "Failed to start org.hsqldb.$TARGET_CLASS. See log file '$LOGFILE'." 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit ;; stop|stopcompact) [ "$COMMAND" = stopcompact ] && SHUTDOWN_OPTION='compact' [ -n "$HSQLDB_PID" ] || { echo "I don't know of any running hsqldb server." 1>&2 - exit 1 + rc_failed 7 + rc_status -v + rc_exit } AUTH_FILE_SWITCH= # N.b., there will be a problem if there are special characters or @@ -455,23 +596,64 @@ sleep $MAX_TERMINATE_SECS # Give the JVM a sec. or 2 to fully exit. kill -0 "$HSQLDB_PID" > /dev/null 2>&1 && { echo "WARNING: hsqldb is still running!" 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit } rm -f "$PIDFILE" || { echo "Failed to remove pid file '$PIDFILE'" 1>&2 - exit 1 + rc_failed 1 + rc_status -v + rc_exit } echo "Successful shutdown ${SHUTDOWN_OPTION} (for the $TARGET_CLASS process)!" - exit 0 + rc_failed 0 + rc_status -v + rc_exit ;; restart|restartcompacted) STOP_COMMAND=stop [ "$COMMAND" = restartcompacted ] && STOP_COMMAND=stopcompact - "${INVOC_PATH}"hsqldb $STOP_COMMAND || exit $? + "${INVOC_PATH}"hsqldb $STOP_COMMAND || { + rc_failed $? + rc_status -s + rc_exit + } exec "${INVOC_PATH}"/hsqldb start + rc_failed $? + rc_status -s + rc_exit ;; + try-restart) + ## Stop the service and if this succeeds (i.e. the + ## service was running before), start it again. + ## Note: try-restart is not (yet) part of LSB (as of 0.7.5) + $0 status >/dev/null && $0 restart + + # Remember status and be quiet + rc_status + ;; + force-reload) + ## Signal the daemon to reload its config. Most daemons + ## do this on signal 1 (SIGHUP). + ## If it does not support it, restart. + + echo -n "Reload service hsqldb" + ## if it supports it: + #killproc -HUP $TOMCAT_BIN + #touch /var/run/FOO.pid + #rc_status -v + + ## Otherwise: + $0 stop && $0 start + rc_status + ;; + reload|probe) + rc_failed 3 + rc_status -v + ;; *) echo "$SYNTAX_MSG" 1>&2 - exit 5 + exit 1 ;; esac