Subversion Repositories ALCASAR

Rev

Rev 900 | Go to most recent revision | Blame | Last modification | View Log

#!/bin/bash
# $Id: alcasar-load_balancing.sh 904 2012-06-23 11:35:25Z franck $

# alcasar-load_balancing.sh
# by BOUIJOUX Franck (3abTux) <3abtux@free.fr>
# This script is distributed under the Gnu General Public License (GPL)

# Équilibrage de charge sur 2 ou plusieurs liens internet (en cours d'expérimentation) 
# Définion des poids des routes   :  même poids --> alternance des connexions. Sinon le poids le plus faible est prioritaire
# Load balancing with 2 or more Internet links (experimental)
# Weitght of routes : same --> switch between link. The lowest weight gain the priority.

EXTIF="eth0"
IPADDR1="192.168.2.10/24"
NETMASK1=`ipcalc -m 192.168.182.2 | cut -d"=" -f2`
GW1="192.168.2.1"
WEIGHT1=1

echo $IPADDR1
echo $NETMASK1
echo $GW1
exit 0

create_new_interface() {
                if [ "$response" = "n" ] || [ "$response" = "N" ]
                then
                        PRIVATE_IP_MASK="0"
                        PTN='^\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\).\([01]\?[[:digit:]][[:digit:]]\?\|2[0-4][[:digit:]]\|25[0-5]\)/[012]\?[[:digit:]]$'
                        until [[ $(expr $PRIVATE_IP_MASK : $PTN) -gt 0 ]]
                        do
                                if [ $Lang == "fr" ]
                                        then echo -n "Entrez l'adresse IP d'ALCASAR au format CIDR (a.b.c.d/xx) : "
                                        else echo -n "Enter ALCASAR IP address in CIDR format (a.b.c.d/xx) : "
                                fi
                                read PRIVATE_IP_MASK
                        done
                else
                        PRIVATE_IP_MASK=$DEFAULT_PRIVATE_IP_MASK
                fi
        else
                PRIVATE_IP_MASK=`grep PRIVATE_IP conf/etc/alcasar.conf|cut -d"=" -f2` 
                rm -rf conf/etc/alcasar.conf
        fi
# Define LAN side global parameters
        hostname $HOSTNAME
        PRIVATE_NETWORK=`/bin/ipcalc -n $PRIVATE_IP_MASK | cut -d"=" -f2`                       # private network address (ie.: 192.168.182.0)
        PRIVATE_NETMASK=`/bin/ipcalc -m $PRIVATE_IP_MASK | cut -d"=" -f2`                       # private network mask (ie.: 255.255.255.0)
        PRIVATE_IP=`echo $PRIVATE_IP_MASK | cut -d"/" -f1`                                      # ALCASAR private ip address (consultation LAN side)
        PRIVATE_PREFIX=`/bin/ipcalc -p $PRIVATE_IP_MASK |cut -d"=" -f2`                         # network prefix (ie. 24)
        PRIVATE_NETWORK_MASK=$PRIVATE_NETWORK/$PRIVATE_PREFIX                                   # ie.: 192.168.182.0/24
        classe=$((PRIVATE_PREFIX/8)); classe_sup=`expr $classe + 1`; classe_sup_sup=`expr $classe + 2`          # ie.: 2=classe B, 3=classe C
        PRIVATE_NETWORK_SHORT=`echo $PRIVATE_NETWORK | cut -d"." -f1-$classe`.                  # compatibility with hosts.allow et hosts.deny (ie.: 192.168.182.)
        PRIVATE_BROADCAST=`/bin/ipcalc -b $PRIVATE_NETWORK_MASK | cut -d"=" -f2`                # private network broadcast (ie.: 192.168.182.255)
        private_network_ending=`echo $PRIVATE_NETWORK | cut -d"." -f$classe_sup`                # last octet of LAN address
        private_broadcast_ending=`echo $PRIVATE_BROADCAST | cut -d"." -f$classe_sup`            # last octet of LAN broadcast
        PRIVATE_FIRST_IP=`echo $PRIVATE_NETWORK | cut -d"." -f1-3`"."`expr $private_network_ending + 1`         # First network address (ex.: 192.168.182.1)
        PRIVATE_LAST_IP=`echo $PRIVATE_BROADCAST | cut -d"." -f1-3`"."`expr $private_broadcast_ending - 1`      # last network address (ex.: 192.168.182.254)

} # end create_new_interface





X=1
nbr=3           # nbr interface réseau accédant à l'internet (comprenant celle par défaut eth0)
while [ $X -lt $nbr ]
do
  echo $X
        cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$EXTIF:${X}
DEVICE=$EXTIF:${X}
BOOTPROTO=static
IPADDR=$IPADDR1
NETMASK=$NETMASK-${X}
ONBOOT=yes
METRIC=10
NOZEROCONF=yes
MII_NOT_SUPPORTED=yes
IPV6INIT=no
IPV6TO4INIT=no
ACCOUNTING=no
USERCTL=no
EOF

X=$(( $X + 1))
done

exit 0

WEIGHT1=1
WEIGHT2=1
#WEIGHT3=3

# Définition des interfaces :
DEV1=${1-eth0}  # defaut eth0
DEV2=${2-eth0:1}  # defaut eth0:1 mais peut être autre chose :-)
#DEV3=${3-eth0:2}  # defaut eth0:2 mais peut être autre chose :-)

# Trouver les adresses pour chaque interface
IP1=`ifconfig $DEV1 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
IP2=`ifconfig $DEV2 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`
#IP3=`ifconfig $DEV3 | grep inet | awk '{ print $2 }' | awk -F: '{ print $2 }'`

# Trouver les passerelles pour chaque interface { ne fonctionne pas bien avec une seule interface } --> forcer les passerelles !
GW1=192.168.1.1
GW2=192.168.2.6
#GW3=192.168.3.1

echo "Acces internet depuis $DEV1: IP=$IP1  par la Gateway=$GW1"
echo "            et depuis $DEV2: IP=$IP2  par la Gateway=$GW2"
#echo "            et depuis $DEV3: IP=$IP3  par la GW=$GW3"

#############################
## Mise en place des routes 

# Tester si les tables existent sinon les créer
if [ -z "`cat /etc/iproute2/rt_tables | grep '^252'`" ] ; then
        echo "252       rt_dev1" >> /etc/iproute2/rt_tables
fi

if [ -z "`cat /etc/iproute2/rt_tables | grep '^251'`" ] ; then
        echo "251       rt_dev2" >> /etc/iproute2/rt_tables
fi
#if [ -z "`cat /etc/iproute2/rt_tables | grep '^250'`" ] ; then
#       echo "250       rt_dev3" >> /etc/iproute2/rt_tables
#fi

# Tables de routage
ip route add default via $GW1 table rt_dev1
ip route add default via $GW2 table rt_dev2
#ip route add default via $GW3 table rt_dev3

# Création des règles
ip rule add from $IP1 table rt_dev1
ip rule add from $IP2 table rt_dev2
#ip rule add from $IP3 table rt_dev3

# Effacer la route par défaut existante
ip route del default
if [ ! -z "`ip route show table main | grep 'nexthop'`" ] ; then
        ip route del default scope global
fi

# Alterne les liens basés sur chaque route
ip route add default scope global nexthop via $GW1 dev $DEV1 weight $WEIGHT1 \
                                nexthop via $GW2 dev $DEV2 weight $WEIGHT2
#                               nexthop via $GW3 dev $DEV3 weight $WEIGHT3 


# Purge le cache
ip route flush cache

# Fin de alcasar-load_balancing.sh

Generated by GNU Enscript 1.6.6.