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
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.