Função não é executada [RESOLVIDO]

1. Função não é executada [RESOLVIDO]

Tiago de Souza Ribeiro
TiagoSouza

(usa Arch Linux)

Enviado em 17/09/2012 - 19:50h

Olá.
Uso Arch Linux, e para gerenciar rede, uso o Network Manager. Minha conexão com a internet é via rádio, interface wlan0. Compartilho essa conexão com um Notebook na rede local eth0 usando uma regra no IPTables. Estou precisando que sempre que a wlan0 conectar, umas regras que uso pra evitar invasões sejam executadas (/etc/firewall/security) e sempre que essa interface desconectar, essas regras sejam removidas. Sempre que eth0 conectar os comandos pra compartilhamento (/etc/firewall/share) e as regras de bloqueios de sites (/etc/firewall/block: executadas apenas se wlan0 estiver conectada e consiga pingar www.google.com, pois precisa resolver os domínios dos sites a serem bloqueados) sejam executados. Sempre que a eth0 desconectar as regras de compartilhamento e bloqueios sejam limpas.
Criei o seguinte script (/etc/NetworkManager/dispatcher.d/40_iptables):
#!/bin/bash

INTERFACE=$1
STATUS=$2

function checkping() {
if [ `ping -q -w 1 -c 1 www.google.com > /dev/null && echo true || echo false` ]; then
ping_ok=true
else
ping_ok=false
fi
}

function doblock() {
checkping
if [ $ping_ok ]; then
exec /etc/firewall/block
else
sleep 60
doblock
fi
}

case "$INTERFACE" in
'eth0')
if [ $STATUS = "up" ]; then
exec /etc/firewall/share
if [ `ifconfig | grep wlan0 | wc -l` = 1 ]; then
doblock
fi
else
exec iptables -F
exec iptables -F -t nat
if [ -f /etc/firewall/secured ]; then
exec /etc/firewall/security
fi
fi
;;
'wlan0')
if [ $STATUS = "up" ]; then
exec /etc/firewall/security
else
exec iptables -F
fi
;;
esac

Está tudo funcionando perfeitamente, com exceção da parte dos bloqueios, que não são executados. O que tem de errado com a função doblock? Parece que ela não está sendo executada...
Sou iniciante na criação de scripts Shell Script, se alguém puder me apontar o erro será de grande ajuda :D

Até mais.


  


2. Re: Função não é executada [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/09/2012 - 20:06h

Quando você usa o case não precisa do function. pode colocar a palavra sem espaços.

nesse caso ao invés de ficar assim cada função:


function checkping()
function doblock()


deixe assim:


checkping()
doblock()



3. Re: Função não é executada [RESOLVIDO]

Tiago de Souza Ribeiro
TiagoSouza

(usa Arch Linux)

Enviado em 17/09/2012 - 20:33h

Adiantou nada :(
Acabei de perceber que só o primeiro comando de cada if ou else está sendo executado, por isso não funciona. O que fiz de errado? Não deveria executar todos comandos dentro dos blocos if e else?

Até mais.


4. Re: Função não é executada [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/09/2012 - 20:47h

Outra coisa:

na função checkping e na função doblock você usou o if com o test, mas o test é usado para testar uma condição.

Veja a função checkping:


function checkping() {
if [ `ping -q -w 1 -c 1 www.google.com > /dev/null && echo true || echo false` ]; then
ping_ok=true
else
ping_ok=false
fi
}


O resultado do sub-shell deveria ser testado, por exemplo. se retornar algum resultado true se não false. então o que você poderia fazer é testar a condição da seguinte forma:


checkping() {
if [ $(ping -q -w 1 -c 1 www.google.com > /dev/null && echo true || echo false) = "true" ]; then
ping_ok=true
else
ping_ok=false
fi
}


Assim se o comando do ping for executado com êxito a saída será true se não será false. sendo assim se for true deixará a variável ping_ok=true se não deixará assim ping_ok=false.


Na função doblock tem a seguinte função:


function doblock() {
checkping
if [ $ping_ok ]; then
exec /etc/firewall/block
else
sleep 60
doblock
fi
}


Sendo assim faça o teste como mostrado abaixo:


doblock() {
checkping
if [ "$ping_ok" = "true" ]; then
exec /etc/firewall/block
else
sleep 60
doblock
fi
}


Assim ele irá comparar o conteúdo da variável ping_ok, se for iqual a true executará o comando exec /etc/firewall/block se não executará o comando sleep e depois novamente a função dobblock.

O problema é que atualmente seu script não esta testando as condições do test.


5. Re: Função não é executada [RESOLVIDO]

Tiago de Souza Ribeiro
TiagoSouza

(usa Arch Linux)

Enviado em 17/09/2012 - 21:00h

Continua sem funcionar...
Coincidência ou não, apenas o primeiro comando de cada bloco if/else está sendo executado :(

O código atual está assim:
#!/bin/bash

INTERFACE=$1
STATUS=$2

checkping() {
if [ $(ping -q -w 1 -c 1 www.google.com > /dev/null && echo ok || echo fail) = ok ]; then
ping_stat=ok
else
ping_stat=fail
fi
}

doblock() {
checkping
if [ $ping_stat = ok ]; then
exec /etc/firewall/block
else
sleep 60
doblock
fi
}

case "$INTERFACE" in
'eth0')
if [ $STATUS = up ]; then
exec /etc/firewall/share
if [ $(ifconfig | grep wlan0 | wc -l) = 1 ]; then
doblock
fi
else
exec iptables -F
exec iptables -F -t nat
if [ -f /etc/firewall/secured ]; then
exec /etc/firewall/security
fi
fi
;;
'wlan0')
if [ $STATUS = up ]; then
exec /etc/firewall/security
else
exec iptables -F
fi
;;
esac


Não colocar as variáveis ou valores lá nas condicionais entre aspas pode influenciar em algo? Pelo que li, é só se tiver espaços...
Até mais.


6. Re: Função não é executada [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/09/2012 - 21:05h

Outra coisa, o case recebe o paramentro. no seu caso receberá o primeiro paramentro que é $1:

então ao invés de colocar assim:

case "$INTERFACE" in 


deixe assim:

case "$1" in 






7. Re: Função não é executada [RESOLVIDO]

Tiago de Souza Ribeiro
TiagoSouza

(usa Arch Linux)

Enviado em 17/09/2012 - 21:20h

Não adianta, nada resolve :(

Quando conecto na wlan0, as regras do /etc/firewall/security são executadas normalmente. Quando desconecto elas são removidas. Certo, para a wlan0 era exatamente isso que eu queria.
Agora na eth0, quando conecto só executa o /etc/firewall/share, a condicional com a função doblock parece ser ignorada... Quando desconecto da eth0 apenas o iptables -F é executado.

Mais alguma sugestão? ^^


8. Re: Função não é executada [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/09/2012 - 21:29h

depois de ficar estudando um pouco seu script acho que o problema está na função checkping. teste a função com o conteúdo abaixo:


checkping() {
ping=$([ $(ping -q -w 1 -c 1 www.google.com |tail -2 |head -1 |cut -d" " -f4) -ne "0" ] && echo ok || echo fail )

if [ "$ping" = "ok" ]; then
ping_stat=ok
else
ping_stat=fail
fi
}


Aproveite e teste com o endereço da www.4linux.com.br também, pois o dominio da www.4linux.com.br bloqueia os pings, ai dá pra saber se está executando ambos os comandos.


9. Re: Função não é executada [RESOLVIDO]

Tiago de Souza Ribeiro
TiagoSouza

(usa Arch Linux)

Enviado em 17/09/2012 - 21:47h

Não adianta, continua a mesma coisa :s


10. Re: Função não é executada [RESOLVIDO]

Tiago de Souza Ribeiro
TiagoSouza

(usa Arch Linux)

Enviado em 17/09/2012 - 22:02h

Acho que o problema não é com a variável...
Eu comentei a linha do exec /etc/firewall/share e a condicional, função doblock, checkping... tudo funcionou normal. Ou seja, tem alguma maldição nesse script que só está executando o primeiro comando do bloco if/else '-'

> Edit: removi o exec dos comandos e funcionou perfeitamente, está executando todos comandos do bloco *-*

Obrigado aí, dúvida resolvida :D


11. Re: Função não é executada [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/09/2012 - 22:06h

Como ficou o conteúdo final do script ?


12. Re: Função não é executada [RESOLVIDO]

Tiago de Souza Ribeiro
TiagoSouza

(usa Arch Linux)

Enviado em 17/09/2012 - 22:17h

#!/bin/bash

checkping() {
if [ $(ping -q -w 1 -c 1 www.google.com > /dev/null && echo ok || echo fail) = ok ]; then
ping_stat=ok
else
ping_stat=fail
fi
}

doblock() {
checkping
if [ "$ping_stat" = "ok" ]; then
/etc/firewall/block
else
sleep 60
doblock
fi
}

case "$1" in
'eth0')
if [ "$2" = "up" ]; then
/etc/firewall/share
if [ $(ifconfig | grep wlan0 | wc -l) = "1" ]; then
doblock
fi
else
iptables -F
iptables -F -t nat
if [ -f /etc/firewall/secured ]; then
/etc/firewall/security
fi
fi
;;
'wlan0')
if [ "$2" = "up" ]; then
/etc/firewall/security
else
iptables -F
fi
;;
esac




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts