Chronos Inside
11 agosto, 2006
  Testando requisições http/https.
Ele fala por si só.


  1 #!/bin/bash
  2 clear
  3 # Este script testa requisições http/https a scripts/aplicativos na web. A idéia
  4 # é verificar se os servidores web (ou de outro tipo) estão ativos.
  5 # Através do lynx ele faz uma requisição (usando a opção --dump para ter a
  6 # saida no shell) e consegue salvar os códigos de acesso http (através da opção
  7 # --eror-file) em um arquivo. Este arquivo é usado para dizer se o acesso está
  8 # ok ou não.
  9 #
 10 # Autor: Felipe Rafael Prenholato <chronos@gentoobr.org>
 11 # IRC: nick chronos in #gentoo-br or #sancalivre at irc.freenode.net
 12 # Data: 23 de Julho de 2006.
 13 #
 14 # Este script está coberto sobre a licença GPLv2 e disponível via
 15 # pedido por e-mail. Qualquer alteração por favor envie para o criador
 16 # do script. Podem publica-lo onde quiserem, apenas sitem o autor.
 17 
 18 #                           #
 19 # --- VARIAVEIS GLOBAIS --- #
 20 #                           #
 21 
 22 # Debug flag
 23 DEBUG=0
 24 
 25 # Definindo diretório temporário.
 26 if [ -d /tmp ] && [ -w /tmp ] && [ -r /tmp ]
 27 then
 28     TMPDIR='/tmp'
 29 elif [ -d /var/tmp ] && [ -w /var/tmp ] && [ -r /var/tmp ]
 30 then
 31     TMPDIR='/var/tmp'
 32 else 
 33     echo "O script precisa do diretório /tmp ou /var/tmp com direito de escrita    e leitura para funcionar."
 34     exit 1
 35 fi
 36 
 37 # STATUS_FILE, este arquivo serve para definir o status das URLs.
 38 # Quando seu valor for 1 é porque esta funcionando (as requests estão ok),
 39 # quando for 0, é porque há problemas.
 40 STATUS_FILE="$TMPDIR/${0##*\/}_status_file_for_FOO.tmp"
 41 
 42 # error-file usado no lynx, de man lynx, opção --error-file:
 43 #
 44 #  -error_file=FILE
 45 #       define a file where Lynx will report HTTP access codes.
 46 #
 47 LYNX_ERROR_FILE="$TMPDIR/${0##*\/}_lynx_error_file_FOO.tmp"
 48 
 49 # Montanto string do Lynx.
 50 LYNX="$(which lynx) --error-file=ERROR_FILE --dump URL"
 51 
 52 # Lista de URLs, separadas por espaço.
 53 URLS="http://urlo1/foobar.php http://666.166.299.131/exe/mpg.exe
 54 http://localhost/phpinfo.php"
 55 
 56 # Lista de e-mails, separadas por espaço.
 57 EMAILS="chronos@gentoobr.org"
 58 
 59 #                   #
 60 #  --- FUNÇÕES ---  #
 61 #                   #
 62 
 63 # sendMail(ASSUNTO,MENSAGEM)
 64 sendMail () {
 65 
 66     # Definindo variaveis.
 67     local ASS
 68     local MSG
 69     local ENCODING
 70 
 71     # $1 = ASS e $2 = MSG, se não existirem, não manda nada.
 72     if [ -n "$1" ] && [ -n "$2" ]
 73     then
 74         ASS="$1"
 75         MSG="$2"
 76     else
 77         return 1 # ASS e MSG são obrigatórios.
 78     fi
 79 
 80     # Debug
 81     if [ "$DEBUG" = "1" ]
 82     then
 83         echo "--- Enviando e-email ---"
 84         echo "Assunto: "
 85         echo -e $ASS
 86         echo
 87         echo "Mensagem: "
 88         echo -e $MSG
 89         echo "--- / Enviando e-email ---"
 90     fi
 91 
 92     # Encoding default é en_US-ISO-8859-1, mas o cara pode colocar o que quiser
 93     # :).
 94     if [ -n "$3" ]
 95     then
 96         ENCODING="$3"
 97     else
 98         ENCODING="en_US.ISO-8859-1"
 99     fi
100 
101     #return 0 # hack para testes.
102     # Enviando o E-Mail.
103     if LC_ALL="$ENCODING" echo -e "$MSG" | mail -s "$ASS" $EMAILS
104     then
105         return 0 # Foi enviado na boa.
106     else
107         return 2 # O envio do e-mail deu problema.
108     fi
109 
110 }
111 
112 testStatusFile () {
113 
114     # Return codes
115     # 1 - Não foi passado o arquivo
116     # 0 - Arquivo criado com valor 0
117     # 2 - Arquivo está com valor 0
118     # 3 - Arquivo está com valor 1
119 
120     local statusfile
121     if [ -n "$1" ] 
122     then
123         statusfile=$1
124     else
125         return 1 # não foi passado o status file.
126     fi
127     
128     if ! [ -s $statusfile ]
129     then
130         echo 0 > $statusfile
131         return 0
132     fi
133 
134     [ "$(<$statusfile)" = "0" ] && return 2
135 
136     [ "$(<$statusfile)" = "1" ] && return 3
137 
138 }
139 
140 #                           #
141 # --- CORPO DO PROGRAMA --- #
142 #                           #
143 
144 for url in ${URLS};
145 do
146     
147     # Acertando variÃveis temporárias (para cada url elas ficam diferentes).
148     TMP_STATUS_FILE="${STATUS_FILE/FOO/${url##*\/}}"
149     TMP_LYNX_ERROR_FILE="${LYNX_ERROR_FILE/FOO/${url##*\/}}"
150     TMP_LYNX=${LYNX/URL/$url} && TMP_LYNX=${TMP_LYNX/ERROR_FILE/$TMP_LYNX_ERROR_FILE}
151     
152     # Fazendo request da url.
153     $TMP_LYNX &>/dev/null
154 
155     if [ "$?" = "1" ]
156     then
157 
158         EXITCODE=1
159         testStatusFile $TMP_STATUS_FILE
160         if [ "$?" = "0" ] || [ "$?" = "2" ]
161         then
162 
163             echo 1 > $TMP_STATUS_FILE
164 
165             MSG="\n Ocorreu um erro com o Lynx, não foi possível negociar a requisição com o servidor."
166             MSG="$MSG\n Pode ser possível que o micro não esteja ligado ou o serviço responsável não esteja de pé."
167             MSG="$MSG\n É ainda possível que não haja conexão com a internet ou existam outros problemas na conexão."
168             MSG="$MSG\n"
169 
170             ASS="Problemas na conexão com $url"
171 
172             sendMail "$ASS" "$MSG"
173 
174         fi
175 
176     else
177 
178         # Pegando protocolo e código de retorno do arquivo.
179         PROTOCOL=$(grep STATUS $TMP_LYNX_ERROR_FILE | cut -d"=" -f2 | cut -d" " -f1)
180         CODE=$(grep STATUS $TMP_LYNX_ERROR_FILE | cut -d"=" -f2 | cut -d" "   -f2)
181         
182         # Testando códigos
183         case "$CODE" in
184 
185             2??)
186 
187             # Códigos 2XX são códigos de sucesso.
188             echo 0 > $TMP_STATUS_FILE
189             
190             ;;
191 
192             4??)
193                 
194             EXITCODE=1
195             testStatusFile $TMP_STATUS_FILE
196             if [ "$?" = "0" ] || [ "$?" = "2" ]
197             then
198                 
199                 echo 1 > $TMP_STATUS_FILE
200                 
201                 case "$CODE" in
202                     
203                     
204                     403)
205 
206                     MSG="\n Acesso proibido a $url.\n Erro código 403, protocolo $PROTOCOL"
207                     ASS="Erro de cliente na url $url, erro 403."
208                     sendMail "$ASS" "$MSG"
209 
210                     ;;
211                     
212                     404)
213 
214                     MSG="\n O arquivo da url $url não foi encontrado.\n Erro código 404, protocolo $PROTOCOL"
215                     ASS="Erro de cliente na url $url, erro 404."
216                     sendMail "$ASS" "$MSG"
217 
218                     ;;
219                     
220                     408)
221 
222                     MSG="\n Timeout de requisição para url $url.\n Erro código 408, protocolo $PROTOCOL"
223                     ASS="Erro de cliente na url $url, erro 408."
224                     sendMail "$ASS" "$MSG"
225 
226                     ;;
227                     
228                     *)
229 
230                     MSG="\n O erro $CODE aconteceu com a url $url.\nVerifique a lista de erros HTTP em http://en.wikipedia.org/wiki/HTTP_error_codes ou http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html para ver qual é o erro."
231                     ASS="Erro de cliente na url $url, erro $CODE."
232                     sendMail "$ASS" "$MSG"
233 
234                     ;;
235 
236                 esac
237 
238             fi
239 
240             ;;
241 
242             5??)
243                 
244             EXITCODE=1
245             testStatusFile $TMP_STATUS_FILE
246             if [ "$?" = "0" ] || [ "$?" = "2" ]
247             then
248                 
249                 echo 1 > $TMP_STATUS_FILE
250                 
251                 case "$CODE" in
252                     
253                     
254                     500)
255 
256                     MSG="\n Erro interno de servidor para $url.\n Erro código 500, protocolo $PROTOCOL"
257                     ASS="Erro de servidor na url $url, erro 500."
258                     sendMail "$ASS" "$MSG"
259 
260                     ;;
261                     
262                     502)
263 
264                     MSG="\n Bad Gateway para $url.\n Erro código 502, protocolo $PROTOCOL"
265                     ASS="Erro de servidor na url $url, erro 502."
266                     sendMail "$ASS" "$MSG"
267 
268                     ;;
269                     
270                     503)
271 
272                     MSG="\n Serviço não disponível para $url.\n Erro código 503, protocolo $PROTOCOL"
273                     ASS="Erro de servidor na url $url, erro 503."
274                     sendMail "$ASS" "$MSG"
275 
276                     ;;
277                     
278                     *)
279 
280                     MSG="\n O erro $CODE aconteceu com a url $url.\nVerifique a lista de erros HTTP em http://en.wikipedia.org/wiki/HTTP_error_codes ou http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html para ver qual é o erro."
281                     ASS="Erro de servidor na url $url, erro $CODE."
282                     sendMail "$ASS" "$MSG"
283 
284                     ;;
285 
286                 esac
287 
288             fi
289 
290             ;;
291 
292             *)
293 
294             EXITCODE=1
295             testStatusFile $TMP_STATUS_FILE
296             if [ "$?" = "0" ] || [ "$?" = "2" ]
297             then
298 
299                 echo 1 > $TMP_STATUS_FILE
300 
301                 MSG="\n O erro $CODE aconteceu com a url $url.\nVerifique a lista de erros HTTP em http://en.wikipedia.org/wiki/HTTP_error_codes ou http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html para ver qual é o erro."
302                 ASS="Erro na url $url, erro $CODE."
303                 sendMail "$ASS" "$MSG"
304 
305             fi
306 
307             ;;
308 
309         esac
310 
311     fi
312         
313     # Debug
314     if [ "$DEBUG" = "1" ]
315     then
316         echo "URL: $url"
317         echo "TMP_STATUS_FILE: $TMP_STATUS_FILE"
318         echo "TMP_LYNX_ERROR_FILE: $TMP_LYNX_ERROR_FILE"
319         echo "TMP_LYNX: $TMP_LYNX"
320         echo "PROTOCOL: $PROTOCOL"
321         echo "CODE: $CODE"
322         echo "SAIDA DO LYNX: $foo"
323         echo
324         echo "-----------------"
325         echo
326     fi
327 
328     # Deletando TMP_LYNX_ERROR_FILE
329     rm $TMP_LYNX_ERROR_FILE &>/dev/null
330     
331     # Limpando variaveis.
332     unset -v url TMP_STATUS_FILE TMP_LYNX_ERROR_FILE TMP_LYNX foo MSG ASS SEND_MAIL_FAIL PROTOCOL CODE
333 
334 done
335 
336 [ "$EXITCODE" = "1" ] && exit 1
337 exit 0

Roda no cron.

Exemplo:


# testa requisiÃÃes a determinadas URLS e envia alertas.
# a lista de URLS e E-MAILS devem ser alteradas no SCRIPT.
*/10 * * * * ~/bin/testerequest &>/dev/null
 
Comments: Postar um comentário



<< Home
putz...precisa disso. Bem, aqui quero falar muito pouco sobre minha vida pessoal, e principalmente sobre programação, linux, e coisas relacionadas. tem espaço ainda para bike, que eu amo!

ARCHIVES
fevereiro 2006 / março 2006 / abril 2006 / junho 2006 / agosto 2006 / maio 2007 /


Powered by Blogger