| #!/bin/bash | |
| ### BEGIN INIT INFO | |
| # Provides: srptools | |
| # Required-Start: $remote_fs $syslog | |
| # Required-Stop: $remote_fs $syslog | |
| # Default-Start: 2 3 4 5 | |
| # Default-Stop: 0 1 6 | |
| # Short-Description: Discovers SRP scsi targets. | |
| # Description: Discovers SRP scsi over infiniband targets. | |
| ### END INIT INFO | |
| DAEMON=/usr/sbin/srp_daemon | |
| IBDIR=/sys/class/infiniband | |
| PORTS="" | |
| RETRIES="" | |
| RETRIES_DEFAULT=60 | |
| LOG="" | |
| LOG_DEFAULT=/var/log/srp_daemon.log | |
| [ -x $DAEMON ] || exit 0 | |
| . /lib/lsb/init-functions | |
| [ -f /etc/default/srptools ] && . /etc/default/srptools | |
| max() { | |
| echo $(($1 > $2 ? $1 : $2)) | |
| } | |
| run_daemon() { | |
| # srp does not background itself; using the start-stop-daemon background | |
| # function causes us to lose stdout, which is where it logs to | |
| nohup start-stop-daemon --start --quiet -m \ | |
| --pidfile "/var/run/srp_daemon.${HCA_ID}.${PORT}" \ | |
| --exec $DAEMON -- -e -c -n \ | |
| -i "${HCA_ID}" -p "${PORT}" -R "${RETRIES:-${RETRIES_DEFAULT}}" \ | |
| >> "${LOG:-${LOG_DEFAULT}}" 2>&1 & | |
| RETVAL=$(max "$RETVAL" $?) | |
| } | |
| # Evaluate shell command $1 for every port in $PORTS | |
| for_all_ports() { | |
| local cmd=$1 p | |
| if [ "$PORTS" = "ALL" ]; then | |
| for p in ${IBDIR}/*/ports/*; do | |
| [ -e "$p" ] || continue | |
| PORT=$(basename "$p") | |
| HCA_ID=$(basename "$(dirname "$(dirname "$p")")") | |
| eval "$cmd" | |
| done | |
| else | |
| for ADAPTER in $PORTS; do | |
| HCA_ID=${ADAPTER%%:*} | |
| PORT=${ADAPTER#${HCA_ID}:} | |
| [ -n "$HCA_ID" ] && [ -n "$PORT" ] && eval "$cmd" | |
| done | |
| fi | |
| } | |
| start_daemon() { | |
| local RETVAL=0 | |
| if [ "$PORTS" = "NONE" ] ; then | |
| echo "srptools disabled." | |
| exit 0 | |
| fi | |
| for_all_ports run_daemon | |
| case $RETVAL in | |
| 0) log_success_msg "started $DAEMON";; | |
| *) log_failure_msg "failed to start $DAEMON";; | |
| esac | |
| return $RETVAL | |
| } | |
| stop_daemon() { | |
| local RETVAL=0 PORTS=ALL | |
| for_all_ports 'start-stop-daemon --stop --quiet --oknodo -m --pidfile "/var/run/srp_daemon.${HCA_ID}.${PORT}"; RETVAL=$(max $RETVAL $?)' | |
| case $RETVAL in | |
| 0) log_success_msg "stopped $DAEMON";; | |
| *) log_failure_msg "failed to stop $DAEMON";; | |
| esac | |
| return $RETVAL | |
| } | |
| check_status() { | |
| local pidfile=$1 pid | |
| [ -e "$pidfile" ] || return 3 # not running | |
| pid=$(<"$pidfile") | |
| [ -n "$pid" ] || return 3 # not running | |
| [ -d "/proc/$pid" ] || return 1 # not running and pid file exists | |
| return 0 # running | |
| } | |
| daemon_status() { | |
| local RETVAL=0 | |
| for_all_ports 'check_status /var/run/srp_daemon.${HCA_ID}.${PORT} $DAEMON; RETVAL=$(max $RETVAL $?)' | |
| case $RETVAL in | |
| 0) log_success_msg "$DAEMON is running";; | |
| *) log_failure_msg "$DAEMON is not running";; | |
| esac | |
| return $RETVAL | |
| } | |
| case "$1" in | |
| start) | |
| start_daemon | |
| ;; | |
| stop) | |
| stop_daemon | |
| ;; | |
| status) | |
| daemon_status | |
| ;; | |
| restart | reload | force-reload ) | |
| stop_daemon | |
| start_daemon | |
| ;; | |
| esac |