|
Packit |
13e616 |
#!/bin/bash
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# Bring up/down opensm
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# chkconfig: - 15 85
|
|
Packit |
13e616 |
# description: Activates/Deactivates InfiniBand Subnet Manager
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
### BEGIN INIT INFO
|
|
Packit |
13e616 |
# Provides: opensm
|
|
Packit |
13e616 |
# Required-Start: $syslog @RDMA_SERVICE@
|
|
Packit |
13e616 |
# Required-Stop: $syslog @RDMA_SERVICE@
|
|
Packit |
13e616 |
# Default-Start: @DEFAULT_START@
|
|
Packit |
13e616 |
# Default-Stop: @DEFAULT_STOP@
|
|
Packit |
13e616 |
# Description: Manage OpenSM
|
|
Packit |
13e616 |
### END INIT INFO
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# Copyright (c) 2008 Voltaire, Inc. All rights reserved.
|
|
Packit |
13e616 |
# Copyright (c) 2006 Mellanox Technologies. All rights reserved.
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# This Software is licensed under one of the following licenses:
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# 1) under the terms of the "Common Public License 1.0" a copy of which is
|
|
Packit |
13e616 |
# available from the Open Source Initiative, see
|
|
Packit |
13e616 |
# http://www.opensource.org/licenses/cpl.php.
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# 2) under the terms of the "The BSD License" a copy of which is
|
|
Packit |
13e616 |
# available from the Open Source Initiative, see
|
|
Packit |
13e616 |
# http://www.opensource.org/licenses/bsd-license.php.
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# 3) under the terms of the "GNU General Public License (GPL) Version 2" a
|
|
Packit |
13e616 |
# copy of which is available from the Open Source Initiative, see
|
|
Packit |
13e616 |
# http://www.opensource.org/licenses/gpl-license.php.
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# Licensee has the right to choose one of the above licenses.
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# Redistributions of source code must retain the above copyright
|
|
Packit |
13e616 |
# notice and one of the license notices.
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# Redistributions in binary form must reproduce both the above copyright
|
|
Packit |
13e616 |
# notice, one of the license notices in the documentation
|
|
Packit |
13e616 |
# and/or other materials provided with the distribution.
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# $Id: openib-1.0-opensm.init,v 1.5 2006/08/02 18:18:23 dledford Exp $
|
|
Packit |
13e616 |
#
|
|
Packit |
13e616 |
# processname: @sbindir@/opensm
|
|
Packit |
13e616 |
# config: @sysconfdir@/sysconfig/opensm
|
|
Packit |
13e616 |
# pidfile: /var/run/opensm.pid
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
prefix=@prefix@
|
|
Packit |
13e616 |
exec_prefix=@exec_prefix@
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
. /etc/rc.d/init.d/functions
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
CONFIG=@sysconfdir@/sysconfig/opensm
|
|
Packit |
13e616 |
if [ -f $CONFIG ]; then
|
|
Packit |
13e616 |
. $CONFIG
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
prog=@sbindir@/opensm
|
|
Packit |
13e616 |
bin=${prog##*/}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
# Handover daemon for updating guid2lid cache file
|
|
Packit |
13e616 |
sldd_prog=@sbindir@/sldd.sh
|
|
Packit |
13e616 |
sldd_bin=${sldd_prog##*/}
|
|
Packit |
13e616 |
sldd_pid_file=/var/run/sldd.pid
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
ACTION=$1
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
# Setting OpenSM start parameters
|
|
Packit |
13e616 |
PID_FILE=/var/run/${bin}.pid
|
|
Packit |
13e616 |
touch $PID_FILE
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [[ -n "${OSM_HOSTS}" && $(echo -n ${OSM_HOSTS} | wc -w | tr -d '[:space:]') -gt 1 ]]; then
|
|
Packit |
13e616 |
HONORE_GUID2LID="--honor_guid2lid"
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#########################################################################
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
start_sldd()
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if [ -f $sldd_pid_file ]; then
|
|
Packit |
13e616 |
local line p
|
|
Packit |
13e616 |
read line < $sldd_pid_file
|
|
Packit |
13e616 |
for p in $line ; do
|
|
Packit |
13e616 |
[ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && sldd_pid="$sldd_pid $p"
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -z "$sldd_pid" ]; then
|
|
Packit |
13e616 |
sldd_pid=`pidof -x $sldd_bin`
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -n "${sldd_pid:-}" ] ; then
|
|
Packit |
13e616 |
kill -9 ${sldd_pid} > /dev/null 2>&1
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
$sldd_prog > /dev/null 2>&1 &
|
|
Packit |
13e616 |
sldd_pid=$!
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
echo ${sldd_pid} > $sldd_pid_file
|
|
Packit |
13e616 |
# Sleep is needed in order to update local gid2lid cache file before running opensm
|
|
Packit |
13e616 |
sleep 3
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
stop_sldd()
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if [ -f $sldd_pid_file ]; then
|
|
Packit |
13e616 |
local line p
|
|
Packit |
13e616 |
read line < $sldd_pid_file
|
|
Packit |
13e616 |
for p in $line ; do
|
|
Packit |
13e616 |
[ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && sldd_pid="$sldd_pid $p"
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -z "$sldd_pid" ]; then
|
|
Packit |
13e616 |
sldd_pid=`pidof -x $sldd_bin`
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -n "${sldd_pid:-}" ] ; then
|
|
Packit |
13e616 |
kill -15 ${sldd_pid} > /dev/null 2>&1
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
start()
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
local OSM_PID=
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
pid=""
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -f $PID_FILE ]; then
|
|
Packit |
13e616 |
local line p
|
|
Packit |
13e616 |
read line < $PID_FILE
|
|
Packit |
13e616 |
for p in $line ; do
|
|
Packit |
13e616 |
[ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p"
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -z "$pid" ]; then
|
|
Packit |
13e616 |
pid=`pidof -o $$ -o $PPID -o %PPID -x $bin`
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -n "${pid:-}" ] ; then
|
|
Packit |
13e616 |
echo $"${bin} (pid $pid) is already running..."
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -n "${HONORE_GUID2LID}" ]; then
|
|
Packit |
13e616 |
# Run sldd daemod
|
|
Packit |
13e616 |
start_sldd
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
# Start opensm
|
|
Packit |
13e616 |
echo -n "Starting IB Subnet Manager"
|
|
Packit |
13e616 |
$prog --daemon ${HONORE_GUID2LID} ${OPTIONS} > /dev/null
|
|
Packit |
13e616 |
cnt=0; alive=0
|
|
Packit |
13e616 |
while [ $cnt -lt 6 -a $alive -ne 1 ]; do
|
|
Packit |
13e616 |
echo -n ".";
|
|
Packit |
13e616 |
sleep 1
|
|
Packit |
13e616 |
alive=0
|
|
Packit |
13e616 |
OSM_PID=`pidof $prog`
|
|
Packit |
13e616 |
if [ "$OSM_PID" != "" ]; then
|
|
Packit |
13e616 |
alive=1
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
let cnt++;
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
echo $OSM_PID > $PID_FILE
|
|
Packit |
13e616 |
checkpid $OSM_PID
|
|
Packit |
13e616 |
RC=$?
|
|
Packit |
13e616 |
[ $RC -eq 0 ] && echo_success || echo_failure
|
|
Packit |
13e616 |
[ $RC -eq 0 ] && touch /var/lock/subsys/opensm
|
|
Packit |
13e616 |
echo
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
return $RC
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
stop()
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
local pid=
|
|
Packit |
13e616 |
local pid1=
|
|
Packit |
13e616 |
local pid2=
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
# Stop sldd daemon
|
|
Packit |
13e616 |
stop_sldd
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -f $PID_FILE ]; then
|
|
Packit |
13e616 |
local line p
|
|
Packit |
13e616 |
read line < $PID_FILE
|
|
Packit |
13e616 |
for p in $line ; do
|
|
Packit |
13e616 |
[ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid1="$pid1 $p"
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
pid2=`pidof -o $$ -o $PPID -o %PPID -x $bin`
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
pid=`echo "$pid1 $pid2" | sed -e 's/\ /\n/g' | sort -n | uniq | sed -e 's/\n/\ /g'`
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if [ -n "${pid:-}" ] ; then
|
|
Packit |
13e616 |
# Kill opensm
|
|
Packit |
13e616 |
echo -n "Stopping IB Subnet Manager."
|
|
Packit |
13e616 |
kill -15 $pid > /dev/null 2>&1
|
|
Packit |
13e616 |
cnt=0; alive=1
|
|
Packit |
13e616 |
while [ $cnt -lt 6 -a $alive -ne 0 ]; do
|
|
Packit |
13e616 |
echo -n ".";
|
|
Packit |
13e616 |
alive=0
|
|
Packit |
13e616 |
for p in $pid; do
|
|
Packit |
13e616 |
if checkpid $p ; then alive=1; echo -n "-"; fi
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
let cnt++;
|
|
Packit |
13e616 |
sleep $alive
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for p in $pid
|
|
Packit |
13e616 |
do
|
|
Packit |
13e616 |
while checkpid $p ; do
|
|
Packit |
13e616 |
kill -KILL $p > /dev/null 2>&1
|
|
Packit |
13e616 |
echo -n "+"
|
|
Packit |
13e616 |
sleep 1
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
done
|
|
Packit |
13e616 |
checkpid $pid
|
|
Packit |
13e616 |
RC=$?
|
|
Packit |
13e616 |
[ $RC -eq 0 ] && echo_failure || echo_success
|
|
Packit |
13e616 |
echo
|
|
Packit |
13e616 |
RC=$((! $RC))
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
echo -n "Stopping IB Subnet Manager."
|
|
Packit |
13e616 |
echo_failure
|
|
Packit |
13e616 |
echo
|
|
Packit |
13e616 |
RC=1
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
# Remove pid file if any.
|
|
Packit |
13e616 |
rm -f $PID_FILE
|
|
Packit |
13e616 |
rm -f /var/lock/subsys/opensm
|
|
Packit |
13e616 |
return $RC
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
status()
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
local pid
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
# First try "pidof"
|
|
Packit |
13e616 |
pid=`pidof -o $$ -o $PPID -o %PPID -x ${bin}`
|
|
Packit |
13e616 |
if [ -n "$pid" ]; then
|
|
Packit |
13e616 |
echo $"${bin} (pid $pid) is running..."
|
|
Packit |
13e616 |
return 0
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
# Next try "/var/run/opensm.pid" files
|
|
Packit |
13e616 |
if [ -f $PID_FILE ] ; then
|
|
Packit |
13e616 |
read pid < $PID_FILE
|
|
Packit |
13e616 |
if [ -n "$pid" ]; then
|
|
Packit |
13e616 |
echo $"${bin} dead but pid file $PID_FILE exists"
|
|
Packit |
13e616 |
return 1
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
echo $"${bin} is stopped"
|
|
Packit |
13e616 |
return 3
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
case $ACTION in
|
|
Packit |
13e616 |
start)
|
|
Packit |
13e616 |
start
|
|
Packit |
13e616 |
;;
|
|
Packit |
13e616 |
stop)
|
|
Packit |
13e616 |
stop
|
|
Packit |
13e616 |
;;
|
|
Packit |
13e616 |
restart)
|
|
Packit |
13e616 |
stop
|
|
Packit |
13e616 |
start
|
|
Packit |
13e616 |
;;
|
|
Packit |
13e616 |
status)
|
|
Packit |
13e616 |
status
|
|
Packit |
13e616 |
;;
|
|
Packit |
13e616 |
condrestart)
|
|
Packit |
13e616 |
pid=`pidof -o $$ -o $PPID -o %PPID -x $bin`
|
|
Packit |
13e616 |
if [ -n "$pid" ]; then
|
|
Packit |
13e616 |
stop
|
|
Packit |
13e616 |
sleep 1
|
|
Packit |
13e616 |
start
|
|
Packit |
13e616 |
fi
|
|
Packit |
13e616 |
;;
|
|
Packit |
13e616 |
*)
|
|
Packit |
13e616 |
echo
|
|
Packit |
13e616 |
echo "Usage: `basename $0` {start|stop|restart|status}"
|
|
Packit |
13e616 |
echo
|
|
Packit |
13e616 |
exit 1
|
|
Packit |
13e616 |
;;
|
|
Packit |
13e616 |
esac
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
RC=$?
|
|
Packit |
13e616 |
exit $RC
|