#!/bin/sh
# rotatelogs - Fait tourner les journaux de /var/log  des fins d'archivage.
#   Utilise un fichier de configuration pour permettre de personnaliser
#   la frquence des rotations. Ce fichier de configuration est au
#   format
#      nom_journal=dure
#   o la dure est exprime en jours. Si ce fichier ne prvoit aucune
#   entre pour un journal particulier, rotatelogs ne fera tourner ce
#   fichier que tous les sept jours.

logdir="/var/log"
config="/var/log/rotatelogs.conf"
mv="/bin/mv"
default_duration=7    count=0

duration=$default_duration

if [ ! -f $config ] ; then 
  echo -n "$0: je n'ai trouv aucun fichier de configuration." >&2; 
  echo " Je ne peux continuer." >&2; 
  exit 1 
fi

if [ ! -w $logdir -o ! -x $logdir ] ; then 
  echo "$0: vous n'avez pas les bonnes permissions dans $logdir" >&2 
  exit 1
fi

cd $logdir

# Nous aimerions crire :digit: pour find, mais de nombreuses versions
# de cette commande ne comprennent pas les identifiants de classes de
# caractre POSIX. Nous nous rabattons donc sur [0-9].

for name in $(find . -type f -size +0c ! -name '*[0-9]*' \
     ! -name '\.*' ! -name '*conf' -maxdepth 1 -print | sed 's/^\.\///') 
do

  count=$(( $count + 1 ))

  # On extrait cette entre du fichier de configuration

  duration="$(grep "^${name}=" $config|cut -d= -f2)"

  if [ -z $duration ] ; then  
    duration=$default_duration
  elif [ "$duration" = "0" ] ; then  
    echo "Dure nulle: on passe $name"  
    continue
  fi

  back1="${name}.1"; back2="${name}.2"; 
  back3="${name}.3"; back4="${name}.4";

  # Si le journal qui a tourn le plus rcemment (back1) a t modifi
  # dans l'intervalle de temps spcifi, ce n'est pas le moment de le
  # faire tourner.

  if [ -f "$back1" ] ; then  
    if [ -z $(find \"$back1\" -mtime +$duration -print 2>/dev/null) ]  
    then
      echo -n "la sauvegarde la plus rcente de $name est plus rcente que"
      echo " $duration jours: on passe";   continue
    fi
  fi

  echo "Je fais tourner le journal $name (avec un schma sur $duration jours)"

  # On fait tourner, en commenant par le journal le plus ancien
  if [ -f "$back3" ] ; then
    echo "... $back3 -> $back4" ; $mv -f "$back3" "$back4"
  fi
  if [ -f "$back2" ] ; then
    echo "... $back2 -> $back3" ; $mv -f "$back2" "$back3"
  fi
  if [ -f "$back1" ] ; then
    echo "... $back1 -> $back2" ; $mv -f "$back1" "$back2"
  fi
  if [ -f "$name" ] ; then
    echo "... $name -> $back1" ; $mv -f "$name" "$back1"
  fi
  touch "$name"
  chmod 0600 "$name"
done

if [ $count -eq 0 ] ; then
  echo "Rien  faire: aucun journal n'est assez volumineux ou assez ancien pour tourner"
fi 

exit 0
