#!/bin/bash # # Start # #set -x #==============================================================================# VERSION="v2015052100" #------------------------------------------------------------------------------# ### damit auch alle Programme gefunden werden PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" #------------------------------------------------------------------------------# ### dieses Skript kann nicht einzeln gestartet werden if [ -z "${LDIRECTORD_IFN_CF}" ] ; then ARBEITSVERZEICHNIS="$(dirname ${0})" echo " ${ARBEITSVERZEICHNIS}/LB_Modus.sh Start ${ARBEITSVERZEICHNIS}/LB_Modus.sh Stop ${ARBEITSVERZEICHNIS}/LB_Modus.sh Check " exit 1 fi #==============================================================================# ### Funktionen #------------------------------------------------------------------------------# ip_out() { if [ -z "$(echo "${1}" | grep -E '[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*')" ] ; then host ${1} | awk '{print $NF}' else echo ${1} fi } #------------------------------------------------------------------------------# #------------------------------------------------------------------------------# ### hier werden die lo:interface-Namen, die nicht in der CFG-Datei stehen, ### entfernt ### #echo " #LDIRECTORD_IFN_CF='${LDIRECTORD_IFN_CF}' #" TEMPDATEI="$(mktemp /tmp/LB_Start_XXXXXXXX)" echo "${LDIRECTORD_IFN_CF}" | grep -Ev '^$' | awk -F'|' '{print $2}' | sort | uniq | while read IPNM do ### egal was es ist, es wird eine IP ausgegeben ip_out ${IPNM} done | awk '{print " "$1"/"}' > ${TEMPDATEI} #exit # # inet 10.31.2.178/32 brd 10.31.2.178 scope global lo:kontoch # inet 193.227.192.234/32 brd 193.227.192.234 scope global lo:lizi_b2c ip addr show dev lo | fgrep "scope global" | fgrep -vf ${TEMPDATEI} | while read ZEILE do # _INET VIPADR _BR _IP _SCOPE _GLOBAL UEIFLABEL # oder # _INET VIPADR _SCOPE _GLOBAL UEIFLABEL VIPADR="$(echo "${ZEILE}" | awk '{print $2}' | grep -E '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*')" _IPADR="$(echo "${VIPADR}" | sed 's#/.*##')" IFLABEL="$(echo "${ZEILE}" | awk '{print $NF}' | grep -F ':')" #echo "VIPADR='${VIPADR}'" if [ -n "${VIPADR}" ] ; then #echo "================================================================" ### Verbindungen aus dem LB entfernen ipvsadm -Ln | fgrep "${_IPADR}:" | awk '{print $2}' | while read VIPPORT do ipvsadm -Lnt "${VIPPORT}" | grep -F '> ' | grep -E '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' | awk '{print $2}' | while read RIPPORT do echo "-e -t ${VIPPORT} -r ${RIPPORT} -w 0 -d -t ${VIPPORT} -r ${RIPPORT} -D -t ${VIPPORT}" | logger -t LoadBalancer echo "-e -t ${VIPPORT} -r ${RIPPORT} -w 0 -d -t ${VIPPORT} -r ${RIPPORT} -D -t ${VIPPORT}" | ipvsadm -R #2>/dev/null done done if [ -n "${IFLABEL}" ] ; then echo "ip addr del ${VIPADR} dev lo label ${IFLABEL}" | logger -t LoadBalancer ip addr del ${VIPADR} dev lo label ${IFLABEL} else echo "ip addr del ${VIPADR} dev lo" | logger -t LoadBalancer ip addr del ${VIPADR} dev lo fi fi done rm -f ${TEMPDATEI} #==============================================================================# echo "${LDIRECTORD_IFN_CF}" | while read ZEILE do #----------------------------------------------------------------------# #echo "-----------------------------------------------------------------" unset BLOCK BLOCK="$(echo "${ZEILE}" | tr -s '|' '\n')" IFNAME="$(echo "${ZEILE}" | grep -Ev '^$' | awk -F'|' '{print $1}' | head -n1)" VIPADR="$(echo "${ZEILE}" | grep -Ev '^$' | awk -F'|' '{print $2}' | head -n1)" VIRTUAL="$(echo "${BLOCK}" | grep -F 'virtual=' | sed 's/virtual=//;s/:[0-9]*//' | awk '{print $1}')" ### hier wird (wegen der Einfachheit) der Port von "virtual" auch fuer "real" verwendet TCPPORTS="$(echo "${BLOCK}" | grep -F 'virtual=' | awk -F':' '{print $NF}' | awk '{print $1}')" ALLEREALIPS="$(echo "${BLOCK}" | grep -F 'real=' | sed 's/real=//;s/:[0-9]*//' | awk '{print $1}')" FALLBACK="$(echo "${BLOCK}" | grep -F 'fallback=' | sed 's/fallback=//;s/:[0-9]*//' | awk '{print $1}')" SCHEDULER="$(echo "${BLOCK}" | grep -F 'scheduler=' | sed 's/scheduler=//' | awk '{print $1}')" PERSISTENT="$(echo "${BLOCK}" | grep -F 'persistent=' | sed 's/persistent=//;s/["]//g' | awk '{print $1}')" PROTOCOL="$(echo "${BLOCK}" | grep -F 'protocol=' | sed 's/protocol=//;s/["]//g' | awk '{print $1}')" #----------------------------------------------------------------------# ### hier werden fehlende externe IPs an lo montiert if [ -n "${IFNAME}" ] ; then #ip addr | fgrep "${VIPADR}/32" if [ -z "$(ip addr | fgrep "${VIPADR}/32")" ] ; then #------------------------------------------------------# # ip addr add 193.227.192.136/32 dev lo label lo:wwwtelco # ip addr del 193.227.192.136/32 dev lo label lo:wwwtelco ip addr add ${VIPADR}/32 dev lo label lo:${IFNAME} if [ -z "$(ip addr | fgrep "${VIPADR}/32")" ] ; then echo "Fehler: ${VIPADR}/32 - lo:${IFNAME}" fi fi fi #----------------------------------------------------------------------# ### hier werden die Server-Verbindungen aktiviert (for TPORT in ${TCPPORTS} do echo "-A -t ${VIPADR}:${TPORT} -s ${SCHEDULER} -p ${PERSISTENT}" for REAL_IP in ${ALLEREALIPS} ${FALLBACK} do echo "-a -t ${VIPADR}:${TPORT} -r ${REAL_IP}:${TPORT} -m" echo "-e -t ${VIPADR}:${TPORT} -r ${REAL_IP}:${TPORT} -w 0" done done) | ipvsadm -R 2>/dev/null done