summaryrefslogtreecommitdiffstats
path: root/initscript
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2009-12-14 13:08:45 -0500
committerDave Brolley <brolley@redhat.com>2009-12-14 13:08:45 -0500
commit601dc75d18ffd5670830b56c8a5c0f817ab92013 (patch)
tree9e27a4ab7441f3d0c27487bedcda8b740f9148d8 /initscript
parentfd0a75c3bc3ce806eb89eea1f346ba62ca1999d4 (diff)
downloadsystemtap-steved-601dc75d18ffd5670830b56c8a5c0f817ab92013.tar.gz
systemtap-steved-601dc75d18ffd5670830b56c8a5c0f817ab92013.tar.xz
systemtap-steved-601dc75d18ffd5670830b56c8a5c0f817ab92013.zip
PR 10905: stap-server initscript improvements
o Handle, -B, -I, -R options o Allow specification of servers by pid o Allow specification of servers by nickname. o Advertise options used using avahi.
Diffstat (limited to 'initscript')
-rw-r--r--initscript/README.stap-server120
-rw-r--r--initscript/stap-server.in458
2 files changed, 464 insertions, 114 deletions
diff --git a/initscript/README.stap-server b/initscript/README.stap-server
index 1e1d1bf5..8d18a9f9 100644
--- a/initscript/README.stap-server
+++ b/initscript/README.stap-server
@@ -1,5 +1,5 @@
stap-server initscript
-Version 0.1.0
+Version 0.1.1
INDEX
=====
@@ -27,15 +27,15 @@ One of the actions below must be specified.
2.2.1 start
Start server(s). If a specified server is already started, this action will
- be ignored for that server. If any server fails to start this action fails.
+ be ignored for that server. If any server fails to start, this action fails.
If no server is specified, the configured servers are started. If no servers
are configured, a server for the kernel release and architecture of the host
is started.
2.2.2 stop
Stop server(s). If a specified server is already stopped, this action
- will be ignored for that server. If a server fails to stop, this action fails.
- If no server is specified, all currently running servers are stopped.
+ will be successful for that server. If a server fails to stop, this action
+ fails. If no server is specified, all currently running servers are stopped.
2.2.3 restart
Stop and start servers again. The specified servers are stopped and restarted.
@@ -72,21 +72,62 @@ to specify servers to be managed.
configuration file specified will be used.
2.3.2 -a architecture
- Each stap-server instance targets a specific kernel release and target
- architecture. This option specifies the target architecture to be associated
- with subsequent -r options. The default architecture is the architecture of
- the host.
+ This option specifies the target architecture of the server and is
+ analogous to the -a option of 'stap'. See stap(1) for more details.
+ The default architecture is the architecture of the host.
2.3.3 -r kernel-release
- This option specifies a server for the given kernel release and the current
- target architecture (specified by a previous -a option, or the default). The
- arguments accepted by this option are the same as for stap itself. See stap(1)
- for more details.
-
-2.3.4 -i
+ This option specifies the target kernel release of the server an is
+ analogous to the -r option of 'stap'. See stap(1) for more details.
+ The default release is that of the currently running kernel.
+
+2.3.4 -u user-name
+ Each stap-server instance is normally run by the user name 'stap-server',
+ unless otherwise configured (see 3.2 Configuation Files). This option
+ specifies the user name used to run the server(s). The user name specified
+ must be a member of the group 'stap-server'.
+
+2.3.5 -I path
+ This option specifies an additional path to be searched by thes server for
+ tapsets and is analogous to the -I option of 'stap'. See stap(1) for more
+ details.
+
+2.3.6 -R path
+ This option specifies the location of the systemtap runtime to be user by the
+ server and is analogous to the -R option of 'stap'. See stap(1) for more
+ details.
+
+2.3.7 -B options
+ This option specifies options to be passed to 'make' when building systemtap
+ modules and is analogous to the -B option of 'stap'. See stap(1) for more
+ details.
+
+2.3.8 -i
This option is a shortcut which specifies one server for each kernel
- release installed in /lib/modules/. The default architecture is associated
- with these servers (i.e. previous -a has no effect).
+ release installed in /lib/modules/. Previous -I, -R, -B and -u options will be
+ applied to each server, however previous -a options are ignored and the default
+ architecture is used.
+
+2.3.9 -n nickname
+ This option allows the specification of a server configuration by nickname.
+ When -n is specified, a currently running server with the given nickname will
+ be searched for. If no currently running server with the given nickname is
+ found, a server configuration with the given nickname will be searched for in
+ /etc/stap-server/conf.d/*.conf. If a server configuration for the given
+ nickname is found, the -a, -r, -I, -R, -B and -u options for that server will
+ be used as if they were specified on the command line. If no configuration with
+ the given nickname is found, and the action is 'start' (or an action behaving
+ like 'start' (see below), the server will be started with the given nickname.
+ If no configuration with the given nickname is found, and the action is not
+ 'start' (or an action behaving" "like 'start', it is an error. If a nickname is
+ not specified for a server, its nickname will be its process id.
+
+2.3.10 -p pid
+ This option allows the specification of a server configuration by process id.
+ When -p is specified, a currently running server with the given process id will
+ be searched for. If no such server is found, it is an error. If a server with
+ the given procss id is found, the -a, -r, -I, -R, -B and -u options for that
+ server will be used as if they were specified on the command line.
3. Files
========
@@ -122,7 +163,7 @@ output is optional, because this service may start before syslog).
3.4 Status files
----------------
-/var/run/stap-server/<server_spec>
+/var/run/stap-server/<server_pid>
4. Configuration Format
=======================
@@ -156,7 +197,8 @@ variables.
4.2 Individual server configuration (/etc/stap-server/conf.d/*.conf)
--------------------------------------------------------------------
Each server configuration file configures a server to be started when no
-server is specified for the 'start' action.
+server is specified for the 'start' action. The configuration file is a
+bash script fragment. The following variables may be set.
4.2.1 ARCH
Specify the target architecture for this server. If ARCH is not set, the
@@ -166,6 +208,24 @@ server is specified for the 'start' action.
Specify the kernel release for this server. If RELEASE is not set, the release
of the kernel running on the host will be used.
+4.2.3 BUILD
+ Specify options to be passed to the 'make' process used to build kernel
+ modules.
+
+4.2.4 INCLUDE
+ Specify a list of directories to be searched by the server for tapsets.
+
+4.2.5 RUNTIME
+ Specify the directory which contains the systemtap runtime code to be used
+ by this server.
+
+4.2.6 USER
+ Specify the user name to be used to run this server. The specified user must
+ be a member of the group 'stap-server'.
+
+4.2.6 NICKNAME
+ Specify the nickname to be used to refer to this server.
+
4.3 Configuration Example
-------------------------
@@ -179,9 +239,15 @@ server is specified for the 'start' action.
--- file1.conf
ARCH=i386
RELEASE=2.6.18-128.el5
+ ---
+
--- file2.conf
- ARCH=powerpc
+ USER=serveruser
RELEASE=/kernels/2.6.18-92.1.18.el5/build
+ INCLUDE="/mytapsets /yourtapsets"
+ BUILD='VARIABLE1=VALUE1 VARIABLE2=VALUE2'
+ RUNTIME=/myruntime
+ NICKNAME=my-server
---
5. Usage Eamples
@@ -191,8 +257,7 @@ server is specified for the 'start' action.
------------------------
After installing the systemtap package, install the systemtap-server package.
# yum install systemtap-server
-This package will include the initscript, default configuration files and
-other files.
+This package will include the initscript and default configuration files.
5.2 Testing
-----------
@@ -238,7 +303,7 @@ After all test have passed, enable the stap-server initscript.
5.5 Managing Specific Servers
-----------------------------
-Specifying an architecture and/or release for all other actions will act on
+For all other actions, specifying a server configuration will act on
that server alone (if it is running). For example
# service stap-server status -r 2.6.18-128.el5
@@ -250,20 +315,25 @@ that server alone (if it is running). For example
5.6.1 Create Server Config Files
Each file in /etc/stap-server/conf.d/*.conf represents a server to be started
by default if no servers are specified on the 'start' action. Each such
- config file may set the ARCH and/or RELEASE variables which correspond to the
- -a and -r command line options respectively.
+ config file may set variables which correspond to the command line options.
# vi /etc/stap-server/conf.d/2.6.18-128.el5.conf
ARCH= # default arch
+ USER=serveruser
RELEASE=2.6.18-128.el5
+ NICKNAME=2.6.18-128.el5
# vi /etc/stap-server/conf.d/powerpc.conf
ARCH=powerpc
+ USER= # default user
RELEASE= #default release
+ NICKNAME=powerpc
# vi /etc/stap-server/conf.d/native.conf
ARCH= #default arch
+ USER= # default user
RELEASE= #default release
+ NICKNAME=native
5.6.2 Starting Default Servers
@@ -272,7 +342,7 @@ that server alone (if it is running). For example
5.6.2 Restarting After Changing the Configuration
To restart the service after global configuration changes and/or when default
- servers have been added to removed:
+ servers have been added, changed or removed:
# service stap-server force-reload
diff --git a/initscript/stap-server.in b/initscript/stap-server.in
index 69b43785..07595ec6 100644
--- a/initscript/stap-server.in
+++ b/initscript/stap-server.in
@@ -23,13 +23,11 @@ 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
@@ -39,26 +37,61 @@ 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 $"If -a is not specified, the default architecture is that of the host"
+ echo $"platform."
echo $""
- echo $"All options, except -c, may be specified more than once."
+ echo $"If -r is not specified, the default kernel release is that currently"
+ echo $"running on the host 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 -u is not specified, the default user is 'stap-server'"
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 $"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 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 -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 -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"
@@ -120,6 +153,10 @@ parse_args () { # arguments
OPT_SERVER_CMDS="$OPT_SERVER_CMDS ARCH='$2'"
shift 1
;;
+ -B)
+ OPT_SERVER_CMDS="$OPT_SERVER_CMDS BUILD='$2'"
+ shift 1
+ ;;
-c)
OPT_CONFIG_FILE=$2
shift 1
@@ -127,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
+ ;;
--)
;;
*)
@@ -141,6 +199,9 @@ 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
}
@@ -150,12 +211,56 @@ process_i () {
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
+
+ # 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
+}
+
# Process the -r flag.
process_r () {
local first_char=`expr "$1" : '\(.\).*'`
@@ -199,19 +304,57 @@ 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_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_SERVER_CMDS="$CONFIG_SERVER_CMDS ARCH='$ARCH' RELEASE='$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
}
@@ -229,11 +372,18 @@ stat_file () { # server-spec
}
default_server_cmds () {
- echo "RELEASE='`get_release`'"
+ echo "EXEC"
}
init_server_opts () {
ARCH=`get_arch`
+ RELEASE=`get_release`
+ BUILD=
+ INCLUDE=
+ NICKNAME=
+ NICKNAME_NOT_FOUND=
+ RUNTIME=
+ USER=$STAP_USER
}
server_still_running () { # PID
@@ -243,23 +393,56 @@ server_still_running () { # PID
return 1 # Not running
}
-get_server_pid () {
- local target_release="$RELEASE"
- local target_arch="$ARCH"
+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.
+ # 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 "$RELEASE" = "$target_release" || continue
- test "$ARCH" = "$target_arch" || continue
+ 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
- RELEASE="$target_release"
- ARCH="$target_arch"
+ 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 () {
@@ -277,6 +460,75 @@ managed_servers () {
echo "$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
@@ -299,38 +551,33 @@ start () { # server-cmds
local rc=0
local first=1
init_server_opts
+ local cmd
+ local prevCmd
for cmd in $server_cmds; do
- # Evaluate commands until the RELEASE= command is found.
- eval $cmd
- echo $cmd | grep -q ^RELEASE || continue
+ 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,
+ # then it is the nickname for this new configuration.
+ if test -n "$NICKNAME_NOT_FOUND"; then
+ NICKNAME="$NICKNAME_NOT_FOUND"
+ NICKNAME_NOT_FOUND=
+ fi
+ # Start the configured server
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?
- local server_pid=`get_server_pid`
- if test -n "$server_pid"; then
- if server_still_running $server_pid; then
- do_success $"$prog start for $RELEASE $ARCH"
- continue
- fi
- fi
-
- # Start the server here.
- local server_status_file=$STAT_PATH/`runuser -s /bin/bash - $STAP_USER \
- -c "$STAP_START_SERVER -r $RELEASE -a $ARCH --log=$LOG_FILE"`
- if [ $? != 0 ]; then
- rm -f $server_status_file
- do_failure $"$prog start: unable to start stap-server for $RELEASE $ARCH"
- rc=1
- continue
- fi
- echo "ARCH=$ARCH" > $server_status_file
- echo "RELEASE=$RELEASE" >> $server_status_file
+ start_server || rc=1
- do_success $"$prog start for $RELEASE $ARCH"
+ # Don't use the same nickname for the next server.
+ NICKNAME=
done
return $rc
@@ -343,13 +590,32 @@ stop () { # server-cmds
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
- # Evaluate commands until the RELEASE= command is found.
- eval $cmd
- echo $cmd | grep -q ^RELEASE || continue
+ 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
# Get the pid for this server, if it's running
- local server_pid=`get_server_pid`
+ local server_pid=`get_server_pid_by_config`
if test -n "$server_pid"; then
server_list="$server_list $server_pid"
continue
@@ -359,13 +625,9 @@ stop () { # server-cmds
test $first = 0 && echo
first=0
clog $"Stopping $prog for $RELEASE $ARCH: " -n
- do_success $"$prog stop for $release_arch"
+ do_success $"$prog stop `echo_server_options`"
done
- fi
- if [ -z "$server_list" ]; then
- # If there was a non-existent server specified, then we're done
- test $first = 0 && return 0
-
+ else
server_list=`managed_servers`
if [ -z "$server_list" ]; then
clog $"Stopping $prog: " -n
@@ -386,16 +648,16 @@ stop () { # server-cmds
local this_rc=0
if server_still_running $pid; then
- runuser -s /bin/bash - $STAP_USER -c "$STAP_STOP_SERVER $pid"
+ runuser -s /bin/bash - $USER -c "$STAP_STOP_SERVER $pid"
if [ $? != 0 ]; then
- do_failure $"$prog stop: unable to stop 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 $STAT_PATH/$pid
- do_success $"$prog stop for $RELEASE $ARCH"
+ do_success $"$prog stop `echo_server_options`"
fi
done
@@ -412,23 +674,39 @@ status () { # server-list
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
- # Evaluate commands until the RELEASE= command is found.
- eval $cmd
- echo $cmd | grep -q ^RELEASE || continue
+ 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
# Get the pid for this server, if it's running
- local server_pid=`get_server_pid`
+ 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 for $RELEASE $ARCH is not running"
+ echo "stap-server `echo_server_options`"
rc=3
done
- fi
- if [ -z "$server_list" ]; then
+ else
server_list=`managed_servers`
if [ -z "$server_list" ]; then
echo "No managed stap-server is running"
@@ -441,11 +719,11 @@ status () { # server-list
for pid in $server_list; do
. $STAT_PATH/$pid
if ! server_still_running $pid; then
- echo "stap-server for $RELEASE $ARCH started as PID $pid is no longer running"
+ echo "stap-server `echo_server_options` started as PID $pid is no longer running"
rc=1
continue
fi
- echo "stap-server for $RELEASE $ARCH running as PID $pid"
+ echo "stap-server `echo_server_options` running as PID $pid"
done
return $rc
@@ -460,7 +738,7 @@ function restart () { # server-cmds
local pid
for pid in $server_list; do
. $STAT_PATH/$pid
- server_cmds="$server_cmds ARCH='$ARCH' RELEASE='$RELEASE'"
+ server_cmds="$server_cmds `echo_server_commands` EXEC"
done
fi
@@ -488,7 +766,7 @@ function condrestart () { # server-list
local pid
for pid in $server_list; do
. $STAT_PATH/$pid
- server_cmds="$server_cmds ARCH='$ARCH' RELEASE='$RELEASE'"
+ server_cmds="$server_cmds `echo_server_commands` EXEC"
done
# No server specified or running?
if [ -z "$server_cmds" ]; then
@@ -504,10 +782,12 @@ function condrestart () { # server-list
local server_cmd=
local cmd
for cmd in $server_cmds; do
- # Collect commands until the RELEASE= command is found.
+ # Execute and collect commands until the EXEC command is found.
server_cmd="$server_cmd $cmd"
- eval $cmd
- echo $cmd | grep -q ^RELEASE || continue
+ if test "$cmd" != "EXEC"; then
+ eval_server_command $cmd
+ continue
+ fi
test $first = 0 && echo
first=0
@@ -515,7 +795,7 @@ function condrestart () { # server-list
# 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 for $RELEASE $ARCH is not running"
+ do_success "$prog `echo_server_options` is not running"
server_cmd=
continue
fi
@@ -545,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"