From eabfcd432ee95d9f39bb98dfd144ca5833593dd9 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 14 May 2009 13:19:58 -0700 Subject: [PATCH] Move ovs-monitor script from vswitchext to openvswitch. --- debian/.gitignore | 5 - debian/control.in | 9 ++ debian/openvswitch-monitor.default | 27 +++++ debian/openvswitch-monitor.dirs | 1 + debian/openvswitch-monitor.init | 174 +++++++++++++++++++++++++++++ debian/openvswitch-monitor.install | 1 + utilities/automake.mk | 1 + utilities/ovs-monitor | 128 +++++++++++++++++++++ 8 files changed, 341 insertions(+), 5 deletions(-) create mode 100644 debian/openvswitch-monitor.default create mode 100644 debian/openvswitch-monitor.dirs create mode 100755 debian/openvswitch-monitor.init create mode 100644 debian/openvswitch-monitor.install create mode 100755 utilities/ovs-monitor diff --git a/debian/.gitignore b/debian/.gitignore index d2667a5a..6eae253c 100644 --- a/debian/.gitignore +++ b/debian/.gitignore @@ -12,11 +12,6 @@ /openvswitch-datapath-source /openvswitch-dbg /openvswitch-monitor -/openvswitch-monitor.copyright -/openvswitch-monitor.default -/openvswitch-monitor.dirs -/openvswitch-monitor.init -/openvswitch-monitor.install /openvswitch-pki /openvswitch-pki-server /openvswitch-switch diff --git a/debian/control.in b/debian/control.in index fc773f53..81a68308 100644 --- a/debian/control.in +++ b/debian/control.in @@ -112,3 +112,12 @@ Description: Debug symbols for OpenVSwitch packages packages. Install it to debug one of them or to examine a core dump produced by one of them. +Package: openvswitch-monitor +Architecture: any +Recommends: openvswitch-switch +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Monitor utility for OpenVSwitch switches + The ovs-monitor utility included in this package monitors the secure + channel and datapath. If either become unresponsive, the switch is + rebooted. + diff --git a/debian/openvswitch-monitor.default b/debian/openvswitch-monitor.default new file mode 100644 index 00000000..62f20ba9 --- /dev/null +++ b/debian/openvswitch-monitor.default @@ -0,0 +1,27 @@ +# This is a POSIX shell fragment -*- sh -*- + +# To configure the OpenVSwitch monitor package, modify the following. +# Afterward, the monitor will be configured automatically at boot time. +# It can be started immediately with +# /etc/init.d/openvswitch-monitor start + +# Defaults for initscript +# sourced by /etc/init.d/openvswitch-monitor +# installed at /etc/default/openvswitch-monitor by the maintainer scripts + +# THRESHOLD: The number of failed attempts the monitor should make until +# it reboots the system. A value of zero disables the monitor. +THRESHOLD=3 + +# INTERVAL: The number of seconds to wait between probing secchan and +# the datapath. +INTERVAL=1 + +# LOG_FILE: File to log messages related to monitoring. +LOG_FILE="/var/log/openvswitch/monitor" + +# SWITCH_VCONN: The vconn used to connect to the switch (secchan). +# The secchan must be configured to listen to this vconn. The default +# here set is also listened to by default by the openvswitch-switch +# package, so ordinarily there is no need to modify this. +SWITCH_VCONN="/var/run/secchan.mgmt" diff --git a/debian/openvswitch-monitor.dirs b/debian/openvswitch-monitor.dirs new file mode 100644 index 00000000..236670a2 --- /dev/null +++ b/debian/openvswitch-monitor.dirs @@ -0,0 +1 @@ +usr/sbin diff --git a/debian/openvswitch-monitor.init b/debian/openvswitch-monitor.init new file mode 100755 index 00000000..6e363471 --- /dev/null +++ b/debian/openvswitch-monitor.init @@ -0,0 +1,174 @@ +#!/bin/sh +# +# Example init.d script with LSB support. +# +# Please read this init.d carefully and modify the sections to +# adjust it to the program you want to run. +# +# Copyright (c) 2007, 2009 Javier Fernandez-Sanguino +# +# This is free software; you may redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2, +# or (at your option) any later version. +# +# This is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License with +# the Debian operating system, in /usr/share/common-licenses/GPL; if +# not, write to the Free Software Foundation, Inc., 59 Temple Place, +# Suite 330, Boston, MA 02111-1307 USA +# +### BEGIN INIT INFO +# Provides: openvswitch-monitor +# Required-Start: $network $local_fs +# Required-Stop: +# Should-Start: $named $syslog openvswitch-switch +# Should-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: OpenVSwitch switch monitor +### END INIT INFO + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +DAEMON=/usr/sbin/ovs-monitor +NAME=openvswitch-monitor +DESC="OpenVSwitch switch monitor" + +PIDFILE=/var/run/$NAME.pid + +test -x $DAEMON || exit 0 + +. /lib/lsb/init-functions + +# Default options, these can be overriden by the information +# at /etc/default/$NAME +DAEMON_OPTS="" # Additional options given to the daemon + +DODTIME=10 # Time to wait for the daemon to die, in seconds + # If this value is set too low you might not + # let some daemons to die gracefully and + # 'restart' will not work + +# Include defaults if available +if [ -f /etc/default/$NAME ] ; then + . /etc/default/$NAME +fi + +set -e + +running_pid() { +# Check if a given process pid's cmdline matches a given name + pid=$1 + name=$2 + [ -z "$pid" ] && return 1 + [ ! -d /proc/$pid ] && return 1 + return 0 +} + +running() { +# Check if the process is running looking at /proc +# (works for all users) + + # No pidfile, probably no daemon present + [ ! -f "$PIDFILE" ] && return 1 + pid=`cat $PIDFILE` + running_pid $pid $DAEMON || return 1 + return 0 +} + +start_daemon() { +# Start the process using the wrapper + if test $THRESHOLD != 0; then + start-stop-daemon --start --quiet -m --background --pidfile $PIDFILE \ + --exec $DAEMON -- -c $THRESHOLD -i $INTERVAL -l $LOG_FILE \ + -s $SWITCH_VCONN $DAEMON_OPTS + fi + + # Wait up to 3 seconds for the daemon to start. + for i in 1 2 3; do + if running; then + break + fi + sleep 1 + done +} + +stop_daemon() { + start-stop-daemon -o --stop --pidfile $PIDFILE + rm $PIDFILE +} + +case "$1" in + start) + log_daemon_msg "Starting $DESC " "$NAME" + # Check if it's running first + if running ; then + log_progress_msg "apparently already running" + log_end_msg 0 + exit 0 + fi + if start_daemon && running ; then + # It's ok, the daemon started and is running + log_end_msg 0 + else + # Either we could not start it or it is not running + # after we did + # NOTE: Some daemons might die some time after they start, + # this code does not try to detect this and might give + # a false positive (use 'status' for that) + log_end_msg 1 + fi + ;; + stop) + log_daemon_msg "Stopping $DESC" "$NAME" + if running ; then + # Only stop the daemon if we see it running + stop_daemon + log_end_msg $? + else + # If it's not running don't do anything + log_progress_msg "apparently not running" + log_end_msg 0 + exit 0 + fi + ;; + restart|force-reload) + log_daemon_msg "Restarting $DESC" "$NAME" + if running ; then + stop_daemon + # Wait some sensible amount, some daemons need this + [ -n "$DIETIME" ] && sleep $DIETIME + fi + start_daemon + running + log_end_msg $? + ;; + status) + log_daemon_msg "Checking status of $DESC" "$NAME" + if running ; then + log_progress_msg "running" + log_end_msg 0 + else + log_progress_msg "apparently not running" + log_end_msg 1 + exit 1 + fi + ;; + # Use this if the daemon cannot reload + reload) + log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon" + log_warning_msg "cannot re-read the config file (use restart)." + ;; + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload|status}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/debian/openvswitch-monitor.install b/debian/openvswitch-monitor.install new file mode 100644 index 00000000..9fc601a8 --- /dev/null +++ b/debian/openvswitch-monitor.install @@ -0,0 +1 @@ +utilities/ovs-monitor usr/sbin diff --git a/utilities/automake.mk b/utilities/automake.mk index 45d694c9..b91a604e 100644 --- a/utilities/automake.mk +++ b/utilities/automake.mk @@ -7,6 +7,7 @@ bin_PROGRAMS += \ noinst_PROGRAMS += utilities/nlmon bin_SCRIPTS += utilities/ovs-pki noinst_SCRIPTS += utilities/ovs-pki-cgi utilities/ovs-parse-leaks +dist_sbin_SCRIPTS += utilities/ovs-monitor EXTRA_DIST += \ utilities/cfg-mod.8.in \ diff --git a/utilities/ovs-monitor b/utilities/ovs-monitor new file mode 100755 index 00000000..07a56c33 --- /dev/null +++ b/utilities/ovs-monitor @@ -0,0 +1,128 @@ +#!/bin/sh + +# Copyright (C) 2008, 2009 Nicira Networks, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +SECCHAN_PID=/var/run/secchan.pid +SECCHAN_SOCK=/var/run/secchan.mgmt +LOG_FILE=/var/log/openflow/monitor +INTERVAL=1 +FAIL_THRESH=3 + +usage() { + echo usage: $0 options + echo + echo "OPTIONS:" + echo " -h Show this message" + echo " -p PID file for secchan (default: $SECCHAN_PID)" + echo " -s Unix socket for secchan (default: $SECCHAN_SOCK)" + echo " -l File to log messages (default: $LOG_FILE)" + echo " -i Interval to send probes in seconds (default: $INTERVAL)" + echo " -c Number of failed probes before reboot (default: $FAIL_THRESH)" +} + +log() { + echo `date +"%b %d %X"`:$1 + echo `date +"%b %d %X"`:$1 >> $LOG_FILE +} + + +while getopts "hp:s:l:i:c:" OPTION; do + case $OPTION in + h) + usage + exit 1 + ;; + + p) + SECCHAN_PID=$OPTARG + ;; + + s) + SECCHAN_SOCK=$OPTARG + ;; + + l) + LOG_FILE=$OPTARG + ;; + + i) + INTERVAL=$OPTARG + ;; + + c) + FAIL_THRESH=$OPTARG + ;; + + *) + echo "Unknown option: ${OPTION}" + esac +done + + +if [ ! -f $SECCHAN_PID ]; then + log "No secchan pid file: ${SECCHAN_PID}" + echo "No secchan pid file: ${SECCHAN_PID}" +fi + +if [ ! -S $SECCHAN_SOCK ]; then + log "No secchan sock file: ${SECCHAN_SOCK}" + echo "No secchan sock file: ${SECCHAN_SOCK}" +fi + +if [ ! -d `dirname $LOG_FILE` ]; then + mkdir -p `dirname $LOG_FILE` +fi + +let DP_DOWN=0 +let SECCHAN_DOWN=0 +log "===== Starting Monitor ====" +while `/bin/true`; do + # Only check for liveness if the secchan's PID file exists. The PID + # file is removed when secchan is brought down gracefully. + if [ -f $SECCHAN_PID ]; then + pid=`cat $SECCHAN_PID` + if [ -d /proc/$pid ]; then + # Check if the secchan and datapath still can communicate + if [ -S $SECCHAN_SOCK ]; then + dpctl probe -t 2 unix:$SECCHAN_SOCK + if [ $? -ne 0 ]; then + log "datapath probe failed" + let DP_DOWN++ + else + let DP_DOWN=0 + fi + fi + let SECCHAN_DOWN=0 + else + log "secchan probe failed" + let SECCHAN_DOWN++ + fi + fi + + if [ $SECCHAN_DOWN -ge $FAIL_THRESH ]; then + log "Failed to probe secchan after ${SECCHAN_DOWN} tries...rebooting!" + reboot + fi + + if [ $DP_DOWN -ge $FAIL_THRESH ]; then + log "Failed to probe datapath after ${DP_DOWN} tries...rebooting!" + reboot + fi + + sleep $INTERVAL +done -- 2.30.2