diff options
author | Dave Brolley <brolley@redhat.com> | 2009-10-26 15:20:06 -0400 |
---|---|---|
committer | Dave Brolley <brolley@redhat.com> | 2009-10-26 15:20:06 -0400 |
commit | 7901b115cfa71950649621818402f625fdb83a53 (patch) | |
tree | 097c411fc83a66f90127b688b8cf57a9b910dea5 /initscript | |
parent | 09070e8a586fa1d7592f9b35c9413c6cfdc8a477 (diff) | |
download | systemtap-steved-7901b115cfa71950649621818402f625fdb83a53.tar.gz systemtap-steved-7901b115cfa71950649621818402f625fdb83a53.tar.xz systemtap-steved-7901b115cfa71950649621818402f625fdb83a53.zip |
stap-server initscript fully functional.
Diffstat (limited to 'initscript')
-rw-r--r-- | initscript/stap-server.in | 289 |
1 files changed, 253 insertions, 36 deletions
diff --git a/initscript/stap-server.in b/initscript/stap-server.in index aad6b064..9f2b1369 100644 --- a/initscript/stap-server.in +++ b/initscript/stap-server.in @@ -3,7 +3,8 @@ # 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. +# description: The systemtap compile server provides a centralized and secure \ +# environment for compiling systemtap scripts. # config: /etc/stap-server/config # config: /etc/stap-server/conf.d ### BEGIN INIT INFO @@ -14,30 +15,64 @@ # Description: The systemtap compile server provides a centralized and secure environment for compiling systemtap scripts. ### END INIT INFO +# TEMPORARY SEARCH DIRECTORY WHILE TESTING. SHOULD BE CHANGED TO @bindir@ +BINDIR=/usr/local/bin + # 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 +STAP_START_SERVER=$BINDIR/stap-start-server +STAP_STOP_SERVER=$BINDIR/stap-stop-server UNAME=/bin/uname # Path setup CONFIG_PATH=/etc/stap-server/conf.d -STAT_PATH=/var/run/stap-server +STAT_PATH=/tmp/var/run/stap-server # for now, should be /var/run/stap-server TEMP_PATH=/tmp -LOG_FILE=/var/log/stap-server.log +LOG_FILE=$stap_server_logfile # /var/log/stap-server.log # Default option settings +# Target architecture +OPT_KERNEL_ARCH=`stap_get_arch` +# A list of release_arch pairs +OPT_SERVER_LIST= CONFIG=/etc/stap-server/config echo_usage () { - echo $"Usage: $prog {start|stop|restart|status|cleanup} [option]" + echo $"Usage: $prog {start|stop|restart|status} [option]" echo $"Options:" + echo $" -a arch : change the target architecture" echo $" -c configfile : specify config file" + echo $" -i : specify all installed kernel releases" + echo $" -r release : specify a kernel release" + 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 $"If no kernel release is specified, the defaults are as follows:" + echo $"" + echo $" start: start a server for the kernel release of the host platform." + echo $" stop: stop all servers." + echo $" restart: restart all servers." + echo $" status: report the status of all servers." + echo $"" } #----------------------------------------------------------------- @@ -84,7 +119,6 @@ check_bool () { # value } ask_yesno () { # message local yn ret=2 - [ "$OPT_ASSUMEYES" ] && return 1 while [ $ret -eq 2 ]; do echo -n "$1 [y/N]: " read yn @@ -102,10 +136,22 @@ parse_args () { # arguments local error=0 while [ -n "$1" ]; do case "$1" in + -a) + process_a $2 + shift 1 + ;; -c) CONFIG=$2 shift 1 ;; + -i) + process_i + ;; + -r) + process_r $2 + test $? = 0 || error=1 + shift 1 + ;; --) ;; *) @@ -114,19 +160,64 @@ parse_args () { # arguments esac shift 1 done - test error = 1 && echo_usage + test error = 1 && echo_usage && return 1 + + return 0 +} + +# Process the -a flag. +process_a () { + OPT_KERNEL_ARCH=$1 +} + +# 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 } CMD=$1 shift 1 -OPTS=`getopt -s bash -u -o 'c:Ry' $@` +OPTS=`getopt -s bash -u -o 'a:c:ir:' -- $@` if [ $? -ne 0 ]; then slog "Error: Argument parse error: $@" failure $"parse error" echo_usage exit 3 fi -parse_args $OPTS +parse_args $OPTS || exit 3 # Include configs if [ -f "$CONFIG" ]; then @@ -147,56 +238,186 @@ prepare_stat_dir () { return 0 } -start () { - clog $"Starting $prog: " -n +# 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 "$spec" : '.*_\(.*\)' + fi +} + +stat_file () { # server-spec + echo $STAT_PATH/$1 +} + +get_server_list () { + if [ -z "$OPT_SERVER_LIST" ]; then + echo "`get_release`_`get_arch`" + return 0 + fi + echo "$OPT_SERVER_LIST" +} + +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 () { # release arch prepare_stat_dir if [ $? -ne 0 ]; then do_failure $"Failed to make stat directory ($STAT_PATH)" return 1 fi - # Start the server here - do_failure $"$prog start not implemented" + # Start each requested server in turn + local server_list=`get_server_list` + 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. Use sudo for now to start it as root. + local server_status=`stat_file $spec` + sudo $STAP_START_SERVER -r $release -a $arch > $server_status + if [ $? != 0 ]; then + rm -f $server_status + do_failure $"$prog start: unable to start stap-server for $release $arch" + return 1 + fi + + do_success $"$prog start for $release $arch" + done - do_success $"$prog start" return 0 } stop () { - clog $"Stopping $prog: " -n + local server_status + local server_list + local first=1 - # Stop the server here - do_failure $"$prog stop not implemented" + # Stop the specified servers or all servers, if none specified. + if [ -n "$OPT_SERVER_LIST" ]; then + server_list="$OPT_SERVER_LIST" + else + server_list=`managed_servers` + fi - do_success $"$prog stop" - return 0 -} + for server_status in $server_list; do + release_arch=`echo $server_status | sed 's/_/ /'` -status () { - local ret=0 + test $first = 0 && echo + first=0 + clog $"Stopping $prog for $release_arch: " -n - # Print the status here - echo $"$prog status not implemented" + if check_server_running $server_status; then + local server_status_file=`stat_file $server_status` + local pid=`cat $server_status_file` + sudo $STAP_STOP_SERVER $pid + fi + rm -f $server_status_file - return $ret + do_success $"$prog stop for $release_arch" + done + + return 0 } -# Cleanup caches -cleanup () { - clog $"Stopping systemtap compile servers: " -n +status () { + local server_list - # Clean up the server(s) here - do_failure $"$prog cleanup not implemented" + # Report status for the specified servers or all servers, if none specified. + if [ -n "$OPT_SERVER_LIST" ]; then + server_list="$OPT_SERVER_LIST" + else + server_list=`managed_servers` + fi - do_success "done" + if [ -z "$server_list" ]; then + echo "No managed stap-server is running" + return 0 + fi + + 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" + 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 + fi + fi + done return 0 } # Restart scripts function restart () { + local server_list + + # Restart the specified servers or all servers, if none specified. + if [ -n "$OPT_SERVER_LIST" ]; then + server_list="$OPT_SERVER_LIST" + else + server_list=`managed_servers` + fi + + if [ -z "$server_list" ]; then + clog "No managed stap-server is running" -n + do_success "No managed stap-server is running" + return 0 + fi + stop echo + OPT_SERVER_LIST=$server_list start return $? } @@ -220,10 +441,6 @@ case $CMD in status exit $? ;; - cleanup) - cleanup - RETVAL=$? - ;; *) echo_usage RETVAL=3 |