diff options
Diffstat (limited to 'initscript/stap-server.in')
-rw-r--r-- | initscript/stap-server.in | 547 |
1 files changed, 547 insertions, 0 deletions
diff --git a/initscript/stap-server.in b/initscript/stap-server.in new file mode 100644 index 00000000..f00110b0 --- /dev/null +++ b/initscript/stap-server.in @@ -0,0 +1,547 @@ +#!/bin/bash +# +# stap-server init.d script for the systemtap compile server +# +# chkconfig: - 00 99 +# description: The systemtap compile server provides a centralized and secure \ +# environment for compiling systemtap scripts. +# config: /etc/sysconfig/stap-server +# config: /etc/stap-server/conf.d + +BINDIR=@bindir@ + +# Source function library. +. /etc/rc.d/init.d/functions + +# Systemtap function library +. $BINDIR/stap-env + +prog=stap-server + +# Commands +STAP_START_SERVER=$BINDIR/stap-start-server +STAP_STOP_SERVER=$BINDIR/stap-stop-server +UNAME=/bin/uname + +# Path setup +CONFIG_FILE=/etc/sysconfig/stap-server +CONFIG_PATH=/etc/stap-server/conf.d +STAT_PATH=/var/run/stap-server +LOG_FILE=/var/log/stap-server.log + +# Default Settings +STAP_USER=stap-server + +# Default option settings +# Target architecture +OPT_KERNEL_ARCH=`stap_get_arch` +# A list of release_arch pairs +OPT_SERVER_LIST= +# Optional global config file +OPT_CONFIG_FILE= + +echo_usage () { + echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|status} [options]" + echo $"Options:" + echo $" -c configfile : specify additional config file" + echo $" -a arch : change the target architecture" + echo $" -r release : specify a kernel release" + echo $" -i : specify all installed kernel releases" + echo $"" + echo $"All options, except -c, may be specified more than once." + echo $"" + echo $"Each -a option changes the target architecture for subsequent -r" + echo $"options. The default is the architecture of the host platform." + echo $"" + echo $"Each -r option specifies a server for the given kernel release and the" + echo $"current architecture (either the default or set by the previous -a" + echo $"option)." + echo $"" + echo $"The -i option is a shortcut which specifies one server for each kernel" + echo $"release installed in /lib/modules/. The default architecture is used" + echo $"for these servers." + echo $"" + echo $"The specified action is performed on each server specified on the command line." + echo $"If no servers are specified on the command line, the behavior is as follows:" + echo $"" + echo $" start: Start the servers configured in /etc/stap-server/conf.d/*.conf." + echo $" If none are configured, start a server for the kernel release" + echo $" and architecture of the host platform." + echo $"" + echo $" stop: Stop all currently running servers." + echo $"" + echo $" restart: Restart all currently running servers. If no servers are running," + echo $" behave as if 'start' was specified." + echo $"" + echo $" condrestart: Restart all currently running servers. If no servers are running," + echo $" do nothing." + echo $"" + echo $" try-restart: Same as condrestart." + echo $"" + echo $" force-reload: Stop all currently running servers and behave as if 'start'" + echo $" was specified." + echo $"" + echo $" status: Report the status of all current running servers." + echo $"" +} + +#----------------------------------------------------------------- +# Helper functions +#----------------------------------------------------------------- +log () { # message + echo `LC_ALL=en date +"%b %e %T"`": $1" >> "$LOG_FILE" +} +clog () { # message [-n] + echo $2 "$1" + log "$1" +} +slog () { # message + logger "$1" # if syslogd is running, this message will be sent to syslog. + log "$1" +} +logex () { # command + eval log \"Exec: $@\" + "$@" >> "$LOG_FILE" 2>&1 + return $? +} +do_failure () { # message + slog "Error: $1" + failure "$1" +} +do_success () { # message + log "Pass: $1" + success "$1" +} + +#------------------------------------------------------------------ +# Parameter parsing and setup options +#------------------------------------------------------------------ +parse_args () { # arguments + local rc=0 + while [ -n "$1" ]; do + case "$1" in + -a) + OPT_KERNEL_ARCH=$2 + shift 1 + ;; + -c) + OPT_CONFIG_FILE=$2 + shift 1 + ;; + -i) + process_i + ;; + -r) + process_r $2 + test $? = 0 || rc=1 + shift 1 + ;; + --) + ;; + *) + rc=1 + ;; + esac + shift 1 + done + + test $rc != 0 && echo_usage + return $rc +} + +# Process the -i flag. +process_i () { + local save_arch=$OPT_KERNEL_ARCH + OPT_KERNEL_ARCH=`stap_get_arch` + + cd /lib/modules + local release + for release in `ls`; do + process_r $release + done + + OPT_KERNEL_ARCH=$save_arch + return 0 +} + +# Process the -r flag. +process_r () { + local first_char=`expr "$1" : '\(.\).*'` + + if test "$first_char" = "/"; then # fully specified path + local kernel_build_tree=$1 + local version_file_name="$kernel_build_tree/include/config/kernel.release" + # The file include/config/kernel.release within the kernel + # build tree is used to pull out the version information + local kernel_release=`cat $version_file_name 2>/dev/null` + if test "X$kernel_release" = "X"; then + echo "Missing $version_file_name" + return 1 + fi + OPT_SERVER_LIST="$OPT_SERVER_LIST ${kernel_release}_${OPT_KERNEL_ARCH}" + return 0 + fi + + # kernel release specified directly + OPT_SERVER_LIST="$OPT_SERVER_LIST ${1}_${OPT_KERNEL_ARCH}" + return 0 +} + +# Default to the currently running kernel release +get_release () { # server-spec + if [ -z "$1" ]; then + $UNAME -r + else + expr "$1" : '\(.*\)_.*' + fi +} + +# Default to the currently running kernel release +get_arch () { # server-spec + if [ -z "$1" ]; then + stap_get_arch + else + expr "$1" : '.*_\(.*\)' + fi +} + +load_config () { + # Include configs + if [ -f "$CONFIG_FILE" ]; then + . "$CONFIG_FILE" + fi + if [ -f "$OPT_CONFIG_FILE" ]; then + . "$OPT_CONFIG_FILE" + fi +} + +load_server_config () { + CONFIG_OPTS= + for f in "$CONFIG_PATH"/*.conf; do + if [ -f "$f" ]; then + # Obtain an architecture and release from each config file. + # Ensure that we get the default architecture and release if they + # are not specified. + local ARCH= + local RELEASE= + . "$f" + [ -z "$ARCH" ] && ARCH=`get_arch` + [ -z "$RELEASE" ] && RELEASE=`get_release` + CONFIG_OPTS="$CONFIG_OPTS -a $ARCH -r $RELEASE" + fi + done +} + +prepare_stat_dir () { + if [ ! -d "$STAT_PATH" ]; then + logex mkdir -p "$STAT_PATH" + [ $? -ne 0 ] && return 1 + fi + return 0 +} + +stat_file () { # server-spec + echo $STAT_PATH/$1 +} + +default_server_list () { + echo "`get_release`_`get_arch`" +} + +check_server_running () { # server-spec + local server_status=`stat_file $1` + test ! -f $server_status && return 1 + (ps -e | grep stap-serverd | grep -q `cat $server_status`) || return 1 + # Server is already running + return 0 +} + +managed_servers () { + if [ ! -d $STAT_PATH ]; then + echo "" + return 1 + fi + cd $STAT_PATH + local list=`ls` + if [ -z "$list" ]; then + echo "" + return 1 + fi + + echo "$list" +} + +start () { # server-list + prepare_stat_dir + if [ $? -ne 0 ]; then + do_failure $"Failed to make stat directory ($STAT_PATH)" + return 1 + fi + + # Start the specified servers + local server_list="$1" + # If none specified, start the configured servers + if [ -z "$server_list" ]; then + load_server_config + parse_args $CONFIG_OPTS || exit 2 + server_list="$OPT_SERVER_LIST" + + # If none configured, start the default servers + [ -z "$server_list" ] && server_list=`default_server_list` + fi + + # Start each requested server in turn + local rc=0 + local spec + local first=1 + for spec in $server_list; do + local release=`get_release $spec` + local arch=`get_arch $spec` + + test $first = 0 && echo + first=0 + clog $"Starting $prog for $release $arch: " -n + + # Is there already a server running for the requested kernel release + # and arch? + if check_server_running $spec; then + do_success $"$prog start for $release $arch" + continue + fi + + # Start the server here. + local server_status=`stat_file $spec` + runuser -s /bin/bash - $STAP_USER -c "$STAP_START_SERVER -r $release -a $arch --log=$LOG_FILE > $server_status" + if [ $? != 0 ]; then + rm -f $server_status + do_failure $"$prog start: unable to start stap-server for $release $arch" + rc=1 + fi + + do_success $"$prog start for $release $arch" + done + + return $rc +} + +stop () { # server-list + local server_status + local server_list + local first=1 + + # Stop the specified servers or all servers, if none specified. + server_list="$1" + [ -z "$server_list" ] && server_list=`managed_servers` + + # No server specified or running? + if [ -z "$server_list" ]; then + clog $"Stopping $prog: " -n + do_success $"$prog: No managed servers to stop" + return 0 + fi + + # Stop each server in turn + local rc=0 + for server_status in $server_list; do + release_arch=`echo $server_status | sed 's/_/ /'` + + test $first = 0 && echo + first=0 + clog $"Stopping $prog for $release_arch: " -n + + local this_rc=0 + local server_status_file=`stat_file $server_status` + if check_server_running $server_status; then + local pid=`cat $server_status_file` + runuser -s /bin/bash - $STAP_USER -c "$STAP_STOP_SERVER $pid" + if [ $? != 0 ]; then + do_failure $"$prog start: unable to start stap-server for $release $arch" + this_rc=1 + rc=1 + fi + fi + [ $this_rc = 0 ] && rm -f $server_status_file + + do_success $"$prog stop for $release_arch" + done + + return $rc +} + +status () { # server-list + local server_list + local rc=0 + + # Report status for the specified servers or all servers, if none specified. + server_list="$1" + [ -z "$server_list" ] && server_list=`managed_servers` + + # No server specified or running? + if [ -z "$server_list" ]; then + echo "No managed stap-server is running" + return 3 + fi + + # Get status of each server in turn + local server_status + for server_status in $server_list; do + local release_arch=`echo $server_status | sed 's/_/ /'` + local server_status_file=`stat_file $server_status` + if [ ! -f $server_status_file ]; then + echo "stap-server for $release_arch is not running" + rc=3 + else + local pid=`cat $server_status_file` + if check_server_running $server_status; then + echo "stap-server for $release_arch running as PID $pid" + else + echo "stap-server for $release_arch started as PID $pid is no longer running" + rm -f $server_status_file + rc=1 + fi + fi + done + + return $rc +} + +# Restart or start if not running +function restart () { # server-list + local server_list + + # Restart the specified servers or all servers, if none specified. + server_list="$1" + [ -z "$server_list" ] && server_list=`managed_servers` + + # Stop the specified servers, or all if none specified + stop "$server_list" + local rc=$? + echo + + # Restart the same servers. If none were specified then + # start the configured or default server(s)). + start "$server_list" + local this_rc=$? + [ $this_rc != 0 ] && rc=$this_rc + + return $rc +} + +# Restart only if running +function condrestart () { # server-list + local server_list + + # Restart the specified servers or all servers, if none specified, + # but only if they are already running. + server_list="$1" + [ -z "$server_list" ] && server_list=`managed_servers` + + # No server specified or running? + if [ -z "$server_list" ]; then + clog "No managed stap-server is running" -n + do_success "No managed stap-server is running" + return 0 + fi + + # For each server in the list, stop it if it is running + local rc=0 + local this_rc + local start_list= + local server_spec + local first=1 + for server_spec in $server_list; do + test $first = 0 && echo + first=0 + + if ! status $server_spec >/dev/null 2>&1; then + local release=`get_release $server_spec` + local arch=`get_arch $server_spec` + clog $"$prog for $release $arch is not running" -n + do_success "$prog for $release $arch is not running" + continue + fi + + start_list="$start_list $server_spec" + + stop "$server_spec" + this_rc=$? + [ $this_rc != 0 ] && rc=$this_rc + done + + # Now restart the servers that were running + for server_spec in $start_list; do + echo + start "$server_spec" + local this_rc=$? + [ $this_rc != 0 ] && rc=$this_rc + done + + return $rc +} + +#------------------------------------------------------------------ +# Mainline script +#------------------------------------------------------------------ +CMD=$1 +shift 1 +OPTS=`getopt -s bash -u -o 'a:c:ir:' -- $@` +if [ $? -ne 0 ]; then + slog "Error: Argument parse error: $@" + failure $"parse error" + echo_usage + exit 2 +fi + +parse_args $OPTS || exit 2 +load_config + +RETVAL=0 + +case $CMD in + start) + # Start specified servers. If none specified, start configured servers + start "$OPT_SERVER_LIST" + RETVAL=$? + ;; + stop) + # Stop specified servers + stop "$OPT_SERVER_LIST" + RETVAL=$? + ;; + # Restart specified servers + restart) + restart "$OPT_SERVER_LIST" + RETVAL=$? + ;; + # Restart specified servers if they are running + condrestart|try-restart) + condrestart "$OPT_SERVER_LIST" + RETVAL=$? + ;; + # Give status on specified servers + status) + status "$OPT_SERVER_LIST" + exit $? + ;; + # Reloading config without stop/restart is not supported + reload) + RETVAL=3 + ;; + # Reload config with stop/start + force-reload) + # stop all running servers + stop + echo + # Restart specified servers + # If none specified, restart configured servers + start "$OPT_SERVER_LIST" + RETVAL=$? + ;; + usage|*) + echo_usage + RETVAL=0 + ;; +esac + +echo +exit $RETVAL |