#!/bin/bash
#
# Prozedur, um eine IP-Adresse im Script-Cluster zu setzen
#
# Aufruf:
# ip_startstop [-r] <interface> <ip-adresse> <netmask> {start|stop}
#
###########################################################################
#
cd ${0%/*}
if [[ $PWD != */bin ]]
 then
  cd bin
fi
#
if [[ $# -lt 4 ]]
 then
  echo "usage: `basename $0` [-r] <interface> <ip-adresse> <netmask> {start|stop}"
  exit 1
fi
#
. globals.functions
#
if [[ "$1" = "-r" ]]
 then
  ROUTE=1
  shift
else
  ROUTE=0
fi
#
IP_INTERFACE=$1
IP_ADRESSE=$2
if [[ $3 == *.* ]]
 then
  IP_MASK=$3
  IP_NETBITS=`./ip_netbits $IP_MASK`
  IP_BROADCAST=`./ip_broadcast $IP_ADRESSE $IP_MASK`
else
  IP_NETBITS=$3
  MB=$3
  if [[ $MB -lt 8 ]]
   then
    IP_BROADCAST=$(( ${2%%.*} | (255 >> $MB) )).255.255.255
  elif [[ $MB -eq 8 ]]
   then
    IP_BROADCAST=${2%%.*}.255.255.255
  elif [[ $MB -lt 16 ]]
   then
    IPR=${2#*.}
    IP_BROADCAST=${2%%.*}.$(( ${IPR%%.*} | (255 >> ($MB - 8)) )).255.255
  elif [[ $MB -eq 16 ]]
   then
    IP_BROADCAST=${2%.*.*}.255.255
  elif [[ $MB -lt 24 ]]
   then
    IPR=${2#*.*.}
    IP_BROADCAST=${2%.*.*}.$(( ${IPR%%.*} | (255 >> ($MB - 16)) )).255
  elif [[ $MB -eq 24 ]]
   then
    IP_BROADCAST=${2%.*}.255
  else
    IP_BROADCAST=${2%.*}.$(( ${2##*.} | (255 >> ($MB - 24)) ))
  fi
fi
#
#
case "$4" in
  start)
################################################################################
#
# IP-Adresse setzen
#
echo IP-Adresse $IP_ADRESSE setzen
#
if [[ "$IP_INTERFACE" = "AUTO" ]]
 then
  IP_INTERFACE=`./get_eth_broadcast_dev $IP_BROADCAST`
  if [[ -z "$IP_INTERFACE" ]]
   then
    echo "Das Interface kann nicht bestimmt werden"
    exit 1
  fi
fi
#
/sbin/ip addr add $IP_ADRESSE/$IP_NETBITS 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
#
if [[ "$IP_INTERFACE" = "AUTO" ]]
 then
  IP_INTERFACE=`./get_eth_dev $IP_ADRESSE`
  if [[ -z "$IP_INTERFACE" ]]
   then
    echo "Das Interface kann nicht bestimmt werden"
    exit 1
  fi
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_ADRESSE/$IP_NETBITS 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}"
  exit 1
esac
