#!/bin/bash
#
# Prozedur, um eine IP-Adresse im Script-Cluster zu setzen
#
# Aufruf:
# ip_startstop [-r] <interface> <ip-adresse> [<netmask>] {start|stop} [<netmask>]
#
###########################################################################
#
. $(dirname $0)/globals.settings
#
if [[ $# -lt 3 ]]; then
  echo "usage: `basename $0` [-r] <interface> <ip-adresse> [<netmask>] {start|stop} [<netmask>]"
  exit 1
fi
#
if [[ "$1" = "-r" ]]; then
  ROUTE=1
  shift
else
  ROUTE=0
fi
#
IP_INTERFACE=$1
IP_ADRESSE=$2
if [[ $3 == st* ]]; then
  ST=$3
  IP_MASK=$4
else
  IP_MASK=$3
  ST=$4
fi
#
if [[ $IP_MASK == *.* ]]; then
  IP_NETBITS=`./ip_netbits $IP_MASK`
elif [[ -n "$IP_MASK" ]]; then
  IP_NETBITS=$IP_MASK
else
  unset IP_NETBITS
fi
#
#
case "$ST" in
  start)
################################################################################
#
# IP-Adresse setzen
#
echo IP-Adresse $IP_ADRESSE setzen
#
if [[ "$IP_INTERFACE" = "AUTO" ]]; then
  read IP_INTERFACE DEV_MASK < <(./ip_check_net $IP_ADRESSE)
  if [[ -z "$IP_INTERFACE" ]]; then
    echo "Das Interface kann nicht bestimmt werden"
    exit 1
  fi
elif [[ -z "$IP_NETBITS" ]]; then
  echo "Die Netzmaske muss angegeben werden"
  exit 1
fi
#
IP_BROADCAST=$(./ip_broadcast $IP_ADRESSE ${IP_NETBITS:-$DEV_MASK})
/sbin/ip addr add $IP_ADRESSE/${IP_NETBITS:-$DEV_MASK} broadcast $IP_BROADCAST dev $IP_INTERFACE
if [[ "$IP_INTERFACE" != "AUTO" ]]; then
  ip link set $IP_INTERFACE up
fi
if [[ $ROUTE = 1 ]]; then
  /sbin/ip route list dev $IP_INTERFACE | sed 's/src [^ ]*//' | while read z; do
    /sbin/ip route change $z dev $IP_INTERFACE src $IP_ADRESSE
  done
fi
if which arping >/dev/null; then
  arping -U -c 2 -I $IP_INTERFACE $IP_ADRESSE >/dev/null 2>&1
  arping -A -c 2 -I $IP_INTERFACE $IP_ADRESSE >/dev/null 2>&1
elif [[ -x /sbin/arping ]]; then
  /sbin/arping -U -c 2 -I $IP_INTERFACE $IP_ADRESSE >/dev/null 2>&1
  /sbin/arping -A -c 2 -I $IP_INTERFACE $IP_ADRESSE >/dev/null 2>&1
elif [[ -x /usr/sbin/arping ]]; then
  /usr/sbin/arping -U -c 2 -I $IP_INTERFACE $IP_ADRESSE >/dev/null 2>&1
  /usr/sbin/arping -A -c 2 -I $IP_INTERFACE $IP_ADRESSE >/dev/null 2>&1
fi
#
sleep 1
if $IP_TEST $IP_ADRESSE; then
  exit 0
fi
sleep 2
if $IP_TEST $IP_ADRESSE; then
  exit 0
fi
sleep 4
$IP_TEST $IP_ADRESSE
#
  ;;
# Ende Startscript
################################################################################
  stop)
################################################################################
#
# IP-Adresse loeschen
#
read IP_INTERFACE IP_ADDR_BITS IP_BROADCAST < <(ip -o -4 a show scope global | sed -n "s|^.*: *\\([^ ]*\\)  *inet  *\\($IP_ADRESSE/[0-9]*\\)  *brd  *\\([0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*\\) .*|\\1 \\2 \\3|p")
if [[ -z "$IP_INTERFACE" ]]; then
  echo "Das Interface kann nicht bestimmt werden"
  exit 1
fi
#
if [[ $ROUTE = 1 ]]; then
  OLD_IP=`/sbin/ip addr show dev $IP_INTERFACE | fgrep -v secondary | awk '$1 == "inet"{split($2,i,"/");print i[1];exit}'`
  /sbin/ip route list dev $IP_INTERFACE src $IP_ADRESSE | while read z; do
    if echo $z | grep -q default; then
      /sbin/ip route change $z dev $IP_INTERFACE
    else
      /sbin/ip route change $z dev $IP_INTERFACE src $OLD_IP
    fi
  done
fi
/sbin/ip addr del $IP_ADDR_BITS broadcast $IP_BROADCAST dev $IP_INTERFACE
rm -f $IP_LOCKDAT
echo IP-Adresse $IP_ADRESSE gestoppt.
#
#
  ;;
# Ende Stoppscript
################################################################################
  *)
  echo "Usage: $0 <interface> <ip-adresse> [<netmask>] {start|stop} [<netmask>]"
  exit 1
esac
