diff options
Diffstat (limited to 'initscript/stap-server.in')
-rw-r--r-- | initscript/stap-server.in | 709 |
1 files changed, 525 insertions, 184 deletions
diff --git a/initscript/stap-server.in b/initscript/stap-server.in index 48808eb4..07595ec6 100644 --- a/initscript/stap-server.in +++ b/initscript/stap-server.in @@ -23,46 +23,75 @@ STAP_START_SERVER=$BINDIR/stap-start-server STAP_STOP_SERVER=$BINDIR/stap-stop-server UNAME=/bin/uname -# Path setup +# Default Global Configuration 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 $" -c configfile : specify additional global configuration file." + echo $" -a arch : specify the target architecture." + echo $" -r release : specify the kernel release." + echo $" -I path : augment the search path for tapsets." + echo $" -R path : specify the location of the systemtap runtime." + echo $" -B options : specify 'make' options for building systemtap modules." + echo $" -u username : specify the user who will run the server(s)." + echo $" -i : specify a server for each installed kernel release." + echo $" -n nickname : specify a server configuration by nickname." + echo $" -p pid : specify a server or server configuration by process id." + echo $"" + echo $"All options, may be specified more than once." echo $"" - echo $"All options, except -c, may be specified more than once." + echo $"If -a is not specified, the default architecture is that of the host" + echo $"platform." echo $"" - echo $"Each -a option changes the target architecture for subsequent -r" - echo $"options. The default is the architecture of the host platform." + echo $"If -r is not specified, the default kernel release is that currently" + echo $"running on 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 $"If -u is not specified, the default user is 'stap-server'" + echo $"" + echo $"Each -I and -B option specifies an additional path or option" + echo $"respectively. For other options, each new instance overrides the" + echo $"previous setting." 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 $"release installed in /lib/modules/. Previous -I, -R, -B and -u" + echo $"options will be applied to each server, however previous -a options" + echo $"are ignored and the default architecture is used." + echo $"" + echo $"The -n option allows the specification of a server configuration by" + echo $"nickname. When -n is specified, a currently running server with the" + echo $"given nickname will be searched for. If no currently running server" + echo $"with the given nickname is found, a server configuration with the" + echo $"given nickname will be searched for in /etc/stap-server/conf.d/*.conf." + echo $"If a server configuration for the given nickname is found, the -a, -r," + echo $"-I, -R, -B and -u options for that server will be used as if they were" + echo $"specified on the command line. If no configuration with the given" + echo $"nickname is found, and the action is 'start' (or an action behaving" + echo $"like 'start' (see below), the server will be started with the given" + echo $"nickname. If no configuration with the given nickname is found, and" + echo $"the action is not 'start' (or an action behaving" "like 'start'," + echo $"it is an error. If a nickname is not specified for a server, its" + echo $"nickname will be its process id." 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 $"The -p option allows the specification of a server configuration by" + echo $"process id. When -p is specified, a currently running server with the" + echo $"given process id will be searched for. If no such server is found," + echo $"it is an error. If a server with the given pid is found, the -a, -r," + echo $"-I, -R, -B and -u options for that server will be used as if they were" + echo $"specified on the command line." + echo $"" + echo $"The specified action is performed for the server(s) specified on the" + echo $"command line. If no servers are specified on the command line, the" + echo $"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" @@ -121,7 +150,11 @@ parse_args () { # arguments while [ -n "$1" ]; do case "$1" in -a) - OPT_KERNEL_ARCH=$2 + OPT_SERVER_CMDS="$OPT_SERVER_CMDS ARCH='$2'" + shift 1 + ;; + -B) + OPT_SERVER_CMDS="$OPT_SERVER_CMDS BUILD='$2'" shift 1 ;; -c) @@ -131,11 +164,32 @@ parse_args () { # arguments -i) process_i ;; + -I) + OPT_SERVER_CMDS="$OPT_SERVER_CMDS INCLUDE='$2'" + shift 1 + ;; + -n) + process_n $2 + shift 1 + ;; + -p) + process_p $2 + test $? = 0 || rc=1 + shift 1 + ;; -r) process_r $2 test $? = 0 || rc=1 shift 1 ;; + -R) + OPT_SERVER_CMDS="$OPT_SERVER_CMDS RUNTIME='$2'" + shift 1 + ;; + -u) + OPT_SERVER_CMDS="$OPT_SERVER_CMDS USER='$2'" + shift 1 + ;; --) ;; *) @@ -145,22 +199,65 @@ parse_args () { # arguments shift 1 done + # Add an EXEC command to the end if any server options were specified + test -n "$OPT_SERVER_CMDS" && OPT_SERVER_CMDS="$OPT_SERVER_CMDS EXEC" + 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 + test -n "$OPT_SERVER_CMDS" && OPT_SERVER_CMDS="$OPT_SERVER_CMDS EXEC" + process_r $release + done + + return 0 +} + +# Process the -n flag. +process_n () { + local target_NICKNAME="$1" + + # Is there a running server with this nickname? + local pid=`get_server_pid_by_nickname "$target_NICKNAME"` + if [ -n "$pid" ]; then + # Read the configuration and add it to the configuration commands. + . $STAT_PATH/$pid + OPT_SERVER_CMDS="$OPT_SERVER_CMDS `echo_server_commands`" + return + fi + + # Is there a server configuration with this nickname? + for f in "$CONFIG_PATH"/*.conf; do + if [ -f "$f" ]; then + . "$f" + test "X$NICKNAME" = "X$target_NICKNAME" || continue + OPT_SERVER_CMDS="$OPT_SERVER_CMDS `echo_server_commands`" + return + fi done - OPT_KERNEL_ARCH=$save_arch + # No server configuration could be found for this nickname. Add a + # NICKNAME_NOT_FOUND=... command to the configuration commands. + OPT_SERVER_CMDS="$OPT_SERVER_CMDS NICKNAME_NOT_FOUND='$target_NICKNAME'" +} + +# Process the -p flag. +process_p () { + local pid="$1" + + # Are we managing a server with the given pid? + test ! -f $STAT_PATH/$pid && echo "No stap-server running as pid $pid" && \ + exit 1 + + # Add the configuration of the server running as $pid to OPT_SERVER_CMDS + . $STAT_PATH/$pid + OPT_SERVER_CMDS="$CONFIG_SERVER_CMDS `echo_server_commands`" + return 0 } @@ -178,33 +275,15 @@ process_r () { echo "Missing $version_file_name" return 1 fi - OPT_SERVER_LIST="$OPT_SERVER_LIST ${kernel_release}_${OPT_KERNEL_ARCH}" + OPT_SERVER_CMDS="$OPT_SERVER_CMDS RELEASE='$kernel_release'" return 0 fi # kernel release specified directly - OPT_SERVER_LIST="$OPT_SERVER_LIST ${1}_${OPT_KERNEL_ARCH}" + OPT_SERVER_CMDS="$OPT_SERVER_CMDS RELEASE='$1'" 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 @@ -215,19 +294,67 @@ load_config () { fi } +# Default to the currently running kernel release +get_release () { + $UNAME -r +} + +# Default to the currently running kernel release +get_arch () { + stap_get_arch +} + +echo_server_commands () { + # Echo the configuration command string. + echo -n "ARCH='$ARCH'" + echo -n " RELEASE='$RELEASE'" + echo -n " RUNTIME='$RUNTIME'" + for i in $INCLUDE; do + echo -n " INCLUDE='$i'" + done + for b in $BUILD; do + echo -n " BUILD='$b'" + done + echo -n " USER='$USER'" + # The NICKNAME= command must be last. See start (). + echo -n " NICKNAME='$NICKNAME'" + echo +} + +echo_server_options () { + # Echo the configuration options. + echo -n "-a '$ARCH'" + echo -n " -r '$RELEASE'" + test -n "$RUNTIME" && echo -n " -R '$RUNTIME'" + for i in $INCLUDE; do + echo -n " -I '$i'" + done + for b in $BUILD; do + echo -n " -B '$b'" + done + test -n "$USER" && echo -n " -u '$USER'" + echo -n " -n '$NICKNAME'" + echo +} + load_server_config () { - CONFIG_OPTS= + CONFIG_SERVER_CMDS= 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. + # Obtain a configuration from each config file. + # Ensure that we get the correct defaults for items not specified. local ARCH= + local BUILD= + local INCLUDE= + local RUNTIME= + local USER= local RELEASE= . "$f" - [ -z "$ARCH" ] && ARCH=`get_arch` - [ -z "$RELEASE" ] && RELEASE=`get_release` - CONFIG_OPTS="$CONFIG_OPTS -a $ARCH -r $RELEASE" + # Other options default to empty. These ones don't. + [ -z "$ARCH" ] && ARCH=`get_arch` + [ -z "$RELEASE" ] && RELEASE=`get_release` + [ -z "$USER" ] && USER=$STAP_USER + CONFIG_SERVER_CMDS="$CONFIG_SERVER_CMDS `echo_server_commands` EXEC" fi done } @@ -244,16 +371,78 @@ stat_file () { # server-spec echo $STAT_PATH/$1 } -default_server_list () { - echo "`get_release`_`get_arch`" +default_server_cmds () { + echo "EXEC" } -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 +init_server_opts () { + ARCH=`get_arch` + RELEASE=`get_release` + BUILD= + INCLUDE= + NICKNAME= + NICKNAME_NOT_FOUND= + RUNTIME= + USER=$STAP_USER +} + +server_still_running () { # PID + (ps -e | grep stap-serverd | grep -q $1) && return 0 # Still running + + rm -f $STAT_PATH/$1 + return 1 # Not running +} + +get_server_pid_by_config () { + # Need to save the config, since the process of checking the running + # servers alters it. + local target_ARCH="$ARCH" + local target_RELEASE="$RELEASE" + local target_INCLUDE="$INCLUDE" + local target_RUNTIME="$RUNTIME" + local target_BUILD="$BUILD" + local target_USER="$USER" + local target_NICKNAME="$NICKNAME" + + # Check the status file for each running server to see if it matches + # the one currently configured. We're checking for a given configuration, + # so don't compare the nickname. + for f in $STAT_PATH/*; do + test ! -e $f && continue + . $f + test "X$ARCH" = "X$target_ARCH" || continue + test "X$RELEASE" = "X$target_RELEASE" || continue + test "X$INCLUDE" = "X$target_INCLUDE" || continue + test "X$RUNTIME" = "X$target_RUNTIME" || continue + test "X$BUILD" = "X$target_BUILD" || continue + test "X$USER" = "X$target_USER" || continue + echo `basename $f` # Server has a pid + return + done + + ARCH="$target_ARCH" + RELEASE="$target_RELEASE" + INCLUDE="$target_INCLUDE" + RUNTIME="$target_RUNTIME" + BUILD="$target_BUILD" + USER="$target_USER" + NICKNAME="$target_NICKNAME" +} + +get_server_pid_by_nickname () { + # No need to save the current configuration. This function is not called + # in a context requiring it. + local target_NICKNAME="$1" + + # Check the status file for each running server to see if the nickname + # matches the one we want. + for f in $STAT_PATH/*; do + test ! -e $f && continue + . $f + test "X$NICKNAME" = "X$target_NICKNAME" || continue + echo `basename $f` # Server with nickname was found + return + done } managed_servers () { @@ -271,7 +460,76 @@ managed_servers () { echo "$list" } -start () { # server-list +eval_server_command () { + local cmd="$1" + + # Accumulate the results of BUILD and INCLUDE commands. + if echo $cmd | grep -q ^BUILD; then + local prevBUILD="$BUILD" + eval $cmd + BUILD="$prevBUILD $BUILD" + BUILD=`echo $BUILD | sed 's/^ //'` + elif echo $cmd | grep -q ^INCLUDE; then + local prevINCLUDE="$INCLUDE" + eval $cmd + INCLUDE="$prevINCLUDE $INCLUDE" + INCLUDE=`echo $INCLUDE | sed 's/^ //'` + else + eval $cmd + fi +} + +start_server () { + clog $"Starting $prog for $RELEASE $ARCH: " -n + + # Is there already a server running for the requested kernel release + # and arch? + local server_pid=`get_server_pid_by_config` + if test -n "$server_pid"; then + if server_still_running $server_pid; then + do_success $"$prog start `echo_server_options`" + return 0 # Success + fi + fi + + # Construct the server start command. + local server_cmd="$STAP_START_SERVER -r '$RELEASE' -a '$ARCH'" + for b in $BUILD; do + server_cmd="$server_cmd -B '$b'" + done + for i in $INCLUDE; do + server_cmd="$server_cmd -I '$i'" + done + test -n "$RUNTIME" && server_cmd="$server_cmd -R '$RUNTIME'" + server_cmd="$server_cmd --log=$LOG_FILE" + + # Start the server here. + local pid=`runuser -s /bin/bash - $USER -c "$server_cmd"` + if [ $? != 0 -o -z "$pid" ]; then + if [ -n "$pid" ]; then + rm -f $STAT_PATH/$pid + fi + do_failure $"$prog start `echo_server_options`" + return 1 # Failure + fi + + # Nickname defaults to the pid. + test -z "$NICKNAME" && NICKNAME="$pid" + + # Write the configuration to the status file. + local server_status_file=$STAT_PATH/$pid + echo "ARCH='$ARCH'" > $server_status_file + echo "USER='$USER'" >> $server_status_file + echo "BUILD='$BUILD'" >> $server_status_file + echo "INCLUDE='$INCLUDE'" >> $server_status_file + echo "NICKNAME='$NICKNAME'" >> $server_status_file + echo "RUNTIME='$RUNTIME'" >> $server_status_file + echo "RELEASE='$RELEASE'" >> $server_status_file + + do_success $"$prog start `echo_server_options`" +} + +start () { # server-cmds prepare_stat_dir if [ $? -ne 0 ]; then do_failure $"Failed to make stat directory ($STAT_PATH)" @@ -279,91 +537,127 @@ start () { # server-list fi # Start the specified servers - local server_list="$1" + server_cmds="$1" # If none specified, start the configured servers - if [ -z "$server_list" ]; then + if [ -z "$server_cmds" ]; then load_server_config - parse_args $CONFIG_OPTS || exit 2 - server_list="$OPT_SERVER_LIST" + server_cmds="$CONFIG_SERVER_CMDS" # If none configured, start the default servers - [ -z "$server_list" ] && server_list=`default_server_list` + [ -z "$server_cmds" ] && server_cmds=`default_server_cmds` 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" + init_server_opts + local cmd + local prevCmd + for cmd in $server_cmds; do + prevCmd=$cmd + # Evaluate commands until the EXEC command is found. + if test "$cmd" != "EXEC"; then + eval_server_command $cmd + # A specified nickname only sticks if it is the final command. + # Otherwise, we have a configuration based on a nicknamed + # configuration. + echo "$cmd" | grep -q "^NICKNAME=" || NICKNAME="" 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 - continue + # If a nickname was specified, but the corresponding config was not found, + # then it is the nickname for this new configuration. + if test -n "$NICKNAME_NOT_FOUND"; then + NICKNAME="$NICKNAME_NOT_FOUND" + NICKNAME_NOT_FOUND= fi - do_success $"$prog start for $release $arch" + # Start the configured server + test $first = 0 && echo + first=0 + start_server || rc=1 + + # Don't use the same nickname for the next server. + NICKNAME= done return $rc } -stop () { # server-list - local server_status - local server_list +stop () { # server-cmds local first=1 + local server_list= + server_cmds="$1" + if [ -n "$server_cmds" ]; then + # Get the pids of all the requested servers. + init_server_opts + local cmd + local prevCmd + for cmd in $server_cmds; do + prevCmd=$cmd + # Evaluate commands until the EXEC command is found. + if test "$cmd" != "EXEC"; then + eval_server_command $cmd + # A specified nickname only sticks if it is the final command. + # Otherwise, we have a configuration based on a nicknamed + # configuration. + echo "$cmd" | grep -q "^NICKNAME=" || NICKNAME="" + continue + fi + # If a nickname was specified, but the corresponding config was not + # found, it is an error. + if test -n "$NICKNAME_NOT_FOUND"; then + clog "No configuration found for the nickname '$NICKNAME_NOT_FOUND'" -n + NICKNAME="$NICKNAME_NOT_FOUND" + do_failure $"$prog stop `echo_server_options`" + NICKNAME_NOT_FOUND= + rc=1 + continue + fi - # Stop the specified servers or all servers, if none specified. - server_list="$1" - [ -z "$server_list" ] && server_list=`managed_servers` + # Get the pid for this server, if it's running + local server_pid=`get_server_pid_by_config` + if test -n "$server_pid"; then + server_list="$server_list $server_pid" + continue + fi - # No server specified or running? - if [ -z "$server_list" ]; then - clog $"Stopping $prog: " -n - do_success $"$prog: No managed servers to stop" - return 0 + # This server is not running, but give a success stop status anyway. + test $first = 0 && echo + first=0 + clog $"Stopping $prog for $RELEASE $ARCH: " -n + do_success $"$prog stop `echo_server_options`" + done + else + server_list=`managed_servers` + if [ -z "$server_list" ]; then + clog $"Stopping $prog: " -n + do_success $"$prog: No managed servers to stop" + return 0 + fi fi # Stop each server in turn local rc=0 - for server_status in $server_list; do - release_arch=`echo $server_status | sed 's/_/ /'` + local pid + for pid in $server_list; do + . $STAT_PATH/$pid test $first = 0 && echo first=0 - clog $"Stopping $prog for $release_arch: " -n + 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 server_still_running $pid; then + runuser -s /bin/bash - $USER -c "$STAP_STOP_SERVER $pid" if [ $? != 0 ]; then - do_failure $"$prog start: unable to start stap-server for $release $arch" + do_failure $"$prog stop `echo_server_options`" this_rc=1 rc=1 fi fi if [ $this_rc = 0 ]; then - rm -f $server_status_file - do_success $"$prog stop for $release_arch" + rm -f $STAT_PATH/$pid + do_success $"$prog stop `echo_server_options`" fi done @@ -371,58 +665,91 @@ stop () { # server-list } 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` + # Report status for the specified servers or all running servers, if none + # specified. + local server_list= + server_cmds="$1" + if [ -n "$server_cmds" ]; then + # Get the pids of all the requested servers. + init_server_opts + local cmd + local prevCmd + for cmd in $server_cmds; do + prevCmd=$cmd + # Evaluate commands until the EXEC command is found. + if test "$cmd" != "EXEC"; then + eval_server_command $cmd + # A specified nickname only sticks if it is the final command. + # Otherwise, we have a configuration based on a nicknamed + # configuration. + echo "$cmd" | grep -q "^NICKNAME=" || NICKNAME="" + continue + fi + # If a nickname was specified, but the corresponding config was not + # found, say so. + if test -n "$NICKNAME_NOT_FOUND"; then + echo "No configuration found for the nickname '$NICKNAME_NOT_FOUND'" + NICKNAME_NOT_FOUND= + rc=3 + continue + fi - # No server specified or running? - if [ -z "$server_list" ]; then - echo "No managed stap-server is running" - return 3 + # Get the pid for this server, if it's running + local server_pid=`get_server_pid_by_config` + if test -n "$server_pid"; then + server_list="$server_list $server_pid" + continue + fi + # This server is not running + echo "stap-server `echo_server_options`" + rc=3 + done + else + server_list=`managed_servers` + if [ -z "$server_list" ]; then + echo "No managed stap-server is running" + return 3 + fi 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 + local pid + for pid in $server_list; do + . $STAT_PATH/$pid + if ! server_still_running $pid; then + echo "stap-server `echo_server_options` started as PID $pid is no longer running" + rc=1 + continue fi + echo "stap-server `echo_server_options` running as PID $pid" done return $rc } # Restart or start if not running -function restart () { # server-list - local server_list - +function restart () { # server-cmds # Restart the specified servers or all servers, if none specified. - server_list="$1" - [ -z "$server_list" ] && server_list=`managed_servers` + local server_cmds="$1" + if [ -z "$server_cmds" ]; then + local server_list=`managed_servers` + local pid + for pid in $server_list; do + . $STAT_PATH/$pid + server_cmds="$server_cmds `echo_server_commands` EXEC" + done + fi # Stop the specified servers, or all if none specified - stop "$server_list" + stop "$server_cmds" local rc=$? echo # Restart the same servers. If none were specified then # start the configured or default server(s)). - start "$server_list" + start "$server_cmds" local this_rc=$? [ $this_rc != 0 ] && rc=$this_rc @@ -431,52 +758,64 @@ function restart () { # server-list # 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 + local server_cmds="$1" + if [ -z "$server_cmds" ]; then + local server_list=`managed_servers` + local pid + for pid in $server_list; do + . $STAT_PATH/$pid + server_cmds="$server_cmds `echo_server_commands` EXEC" + done + # No server specified or running? + if [ -z "$server_cmds" ]; then + clog "No managed stap-server is running" -n + do_success "No managed stap-server is running" + return 0 + fi 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 start_cmds= 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" + local server_cmd= + local cmd + for cmd in $server_cmds; do + # Execute and collect commands until the EXEC command is found. + server_cmd="$server_cmd $cmd" + if test "$cmd" != "EXEC"; then + eval_server_command $cmd + continue + fi + + test $first = 0 && echo + first=0 + + # Now see if this server is running + if ! status "$server_cmd" >/dev/null 2>&1; then + clog $"$prog for $RELEASE $ARCH is not running" -n + do_success "$prog `echo_server_options` is not running" + server_cmd= continue - fi + fi + + start_cmds="$start_cmds $server_cmd" - start_list="$start_list $server_spec" + stop "$server_cmd" + this_rc=$? + [ $this_rc != 0 ] && rc=$this_rc - stop "$server_spec" - this_rc=$? - [ $this_rc != 0 ] && rc=$this_rc + server_cmd= 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 + if [ "X$start_cmds" != "X" ]; then + echo + start "$start_cmds" + local this_rc=$? + [ $this_rc != 0 ] && rc=$this_rc + fi return $rc } @@ -486,7 +825,7 @@ function condrestart () { # server-list #------------------------------------------------------------------ CMD=$1 shift 1 -OPTS=`getopt -s bash -u -o 'a:c:ir:' -- $@` +OPTS=`getopt -s bash -u -o 'a:B:c:iI:n:p:r:R:u:' -- $@` if [ $? -ne 0 ]; then slog "Error: Argument parse error: $@" failure $"parse error" @@ -494,6 +833,8 @@ if [ $? -ne 0 ]; then exit 2 fi +# Initialize server specs +OPT_SERVER_CMDS= parse_args $OPTS || exit 2 load_config @@ -502,27 +843,27 @@ RETVAL=0 case $CMD in start) # Start specified servers. If none specified, start configured servers - start "$OPT_SERVER_LIST" + start "$OPT_SERVER_CMDS" RETVAL=$? ;; stop) # Stop specified servers - stop "$OPT_SERVER_LIST" + stop "$OPT_SERVER_CMDS" RETVAL=$? ;; # Restart specified servers restart) - restart "$OPT_SERVER_LIST" + restart "$OPT_SERVER_CMDS" RETVAL=$? ;; # Restart specified servers if they are running condrestart|try-restart) - condrestart "$OPT_SERVER_LIST" + condrestart "$OPT_SERVER_CMDS" RETVAL=$? ;; # Give status on specified servers status) - status "$OPT_SERVER_LIST" + status "$OPT_SERVER_CMDS" exit $? ;; # Reloading config without stop/restart is not supported @@ -536,7 +877,7 @@ case $CMD in echo # Restart specified servers # If none specified, restart configured servers - start "$OPT_SERVER_LIST" + start "$OPT_SERVER_CMDS" RETVAL=$? ;; usage|*) |