Monitorar links e fazer redundância
Publicado por Fábio de Souza (última atualização em 05/06/2012)
[ Hits: 8.020 ]
Homepage: www.quebec-linux.blogspot.com.br
Eu necessitava de um script que verificasse o status das duas interfaces de rede com saída para internet e trocasse os arquivos de configuração do firewall conforme o resultado, depois reiniciasse o firewall para efetuar as mudanças, entrando em loop de verificação novamente.
Portanto ele deve rodar em background e pelo "root" ou equivalente, se quiser coloque para iniciar automaticamente no init.
Se for utilizar, modifique as variáveis conforme seu gosto e distribuição, pois foi feito para SuSEfirewall2.
Você deverá ter 3 arquivos de configuração de firewall (iptables, susefirewall2-custom, etc):
- 1 para quando o link primário cair
- outro arquivo para quando o link secundário cair
- e outro original (especificando o caminho, ele fará automaticamente o backup deste)
Enviem suas dúvidas ou sugestões.
Fui!
#!/bin/bash
# Echanger versao 1.0
# Criado por Fabio de Souza - binho.tti@gmail.com
# Modificado em 21 Maio de 2012
# Variaveis - Modifique somente se souber o que esta fazendo.
DATE='date +%Y%m%d%H%M'
ECHNGDIR="/root/scripts-adm/echanger"
CFG_PRI="$ECHANGEDIR/SuSEfirewall2-custom-primario"
CFG_SEC="$ECHANGEDIR/SuSEfirewall2-custom-secundario"
CFG_ORI="$ECHANGEDIR/SuSEfirewall2-custom-original"
PATH_SYS="/etc/sysconfig/scripts/SuSEfirewall2-custom"
IP_A="200.100.50.25"
IP_B="189.187.186.40"
INT_A="eth0"
INT_B="eth1"
LOG="/var/log/echanger.log"
CHECK="nada"
INTERVAL="300"
QTD_PINGS=4
FW_RELOAD="/sbin/rcSuSEfirewall2 reload"
FW_RESTART="/sbin/rcSuSEfirewall2 restart"
NET_RESTART="/sbin/rcnetwork restart"
msgOK () {
echo -e "[ \e[00;32mOK\e[00m ]"
}
msgFAILED () {
echo -e "[ \e[00;31mFAILED\e[00m ]"
}
Linkstts_A () {
ethtool $INT_A | grep "Link detected" >> $LOG 2> /dev/null
ethtool -S $INT_A | grep -vw " 0" >> $LOG 2> /dev/null
}
Linkstts_B () {
ethtool $INT_B | grep "Link detected" >> $LOG 2> /dev/null
ethtool -S $INT_B | grep -vw " 0" >> $LOG 2> /dev/null
}
echo -e "\n\t `$DATE` : Script ECHANGER iniciado ---" >> $LOG
touch $LOG || (msgFAILED && exit 1)
for ip in $IP_A $IP_B
do
REGEX=$(egrep -c "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" <<< ${IP_A})
if [ $REGEX -eq 0 ]; then
echo "Endereco IP $ip, que sera monitorado, esta inconsistente." >> $LOG
exit 1
else
echo "Endereco IP $ip , que sera monitorado, esta consistente" >> $LOG
fi
done
echo "Verificando existencia da $INT_A ..." >> $LOG
ifconfig $INT_A > /dev/null 2> /dev/null && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)
echo "Verificando existencia da $INT_B ..." >> $LOG
ifconfig $INT_B > /dev/null 2> /dev/null && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)
echo "Criando diretorio echanger ..." >> $LOG
mkdir -p $ECHNGDIR && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)
echo "Fazendo backup de $PATH_SYS para $ECHNGDIR$CFG_ORI ..." >> $LOG
[ -f $PATH_SYS ] && cp $PATH_SYS $ECHNGDIR$CFG_ORI 2> /dev/null && msgOK >> $LOG || (msgFAILED >> $LOG && exit 1)
# Inicio do looping de verificacao de links
while true
do
sleep $INTERVAL
ping $IP_A -I $INT_A -c $QTD_PINGS > /dev/null 2> /dev/null ; STAT_IP0=$?
ping $IP_B -I $INT_B -c $QTD_PINGS > /dev/null 2> /dev/null ; STAT_IP1=$?
# Problema no link secundario, joga trafego no link principal.
if [ $STAT_IP0 -eq 0 ] && [ $STAT_IP1 -ne 0 ] ; then
if [ $CHECK == secdown ] ; then
echo "`$DATE` : Nenhuma alteracao a fazer, $INT_B ainda esta down!" >> $LOG
Linkstts_B
else
echo "`$DATE` : Link Secundario down!" >> $LOG
cp $ECHNGDIR$CFG_PRI $PATH_SYS
$FW_RELOAD > /dev/null 2> /dev/null
INTERVAL="240" ; CHECK="secdown"
fi
# Problema no link primario, joga trafego no link secundario.
elif [ $STAT_IP0 -ne 0 ] && [ $STAT_IP1 -eq 0 ] ; then
if [ $CHECK == pridown ] ; then
echo "`$DATE` : Nenhuma alteracao a fazer, $INT_A ainda esta down!" >> $LOG
Linkstts_A
else
echo -e "`$DATE` : Link Primário down!" >> $LOG
cp $ECHNGDIR$CFG_SEC $PATH_SYS
$FW_RELOAD > /dev/null 2> /dev/null
INTERVAL="240" ; CHECK="pridown"
fi
# Dois links indisponiveis, reinicia interfaces para tentar resolver.
elif [ $STAT_IP0 -ne 0 ] && [ $STAT_IP1 -ne 0 ] ; then
if [ $CHECK == alldown ] ; then
echo "`$DATE` : Links $INT_A e $INT_B ainda estao DOWN!" >> $LOG
INTERVAL="60" ; CHECK="alldown"
else
echo -e "`$DATE` : All links DOWN!" >> $LOG
$NET_RESTART > /dev/null 2> /dev/null
INTERVAL="30" ; CHECK="alldown"
fi
# Os dois links estao OK, mantem tabelas.
else
if [ $CHECK == "allup" ] ; then
echo -e "`$DATE` : Nenhuma alteracao a fazer, links $INT_A e $INT_B ainda estao UP." >> $LOG
INTERVAL="300" ; CHECK="allup"
else
echo -e "`$DATE` : Links $INT_A e $INT_B estao UP." >> $LOG
cp $ECHNGDIR$CFG_ORI $PATH_SYS
$FW_RELOAD > /dev/null 2> /dev/null
INTERVAL="300" ; CHECK="allup"
fi
fi
done
Montar Imagem ISO no Nautilus-Script ou Nautilus-Actions
Script que calcula média entre duas provas
debcreate - Script que facilita o uso do dpkg-deb
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Instalando partes faltantes do Plasma 6
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Estou tentando ser legalista, mas tá complicado! (9)
espelhar monitores nao funciona (2)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (1)









