#!/bin/sh

# weberrors - Inspecte un fichier error_log d'Apache, rend compte des
#   erreurs les plus frquentes, puis donne les autres entres.

temp="/tmp/$(basename $0).$$"

# Pour que ce script fonctionne au mieux, vous adapterez les trois
# lignes suivantes  votre propre installation.

htdocs="/usr/local/etc/httpd/htdocs/"
myhome="/usr/home/taylor/"
cgibin="/usr/local/etc/httpd/cgi-bin/"

sedstr="s/^/  /g;s|$htdocs|[htdocs]  |;s|$myhome|[homedir] |;s|$cgibin|[cgi-bin] |"

screen="(File does not exist|Invalid error redirect|premature EOF|Premature end of script|script not found)" 

length=5                # entres  montrer pour chaque catgorie

checkfor() 
{
  grep "${2}:" "$1" | awk '{print $NF}' |\
    sort | uniq -c | sort -rn | head -$length | sed "$sedstr" > $temp

  if [ $(wc -l < $temp) -gt 0 ] ; then
    echo ""
    echo "Erreurs $2:"
    cat $temp
  fi
}

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

if [ "$1" = "-l" ] ; then
  length=$2; shift 2
fi

if [ $# -ne 1 -o ! -r "$1" ] ; then
  echo "Syntaxe: $(basename $0) [-l longueur] journal_d_erreur" >&2
  exit 1
fi

echo Le fichier en entre $1 compte $(wc -l < "$1") entres.

start="$(grep -E '\[.*:.*:.*\]' "$1" | head -1 | \
  awk '{print $1" "$2" "$3" "$4" "$5 }')"
end="$(grep -E '\[.*:.*:.*\]' "$1" | tail -1 | \
  awk '{print $1" "$2" "$3" "$4" "$5 }')"
echo -n "Entres du $start au $end"

echo ""

### Contrle diverses erreurs frquentes et bien connues:

checkfor "$1" "File does not exist"
checkfor "$1" "Invalid error redirection directive"
checkfor "$1" "premature EOF"
checkfor "$1" "script not found or unable to stat" 
checkfor "$1" "Premature end of script headers" 

grep -vE "$screen" "$1" | grep "\[error\]" | grep "\[client " | \
  sed 's/\[error\]/\`/' | cut -d\`  -f2 | cut -d\  -f4- | \
  sort | uniq -c | sort -rn | sed 's/^/  /' | head -$length > $temp

if [ $(wc -l < $temp) -gt 0 ] ; then
  echo ""
  echo "Autres messages d'erreur prsents dans le fichier journal:"
  cat $temp
fi

echo ""
echo "Et voici les messages du fichier journal qui ne sont pas des erreurs:"

grep -vE "$screen" "$1" | grep -v "\[error\]" | \
  sort | uniq -c | sort -rn | \
  sed 's/^/  /' | head -$length

exit 0
