#!/bin/bash #....[ Ficha: ]...........................................................# # # # Script: Conta acessos 0.2.2 # # Escrito por: Reinaldo Marques de Lima (Plastico) # # Criado em: ??/05/2006 # # Ultima atualizacao: 03/10/2006 # # # #....[ Descricao: ].......................................................# # # # Script que conta a quantidade de acessos de um Servidor Apache # # # #....[ Changelog: ].......................................................# # # # Versao 0.1 - ??/05/2006 - Nasceu! # # Versao 0.2 - 16/08/2006 - Adicionado opcoes de linha de comando, como # # por exemplo, digite '-h' para exibir o help # # do programa, ou o dia do mes a ser contados # # os acessos, ou ainda pode-se passar em qual # # diretorio se encontram os arquivos. # # Versao 0.2.1 - 31/08/2006 - Pequenas melhorias no codigo. # # Versao 0.2.2 - 03/10/2006 - Mais algumas melhorias. # # # #....[ Notas: ]...........................................................# # # # - Geral - # # # # - Este script foi criado para filtrar os logs de acessos a partir da # # formatacao padrao do arquivo de log, que segue o padrao: # # "%h %l %u %t \"%r\" %>s %b" # # # # +----Legenda----+---------------------------------------------+ # # | %h - host | Endereco da Maquina que acessou o servidor; | # # | %l - ident | Nome do solicitante; | # # | %u - authuser | Nome do usuario remoto; | # # | %t - date | Tempo no formato especifico; | # # | %r - request | Primeira linha da solicitacao; | # # | %s - status | Status da ultima solicitacao; | # # | %b - bytes | Numero de bytes enviados como resposta; | # # +---------------+---------------------------------------------+ # # # # Para fomatacao diferente, analise uma linha do log, ou entao o arquivo # # httpd.conf e altere aqui as linhas das variaveis DATA1, DATA2 e ACESSOS # # se necessario. # # # # - O filtro foi criado para contabilizar somente requisicoes de acesso # # bem sucedidas ( codigos 20x e 30x ), caso queira contabilizar todos os # # acessos, inclusive erros basta remover o comando $GREP '\" [23]0[0-9]' # # da linha da variavel ACESSOS. # ## # ## - Linha de Comando - # ## # ## - Caso o diretorio onde se encontram o log for diferente do diretorio # ## padrao do apache, entao o diretorio pode ser especificado diretamente # ## pela linha de comando: # ## # ## prompt> conta_acessos.bsh /diretorio/do/arquivo.gz # ## # ## - Pode tambem ser passado pela linha de comando o dia que o programa # ## deve usar para a contagem dos acessos, da seguinte maneira: # ## # ## prompt> conta_acessos.bsh [ 01, 1 (dia precedido de zero ou nao ) ] # ## # ## - Ou ainda use a opcao -h que exibe o help de utilizacao do script. # # Contido dentro destes comentarios. # # # #....[ Variaveis: ]................# # # # # # TOTAL=0 # Inicio da contagem total de acessos; # OPCAO=$1 # Somente se existir algo em $1; # LS=$(which ls) # Testes de portabilidade para que nao # WC=$(which wc) # ocorra nenhum problema na hora de # AWK=$(which awk) # executar os comandos seja qual for # CUT=$(which cut) # o Sistema Operacional Unix-like que # SED=$(which sed) # se esteja tentando executar este # DATE=$(which date) # script. # GZIP=$(which gzip) # Recomenda-se testar estas linhas # GREP=$(which grep) # diretamente no terminal para efeito # HEAD=$(which head) # de controle; # TAIL=$(which tail) # # # # # # #....[ Testes: ]...................# # definido(){ TESTE1=$(echo $OPCAO | $SED '/^.\{1,2\}$/!d') TESTE2=$(echo $OPCAO | $SED '/^\/.*$/!d') if [ $OPCAO = $TESTE1 ]; then #( Se for um numero certificar que ele vai ser usado corretamente ).......# DIA=$(echo $OPCAO | $SED "s/.*/0&/;s/.*\(..$\)/\1/") MES=$($GZIP -dc /var/log/apache2/access.log.*.gz | $GREP '\[$DIA.*' | $HEAD -1 | $CUT -d: -f1 | $CUT -d\/ -f2) DATA2=${DIA}${MES}$($DATE +%Y) DATA1=${DIA}'/'${MES}'/'$($DATE +/%Y) elif [ $OPCAO = $TESTE2 ]; then #( Senao for numero entao ele e um diretorio )............................# ARQUIVO=$($LS -lrt $1 | $TAIL -1 | $ AWK '{print $8}') DATA1=$($GZIP -dc $ARQUIVO | $AWK '{print $4}' | $CUT -d: -f1 | $SED 's/\[\(.*\)/\1/'| $HEAD -1) DATA2=$($GZIP -dc $ARQUIVO | $AWK '{print $4}' | $CUT -d: -f1 | $SED 's|\[\(.*\)/\(.*\)/\(.*\)|\1\2\3|' | $HEAD -1) DATA3=$($GZIP -dc $ARQUIVO | $AWK '{print $4}' | $CUT -d: -f1 | $SED 's|\[\(.*\)/\(.*\)/\(.*\)|\1\2\3|' | $TAIL -1) else #( Senao esta errado )....................................................# echo "Verifique se o parametro passado esta correto" && exit fi principal } zerado(){ #( Se nao for nada disso entao o diretorio e o arquivo sao esses )........# ARQUIVO=$($LS -lrt /var/log/apache2/access.log.*.gz | $TAIL -1 | $AWK '{print $8}') DATA1=$($GZIP -dc $ARQUIVO | $AWK '{print $4}' | $CUT -d: -f1 | $SED 's/\[\(.*\)/\1/' | $HEAD -1) DATA2=$($GZIP -dc $ARQUIVO | $AWK '{print $4}' | $CUT -d: -f1 | $SED 's|\[\(.*\)/\(.*\)/\(.*\)|\1\2\3|' | $HEAD -1) DATA3=$($GZIP -dc $ARQUIVO | $AWK '{print $4}' | $CUT -d: -f1 | $SED 's|\[\(.*\)/\(.*\)/\(.*\)|\1\2\3|' | $TAIL -1) if [ $DATA2 != $DATA3 ]; then INTERVALO="$DATA2-$DATA3" else INTERVALO="$DATA2" fi principal } principal(){ #....[ Looping que conta acessos por hora: ]..............................# LINHA=$(echo "-" | sed -e :a -e 's/^.\{1,30\}$/-&/;ta') echo " Acessos para o dia $DATA2" > acessos_$INTERVALO.txt echo "+$LINHA+" >> acessos_$INTERVALO.txt for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23; do ACESSOS=$($GZIP -dc $ARQUIVO | $GREP '\" [23]0[0-9]' | $AWK '{print $4}' | $CUT -d: -f2 | $GREP $i | $WC -l) echo " >>> Hora: $i - $ACESSOS" >> acessos_$INTERVALO.txt TOTAL=$((TOTAL + $ACESSOS)) done echo "+$LINHA+" >> acessos_$INTERVALO.txt echo " Total de Acessos = $TOTAL" >> acessos_$INTERVALO.txt } if [ $1 ]; then case $1 in -h ) cat $0 | sed '/^## .* #$/!d;s/#//g' ; ;; * ) definido ; ;; esac else zerado fi #....[ Fim ]..............................................................#