Arquivo da tag: Shell script

loadBalanceFailOver-Debian.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
 
#!/bin/bash
 
# Configure as variáveis iface1,iface2,gw1,gw2 de acordo com sua rede ###
iface1="eth0" # interface do link padrão
iface2="eth1" # interface do link alternativo
gw1="192.168.0.1" # gateway do link padrão
gw2="192.168.15.1" # gateway do link alternativo
#
netmask="0.0.0.0" # deixe assim.
error=0
#
    # Root servers para testar os links
    host0="1.1.1.1" # DNS Cloudflare - teste ICMP e HTTP
    host1="8.8.8.8" # ip Google - PING (icmp)
    host2="198.41.0.4" # ip root-server VeriSign, Inc. - PING (icmp) 
    host3="192.203.230.10" # ip root-server NASA (Ames Research Center) - PING (icmp)
    host4="1.0.0.1" # DNS Cloudflare - Teste ICMP e HTTP
    host5="1.1.1.1" # * - Teste ICMP e HTTP
    #
# variáveis para desempenho (Time to Live - tempo de vida, duração.)
ttl=5
timeout=10 # referente a cada ECHO REQUEST disparado.
#
# logs
    # logs de controle
    logIptablesStart="/tmp/iptablesStart.log"
    logLinkActive="/tmp/statusLink.log"
    # logs para informações gerais
    log="/tmp/loadbalance.log"
    > $log
#
configure_rules(){
        iptables -t mangle -F
        iptables -t mangle -X
        iptables -F
        iptables -t nat -F
        iptables -X
        iptables -t nat -X
        # Mascara os pacotes destinados a internet (NAT):
        iptables -t nat -A POSTROUTING -j MASQUERADE
	    iptables -I FORWARD -m state --state NEW,ESTABLISHED -j ACCEPT
	    iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
}
    # Configura iptables
    if [ ! -e $logIptablesStart ];then 
        > $logIptablesStart
        > $logLinkActive
        # Habilita o roteamento:
        echo "1" > /proc/sys/net/ipv4/ip_forward
        # Adiciona os gateways conforme ordem de prioridade:
	    while ip route del default; do :; done
        route add -net default gw $gw2 netmask $netmask dev $iface2 > /dev/null 2>&1
        if [ $? -ne 0 ];then
            error=1
        fi
        route add -net default gw $gw1 netmask $netmask dev $iface1 > /dev/null 2>&1 # adiciona o link default por último
        if [ $? -ne 0 ];then
            error=1
        fi
 
        if [ $error -eq 1 ];then
            echo "Verifique suas configurações de Gateway e Interface"
            exit
        fi        
        # Configura regras iptables
        configure_rules
    fi
 
# a função abaixo faz a checagem dos links e retornar valor 0 ou 1 (boolean)
check_internet(){
  iface=$1
  echo "Checando comunicação com a internet na interface $iface. Teste 0 via ICMP ($host0)..." >> $log
  status_wan=$(ping -I $iface -w $timeout -qc $ttl -i 0.2 $host0 | grep "100% packet loss" > /dev/null 2>&1 ; echo $?)
  if [ $status_wan -ne 0 ];then
    echo 0
    exit
  else
      echo "Checando comunicação com a internet na interface $iface. Teste 0 via HTTP ($host0)..." >> $log
      status_wan=$(curl --interface $iface -k -s --connect-timeout $timeout $host0 > /dev/null 2>&1 ; echo $?)
      if [ $status_wan -eq 0 ];then
          echo 0
          exit
    	fi
  fi
	echo "Checando comunicação com a internet na interface $iface. Teste 1 via ICMP ($host1)..." >> $log	
	status_wan=$(ping -I $iface -w $timeout -qc $ttl -i 0.2 $host1 | grep "100% packet loss" > /dev/null 2>&1 ; echo $?)
	if [ $status_wan -ne 0 ];then
		echo 0
        exit
	fi
	echo "Checando comunicação com a internet na interface $iface. Teste 2 via ICMP ($host2)..." >> $log	
	status_wan=$(ping -I $iface -w $timeout -qc $ttl -i 0.2 $host2 | grep "100% packet loss" > /dev/null 2>&1 ; echo $?)
	if [ $status_wan -ne 0 ];then
        echo 0
        exit
	fi
  echo "Checando comunicação com a internet na interface $iface. Teste 3 via ICMP ($host3)..." >> $log	
	status_wan=$(ping -I $iface -w $timeout -qc $ttl -i 0.2 $host3 | grep "100% packet loss" > /dev/null 2>&1 ; echo $?)
	if [ $status_wan -ne 0 ];then
		echo 0
	    exit
	fi
	echo "Checando comunicação com a internet na interface $iface. Teste 4 via ICMP ($host4)..." >> $log
  status_wan=$(ping -I $iface -w $timeout -qc $ttl -i 0.2 $host4 | grep "100% packet loss" > /dev/null 2>&1 ; echo $?)
  if [ $status_wan -ne 0 ];then
          echo 0
    exit
  else
    echo "Checando comunicação com a internet na interface $iface. Teste 4 via HTTP ($host4)..." >> $log
    status_wan=$(curl --interface $iface -k -s --connect-timeout $timeout $host4 > /dev/null 2>&1 ; echo $?)
  	if [ $status_wan -eq 0 ];then
      echo 0
      exit
   fi
 fi
  echo "Checando comunicação com a internet na interface $iface. Teste 5 via ICMP ($host5)..." >> $log
  status_wan=$(ping -I $iface -w $timeout -qc $ttl -i 0.2 $host5 | grep "100% packet loss" > /dev/null 2>&1 ; echo $?)
  if [ $status_wan -ne 0 ];then
    echo 0
  	exit
  else
    echo "Checando comunicação com a internet na interface $iface. Teste 5 via HTTP ($host5)..." >> $log
    status_wan=$(curl --interface $iface -k -s --connect-timeout $timeout $host5 > /dev/null 2>&1 ; echo $?)
    if [ $status_wan -eq 0 ];then
        echo 0
        exit
    fi
  fi
	# Se nao passar em nenhum dos testes acima, então o link referente ao teste está Down, sem internet.
	status_wan=1
	echo $status_wan
}
 start(){
	# Valida comunicação com a internet para link 1
	status=$(check_internet $iface1)
	if [ $status -eq 0 ]; then
		echo "Link $iface1, Gateway $gw1 OK!" >> $log
        	if [ "$(head -n1 $logLinkActive)" != "$iface1" ]; then
		        echo -n "$iface1" > $logLinkActive
                while ip route del default; do :; done 
                route add -net default gw $gw2 netmask $netmask dev $iface2
                route add -net default gw $gw1 netmask $netmask dev $iface1
                configure_rules         
	        fi
        	exit
	fi
	# Valida comunicação com a internet para link 2
	status=$(check_internet $iface2)
	if [ $status -eq 0 ]; then
		echo "Link $iface2, Gateway $gw2 OK!" >> $log
        	if [ "$(head -n1 $logLinkActive)" != "$iface2" ]; then
		        echo -n "$iface2" > $logLinkActive
                while ip route del default; do :; done 
                route add -net default gw $gw1 netmask $netmask dev $iface1
                route add -net default gw $gw2 netmask $netmask dev $iface2
                configure_rules
	        fi
        	exit
	fi
 }
 
# Checa a existencia de alguma rota
rotaGW1=$(route -n | grep "$gw1" > /dev/null 2>&1 ; echo $?)
rotaGW2=$(route -n | grep "$gw2" > /dev/null 2>&1 ; echo $?)
if [ $rotaGW1 -ne 0 ] || [ $rotaGW2 -ne 0 ];then
    rm -f $logIptablesStart
fi
 
# Use o parâmetro "clean" (sh loadBalanceFailOver-Debian.sh clean) ao chamar o script
# para limpar os arquivos de controle de regras e rotas.
# Fazendo isto, as configurações serão refeitas na próxima execução.
case $1 in 
'clean') rm -f $logIptablesStart ; exit ;;
*) start ;;
esac
# Marcelo Viana
# infsite.org
# AMDG

Controlando GPIO do Raspberry 3 – IoT

Configurações do VirtualHost Apache2:

1
2
3
4
5
6
7
8
9
10
11
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/app
 
        <Directory "/var/www/app">
                Options +ExecCGI
                AddHandler cgi-script .cgi
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Script para habilitar GPIO e WiFi com SSID “IoT”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
log="/tmp/ioT.log"
 
start(){
        /usr/sbin/hostapd -B /etc/hostapd/hostapd.conf
        if [ $? -eq 0 ]; then
                echo "hostapd run!"
        fi
        # Liga GPIO
        echo "05" > /sys/class/gpio/export
        echo "13" > /sys/class/gpio/export
        echo "21" > /sys/class/gpio/export
        echo "24" > /sys/class/gpio/export
        echo "out" > /sys/class/gpio/gpio5/direction
        echo "out" > /sys/class/gpio/gpio13/direction
        echo "out" > /sys/class/gpio/gpio21/direction
        echo "in" > /sys/class/gpio/gpio24/direction
}
stop(){
        /usr/bin/killall -9 hostapd
        if [ $? -eq 0 ]; then
                echo "hostapd stopped!"
        fi
}
case $1 in
        "start") start ;;
        "stop") stop ;;
        *) echo "Parametro incorreto" ;;
esac

API CGI que receberá as instruções para controlar as GPIOS
Os dados são passados via GET, por meio da URL correspondente ao endereço IP que se encontra a aplicação:
Exemplo: http://192.168.0.101/?gpio5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/bin/bash
echo "Content-type: text/html"
echo ""
#echo "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>"
gpio[0]="gpio5"
gpio[1]="gpio13"
gpio[2]="gpio21"
# cada gpio deve ser registrada em --> /etc/init.d/gpio
dirBaseGpio="/sys/class/gpio"
stateGpio=""
statusErro=false
msg=""
ip=$REMOTE_ADDR
get=$QUERY_STRING
 
returnApi(){
        stateGpio=$1
        msg=$2
        echo "{
              \"statusErro\": \"$statusErro\",
              \"stateGpio\": \"$stateGpio\",
              \"msg\": \"$msg\"
              }"
}
 
verifyStateGpio(){
  echo -n $(head -n1 "$dirBaseGpio/$get/value")
}
 
callGpio(){
        sleep 0.1
        stateGpio=$(verifyStateGpio)
        if [ $stateGpio -eq 1 ];then
          #desliga
          stateGpio=0
          msg="Porta $get desligada!"
        else
          #liga
          stateGpio=1
          msg="Porta $get ligada!"
        fi
        # modifica o estado da gpip
        echo -n "$stateGpio" > "$dirBaseGpio/$get/value"
        if [ $? -eq 0 ]; then
          returnApi "$stateGpio" "$msg"
        else
          statusErro=true
          returnApi "$stateGpio" "Não pode modificar $dirBaseGpio/$get/value"
        fi
}
 
begin(){
  # verifica se $get contém no array gpio definido
  for i in ${gpio[@]}
  do
      if [ "$get" == "$i" ];then
        callGpio $get
        exit
      fi
  done
  # retorna se requisição não estiver definida
  statusErro=true
  returnApi "null" "$get não definida."
}
 
state(){
  num=0
  for i in ${gpio[@]}
  do
      stateGpio[$num]=\"$i\"\:$(head -n1 "$dirBaseGpio/$i/value")\,
      num=$((num+1))
          done
  echo -n \{${stateGpio[@]:0}\} | sed 's/,}/}/g'
}
 
 
case $get in
'state') state ; exit ;;
*) begin ; exit ;;
esac
 
echo ''
echo ''