quarta-feira, 31 de julho de 2013

Garimpando acessos ao Apex

O Oracle Apex é muito interessante para desenvolvimento rápido de aplicações, mas tem a característica duvidosa de armazenar os dados das sessões no banco de dados. Por isso é importante, de tempos em tempos, descobrir por que um determinado cliente está iniciando muitas sessões.

Uma URL do Apex termina sempre com algo assim:
    /f?p=10702:1:2602444723283688:::::

O único parâmetro p recebe todos os dados separados por ponto-e-vírgula. O primeiro número é o número da aplicação, o segundo é o número da página e o terceiro é o número da sessão.

Nos logs do Apache, encontrei o seguinte:
180.76.5.93 - - [31/Jul/2013:00:00:21 -0300] "GET /aplicprod/f?p=10702:1:2602444723283688::::: HTTP/1.1" 302 -

E a minha missão era a de descobrir quais IPs iniciaram maior número de sessões distintas. A solução é trivial:

perl -ne 'print "$1 $2\n" if /^(\S+).+p=\d+:\d+:(\d{2,})/' access_log \
  | sort | uniq | grep -Po "(\d+\.){3}\d+" | uniq -c | sort -nr 

O primeiro passo é extrair o IP e o número da sessão e colocá-los lado-a-lado assim:

180.76.5.93 2602444723283688

Isso resolvemos com o Perl. Depois, ordeno todas as linhas e elimino as repetições (que são linhas com o mesmo IP e mesmo número de sessão). Nesse ponto, cada IP aparece tantas vezes quantas sessões distintas tiver abertas para si. Então, retiro o IP de cada linha (com o grep) e conto as ocorrências com os dois últimos comandos (uniq -c | sort -nr).

A conclusão é que o Perl facilita muito a estrepolias com a linha-de-comando e que há uns engraçadinhos nos Estêites e na China que gostam de iniciar sessões do Apex.

Nenhum comentário: