28/08/2010

Zsh Navigator Stat

Présentation

Séparément du coeur de zsh, il existe des modules que l'on peut charger, ici j'ai utilisé le module ncurses qui permet de créer une interface utilisateur, indépendante du terminal.

Zsh Navigator Stat est un simple script permettant de faire des statistiques sur les différents navigateurs qui viennent polluer les logs de votre serveur Web.

Code

#!/usr/bin/env zsh

zmodload zsh/curses

integer y
integer length

title="Zsh Navigator Stat"
length=$COLUMNS/2

init()
{
  zcurses addwin main $(( $LINES - 2 )) $(( $COLUMNS - 2 )) 1 1
  zcurses move main 1 $(( ($COLUMNS - 2 - $#title) / 2 ))
  zcurses string main $title
  y=4
}

clean()
{
  for win ($zcurses_windows); do
    [[ -z ${win:#(main|stdscr)} ]] && continue
    zcurses delwin $win
  done
  zcurses delwin main
  zcurses clear stdscr
}

Exit()
{
  clean
  zcurses end
  exit
}

more()
{
  zcurses move main $(($y+1)) 17
  zcurses refresh main
  zcurses addwin record 1 17 $(($y+2)) 6 main
  zcurses attr record green/red bold
  zcurses string record "- - More - -"
  zcurses refresh record
  while [[ -z $REPLY ]] && [[ -z $key ]]; do
    zcurses input main REPLY key
  done
  case $REPLY in
    (q)
    Exit
    ;;
  esac
  key=
  REPLY=
}

print_stat()
{
  for line in $(awk '!($1 in wtf) {print $12}' access.log | uniq | sort | uniq -c | sort -rn | sed 's/\"/,/' | awk '{print $1$2}'); do
    zcurses move main $y 5
    line=(${(s:,:)line})
    [ ${#line[2]} -le 2 ] && continue
    line[2]=$(echo $line[2] | sed 's/[;\"]/ /' )
    zcurses string main $line[2]
    zcurses move main $y 60
    zcurses string main "[${(r:$length::-:)${(l:$(( $line[1] / 1))::=:)"="}}] ($line[1])"
    y+=1
    if (( $(($y+4)) >= ($LINES) )); then
      more
      clean
      init
    fi
    zcurses refresh main
  done
}

zcurses init
init
print_stat
Exit

Résultat

zsh_stat

Bugs

Afin que le résultat soit un minimum joli la largeur du terminal doit être au minimum de 150 pixels. Pourquoi ? car comme vous pouvez le constater sur l'image ci-dessus quand des b0ts à la #$% viennent scanner votre site, ils ont des noms à rallonge.