#!/bin/bash # # Betriebs-Modus # #set -x #==============================================================================# VERSION="v2015060900" #------------------------------------------------------------------------------# ### damit auch alle Programme gefunden werden PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ARBEITSVERZEICHNIS="$(dirname ${0})" #------------------------------------------------------------------------------# ### Monitor # # ipvsadm -Ln -c # ipvsadm -Ln --timeout # ipvsadm -Ln --daemon # ipvsadm -Ln --stats # ipvsadm -Ln --rate # ipvsadm -Ln --thresholds # ipvsadm -Ln --persistent-conn # #------------------------------------------------------------------------------# ### CFG-Block # # #INTERFACENAME:kunvictorv # virtual=kundenservice.victorvox.de:80 # real=swvictor31lo.oqrm.public:80 gate # real=swvictor21.oqrm.public:80 gate # real=swvictor11.oqrm.public:80 gate # service=http # request="frei/ldirector.php" # receive="Servicewelten.kundenservice.victorvox.de.71174" # scheduler=wlc # persistent=30 # protocol=tcp # checktype=negotiate #==============================================================================# #==============================================================================# ### Funktionen #------------------------------------------------------------------------------# vorbereitung() { #----------------------------------------------------------------------# ### hier werden die CFG-Bloecke in Zeilen umgewandelt ### ### virtual=www.telco.de:80|real=symshtelco21.oqrm.public:80 gate|real=symshtelco11.oqrm.public:80 gate|real=symshtelco31lo.oqrm.public:80 gate|service=http|request="ldirector.php"|receive="SymfonyWebshop.www.telco.de.72980"|scheduler=wlc|persistent=30|protocol=tcp|checktype=negotiate LDIRECTORD_CF="$(cat /etc/ldirectord.cf | sed 's/^[ \t]*//' | grep -Ev '^$|^#' | tr -s '\n' '|' | sed 's/|virtual=/\nvirtual=/g;s/|[ \t]*/|/g' | fgrep 'virtual=')" export LDIRECTORD_CF if [ -z "${LDIRECTORD_CF}" ] ; then echo "In der Datei '/etc/ldirectord.cf' sind keine verwertbaren Verbindungsdaten enthalten." echo "ABBRUCH!" exit 1 fi ### nur zum testen #echo " #LDIRECTORD_CF='${LDIRECTORD_CF}' #" #------------------------------------------------------------------------------# #------------------------------------------------------------------------------# ### hier werden die vorgesehenen Interface-Namen ermittelt ### ### www.telco.de wwwtelco INTERFACENAME="$(cat /etc/ldirectord.cf | grep -FA1 INTERFACENAME | tr -s '\n' '|' | tr -s '#' '\n' | sed 's/:/|/g;s/virtual=//' | awk -F'|' '{print $3,$2}')" export INTERFACENAME if [ -z "${INTERFACENAME}" ] ; then echo "In der Datei '/etc/ldirectord.cf' sind keine verwertbaren IF-Label enthalten." echo "ABBRUCH!" exit 1 fi ### nur zum testen #echo " #INTERFACENAME='${INTERFACENAME}' #" #exit 0 #------------------------------------------------------------------------------# ### hier werden die Hostnamen zu IP's aufgelöst IP_FQDN="$(cat /etc/ldirectord.cf | sed 's/^[ \t]*//' | grep -E '^virtual=|^real=|^fallback=' | sed 's/[=:]/ /g' | awk '{print $2}' | sort | uniq | while read FQDN do ### hier wird der FQDN in eine IP umgewandelt bzw. die IP uebernommen IPADR="$(host ${FQDN} | fgrep 'has address' | awk '{print $NF}')" if [ -z "${IPADR}" ] ; then IPADR="${FQDN}" fi #----------------------------------------------------------------------# echo "${IPADR}|${FQDN}" done)" export IP_FQDN ### nur zum testen #echo " #IP_FQDN='${IP_FQDN}' #" #exit 0 #------------------------------------------------------------------------------# ### ### der hier ist recht langsam und muss schneller werden ### ### hier werden die entsprechenden lo:interface-Namen vor die Zeilen gesetzt LDIRECTORD_IFN_CF="$(echo "${LDIRECTORD_CF}" | grep -Ev '^$' | while read ZEILE do #----------------------------------------------------------------------# unset BLOCK BLOCK="$(echo "${ZEILE}" | tr -s '|' '\n')" VIRTUAL="$(echo "${BLOCK}" | grep -F 'virtual=' | sed 's/virtual=//;s/:[0-9]*//')" IFNAME="$(echo "${INTERFACENAME}" | grep -E "^${VIRTUAL}" | awk '{print $2}')" ### hier wird der FQDN in eine IP umgewandelt bzw. die IP uebernommen VIPADR="$(echo "${IP_FQDN}" | grep -E "[|]${VIRTUAL}$" | awk -F'|' '{print $1}')" #----------------------------------------------------------------------# echo "${IFNAME}|${VIPADR}|${ZEILE}" done)" export LDIRECTORD_IFN_CF if [ -z "${LDIRECTORD_IFN_CF}" ] ; then echo "Die Daten aus der Datei '/etc/ldirectord.cf' sind nicht verwertbar." echo "ABBRUCH!" exit 1 fi #echo "${LDIRECTORD_IFN_CF}" > /tmp/LDIRECTORD_IFN_CF.txt echo "${LDIRECTORD_IFN_CF}" > /tmp/ipvsadm_Cluster.txt #exit 0 #------------------------------------------------------------------------------# #------------------------------------------------------------------------------# ### hier werden die lo:interface-Namen, die z.Z. montiert sind, ermittelt ### IST_IPLOIF="$(ip a show dev lo | awk '/scope global/{print $2,$NF}')" export IST_IPLOIF IST_ALLELOIP="$(echo "${IST_IPLOIF}" | awk '{print $1}')" export IST_ALLELOIP IST_ALLELOIF="$(echo "${IST_IPLOIF}" | awk '{print $2}')" export IST_ALLELOIF } #------------------------------------------------------------------------------# #==============================================================================# ### Modus case "${1}" in [Ss][Tt][Aa][Rr][Tt]) vorbereitung ${ARBEITSVERZEICHNIS}/LB_Start.sh echo "${0} ${1}" | logger -t LoadBalancer shift ;; [Ss][Tt][Oo][Pp]) ${ARBEITSVERZEICHNIS}/LB_Stop.sh echo "${0} ${1}" | logger -t LoadBalancer shift ;; [Cc][Hh][Ee][Cc][Kk]) vorbereitung ${ARBEITSVERZEICHNIS}/LB_Check.sh shift ;; [Ss][Tt][Aa][Tt][Uu][Ss]) ipvsadm -Ln echo ip a show dev lo | fgrep 'lo:' echo ps ax | fgrep -v grep | fgrep LB_Dienst shift ;; *) echo "${0} Start" echo "${0} Stop" echo "${0} Check" shift exit 1 ;; esac