X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=utilities%2Fovs-lib.in;h=7cde6e4267b612e88129b7b25de97326bf1534a9;hb=e91b927d8966bfcb9768225392324dde4fd7d7f6;hp=f53d4afdd02e55328853b1989fa8c5d60d2dbcef;hpb=d422c1189901d34125cd2d46552391c333d1f647;p=cascardo%2Fovs.git diff --git a/utilities/ovs-lib.in b/utilities/ovs-lib.in index f53d4afdd..7cde6e426 100644 --- a/utilities/ovs-lib.in +++ b/utilities/ovs-lib.in @@ -1,7 +1,7 @@ # This is a shell function library sourced by some Open vSwitch scripts. # It is not intended to be invoked on its own. -# Copyright (C) 2009, 2010, 2011 Nicira Networks, Inc. +# Copyright (C) 2009, 2010, 2011, 2012 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -28,11 +28,49 @@ datadir=${OVS_PKGDATADIR-'@pkgdatadir@'} # /usr/share/openvswitch bindir=${OVS_BINDIR-'@bindir@'} # /usr/bin sbindir=${OVS_SBINDIR-'@sbindir@'} # /usr/sbin +# /etc/openvswitch or /var/lib/openvswitch +if test X"$OVS_DBDIR" != X; then + dbdir=$OVS_DBDIR +elif test X"$OVS_SYSCONFDIR" != X; then + dbdir=$OVS_SYSCONFDIR/openvswitch +else + dbdir='@DBDIR@' +fi + +ovs_ctl_log () { + echo "$@" >> "${logdir}/ovs-ctl.log" +} + +ovs_ctl () { + case "$@" in + *"=strace"*) + # In case of running the daemon with strace, piping the o/p causes + # the script to block (strace probably does not close the inherited + # pipe). So, do not log the o/p to ovs-ctl.log. + "${datadir}/scripts/ovs-ctl" "$@" + ;; + "status") + # In case of the command 'status', we should return the exit status + # of ovs-ctl. It is also useful to document the o/p in ovs-ctl.log. + display=`"${datadir}/scripts/ovs-ctl" "$@" 2>&1` + rc=$? + if test -w "${logdir}/ovs-ctl.log"; then + echo "${display}" | tee -a "${logdir}/ovs-ctl.log" + else + echo "${display}" + fi + return ${rc} + ;; + *) + echo "`date -u`:$@" >> "${logdir}/ovs-ctl.log" + "${datadir}/scripts/ovs-ctl" "$@" 2>&1 | tee -a "${logdir}/ovs-ctl.log" + ;; + esac +} + VERSION='@VERSION@' -case @BUILDNR@ in - [1-9]*) BUILDNR='+build@BUILDNR@' ;; - *) BUILDNR= ;; -esac + +DAEMON_CWD=/ LC_ALL=C; export LC_ALL @@ -90,10 +128,16 @@ pid_exists () { test -d /proc/"$1" } +pid_comm_check () { + [ "$1" = "`cat /proc/$2/comm`" ] +} + start_daemon () { priority=$1 - shift + wrapper=$2 + shift; shift daemon=$1 + strace="" # drop core files in a sensible place test -d "$DAEMON_CWD" || install -d -m 755 -o root -g root "$DAEMON_CWD" @@ -109,19 +153,59 @@ start_daemon () { set "$@" --pidfile="$rundir/$daemon.pid" set "$@" --detach --monitor + # wrapper + case $wrapper in + valgrind) + if (valgrind --version) > /dev/null 2>&1; then + set valgrind -q --leak-check=full --time-stamp=yes \ + --log-file="$logdir/$daemon.valgrind.log.%p" "$@" + else + log_failure_msg "valgrind not installed, running $daemon without it" + fi + ;; + strace) + if (strace -V) > /dev/null 2>&1; then + strace="strace -tt -T -s 256 -ff" + if (strace -DV) > /dev/null 2>&1; then + # Has the -D option. + set $strace -D -o "$logdir/$daemon.strace.log" "$@" + strace="" + fi + else + log_failure_msg "strace not installed, running $daemon without it" + fi + ;; + glibc) + set env MALLOC_CHECK_=2 MALLOC_PERTURB_=165 "$@" + ;; + '') + ;; + *) + log_failure_msg "unknown wrapper $wrapper, running $daemon without it" + ;; + esac + # priority if test X"$priority" != X; then set nice -n "$priority" "$@" fi action "Starting $daemon" "$@" + + if test X"$strace" != X; then + # Strace doesn't have the -D option so we attach after the fact. + setsid $strace -o "$logdir/$daemon.strace.log" \ + -p `cat $rundir/$daemon.pid` > /dev/null 2>&1 & + fi } -DAEMON_CWD=/ stop_daemon () { if test -e "$rundir/$1.pid"; then if pid=`cat "$rundir/$1.pid"`; then - for action in TERM .1 .25 .65 1 1 1 1 KILL 1 1 1 1 FAIL; do + for action in TERM .1 .25 .65 1 1 1 1 KILL 1 1 1 2 10 15 30 FAIL; do + if pid_exists "$pid" >/dev/null 2>&1; then :; else + return 0 + fi case $action in TERM) action "Killing $1 ($pid)" kill $pid @@ -134,11 +218,7 @@ stop_daemon () { return 1 ;; *) - if pid_exists $pid >/dev/null 2>&1; then - sleep $action - else - return 0 - fi + sleep $action ;; esac done @@ -168,5 +248,80 @@ daemon_status () { daemon_is_running () { pidfile=$rundir/$1.pid - test -e "$pidfile" && pid=`cat "$pidfile"` && pid_exists "$pid" + test -e "$pidfile" && pid=`cat "$pidfile"` && pid_exists "$pid" && pid_comm_check $1 $pid } >/dev/null 2>&1 + +# Prints commands needed to move the ip address from interface $1 to interface +# $2 +move_ip_address () { + if [ -z "$1" ] || [ -z "$2" ]; then + return + fi + dev="$1" + dst="$2" + + # IP addresses (including IPv6). + echo "ip addr flush dev $dev 2>/dev/null" # Suppresses "Nothing to flush". + ip addr show dev $dev | while read addr; do + set -- $addr + + # Check and trim family. + family=$1 + shift + case $family in + inet | inet6) ;; + *) continue ;; + esac + + # Trim device off the end--"ip" insists on having "dev" precede it. + addrcmd= + while test $# != 0; do + case $1 in + dynamic) + # Omit kernel-maintained route. + continue 2 + ;; + scope) + if test "$2" = link -a "$family" != inet6; then + # Omit route derived from IP address, e.g. + # 172.16.0.0/16 derived from 172.16.12.34, + # but preserve IPv6 link-local address. + continue 2 + fi + ;; + "$dev"|"$dev:"*) + # Address label string + label=`echo $1 | sed "s/$dev/$dst/"` + addrcmd="$addrcmd label $label" + shift + continue + ;; + esac + addrcmd="$addrcmd $1" + shift + done + if test "$1" != "$dev"; then + addrcmd="$addrcmd $1" + fi + + echo ip -f $family addr add $addrcmd dev $dst + done +} + +# Prints commands needed to move the ip route of interface $1 to interface $2 +move_ip_routes () { + if [ -z "$1" ] || [ -z "$2" ]; then + return + fi + dev="$1" + dst="$2" + echo "ip route flush dev $dev proto boot 2>/dev/null" # Suppresses "Nothing to flush". + ip route show dev $dev | while read route; do + # "proto kernel" routes are installed by the kernel automatically. + case $route in + *" proto kernel "*) continue ;; + esac + + echo "ip route add $route dev $dst" + done +}