#!/bin/sh

# xferlog - Analyse et synthtise le journal de transfert de FTP. 
# Bonne documentation dtaillant le format de ce fichier:
#   http://aolserver.am.net/docs/2.3/ftp-ch4.htm

stdxferlog="/var/log/xferlog"
temp="/tmp/$(basename $0).$$"
nicenum="$HOME/bin/nicenumber"  # script #4

trap "/bin/rm -f $temp" 0

extract()
{
  # appel avec $1 = mode d'accs dsir, $2 = nom de la section de sortie 

  if [ ! -z "$(echo $accessmode | grep $1)" ] ; then

    echo "" ; echo "$2"

    if [ "$1" = "a" -o "$1" = "g" ] ; then
      echo "  valeurs de comptes normaux (avec mot de passe):"
    else
      echo "  comptes d'utilisateurs accdant au serveur:"
    fi
    awk "\$13 == \"$1\" { print \$14 }" $log | sort | \
        uniq -c | sort -rn | head -10 | sed 's/^/    /'

    awk "\$13 == \"$1\" && \$12 == \"o\" { print \$9 }" $log | sort | \
      uniq -c | sort -rn | head -10 | sed 's/^/    /' > $temp
    if [ -s $temp ] ; then
      echo "  fichiers tlchargs depuis le serveur:" ; cat $temp
    fi

    awk "\$13 == \"$1\" && \$12 == \"i\" { print \$9 }" $log | sort | \
      uniq -c | sort -rn | head -10 | sed 's/^/    /' > $temp

    if [ -s $temp ] ; then
      echo "  fichiers tlchargs sur le serveur:" ; cat $temp
    fi
  fi
}

###### Le bloc principal du script

case $# in
  0 ) log=$stdxferlog           ;;
  1 ) log="$1"                  ;;
  * ) echo "Syntaxe: $(basename $0) {nom du journal xferlog}" >&2
      exit 1
esac

if [ ! -r $log ] ; then
  echo "$(basename $0): je ne peux pas lire $log." >&2
  exit 1
fi

# Voit s'il s'agit d'un format de fichier journal ftp abrg ou
# standard. S'il s'agit du format abrg, fournit des statistiques
# minimales et rend la main: ce format est malheureusement trop
# difficile  analyser dans un petit script.

if [ ! -z $(awk '$6 == "get" { short=1 } END{ print short }' $log) ] ; then
   bytesin="$(awk 'BEGIN{sum=0} $6 == "get" {sum += $9} END{ print sum }' $log )"
  bytesout="$(awk 'BEGIN{sum=0} $6 == "put" {sum += $9} END{ print sum }' $log )"

  echo -n "xferlog de ftpd abrg du "
  echo -n $(head -1 $log | awk '{print $1, $2, $3 }')
  echo    " au $(tail -1 $log | awk '{print $1, $2, $3}')"
  echo "   octets entrants: $($nicenum $bytesin)"
  echo "   octets sortants: $($nicenum $bytesout)"
  exit 0
fi
  
 bytesin="$(awk 'BEGIN{sum=0} $12 == "i" {sum += $8} END{ print sum }' $log )"
bytesout="$(awk 'BEGIN{sum=0} $12 == "o" {sum += $8} END{ print sum }' $log )"
time="$(awk 'BEGIN{sum=0} {sum += $6} END{ print sum }' $log)"

echo -n "Synthse de xferlog du "
echo -n $(head -1 $log | awk '{print $1, $2, $3, $4, $5 }')
echo    " au $(tail -1 $log | awk '{print $1, $2, $3, $4, $5}')"
echo "   octets entrants: $($nicenum $bytesin)"
echo "   octets sortants: $($nicenum $bytesout)"
echo "temps de transfert: $time secondes"

accessmode="$(awk '{print $13}' $log | sort -u)"

extract "a" "Accs anonyme"
extract "g" "Accs au compte invit"
extract "r" "Accs sur un compte d'utilisateur rel"

exit 0
