Logs
Cette page recense plusieurs scripts nécessaire à la gestion d'un serveur de log centralisé (syslog-ng, rsyslog ou autres). Nous avons bien sur ici une architecture spécifique au niveau de la gestion des logs. Ils sont rangés dans /data/local/syslog/by_ip/$ip/$year/$month/$day.log. Il y a aussi un lien qui est créé entre /data/common/syslog/$hostname vers /data/local/syslog/by_ip/$ip (via le script symlink). Ces scripts sont utilisés sur les syslog d'Agarik
Crontab
1 0 * * * root link-current.sh > /dev/null 5 0 * * * root compresslog.sh > /dev/null 0 */1 * * * root symlinks.sh > /dev/null 0 3 * * * root purge_logs.sh > /dev/null 15 */1 * * * root anomalie_syslog.sh > /dev/null
Link-current
Ce script permet de créer un lien symbolique (current.log) à la racine de chaque serveur (/data/local/syslog/by_ip/$ip) qui pointe vers le log de la date du jour (/data/local/syslog/by_ip/$ip/$year/$month/$day.log). Cela permet de toujours vérifier le même fichier de log (/data/local/syslog/by_ip/$ip/current.log)
#!/bin/sh
BASE=/data/local/syslog/by_ip
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
cd $BASE
for dir in * ; do
cd $BASE/$dir
if [ -f OLD ] ; then
continue
fi
mkdir -m 755 -p $YEAR/$MONTH
touch $YEAR/$MONTH/$DAY.log
chmod 644 $YEAR/$MONTH/$DAY.log
ln -sf $YEAR/$MONTH/$DAY.log current.log
done
Compress log
Ce script permet de compresser les fichiers de log qui n'ont pas la date du jour et de supprimer les fichiers de log qui ont une taille nulle
#!/bin/sh
# Compression des logs dans syslog
DAY=`date +%d`
find /data/local/syslog/ -type f ! -size 0 ! -name $DAY.log ! -name \*.gz -exec gzip {} \;
find /data/local/syslog/ -type f ! -name $DAY.log -size 0 -exec rm {} \;
Symlink
Ce script est extremement spécifique à la plateforme. Il fait de multiples vérification, et créé les liens entre le hostname et l'ip (/data/common/syslog/$hostname vers /data/local/syslog/by_ip/$ip)
#! /bin/bash
CONF_VISION="/var/vision_client/data/vision_client/vision_client.conf"
PATH_IP="/data/local/syslog/by_ip"
PATH_HOSTNAME="/data/common/syslog"
cp -f /opt/agarik/script/anomalie_syslog /opt/agarik/script/anomalie_syslog_H-1
> /opt/agarik/script/anomalie_syslog
## 1. Verification des liens dans /data/common/syslog/ ###
## 1.1 Verfication que l'equipement est present dans le fichier de supervision. Si l'ip dans la sup est differente de celle du lien symbolique, alors on change le lien symbolique et on garde le repertoire de l'ip associee ; sinon on garde le lien symbolique et le répertoire de l'ip associee ###
for hostname in $(ls $PATH_HOSTNAME)
do
IP="$(grep -w target $CONF_VISION | grep -w \"$hostname\" | awk -F '\"*\"' '{ print $4 }' | tail -1)";
LINK_IP="$(ls -l $PATH_HOSTNAME/$hostname | awk {' print $NF '})";
if [ "$IP" != `basename $LINK_IP` ];
then
echo "le lien $PATH_HOSTNAME/$hostname pointe vers l'ip $LINK_IP qui n'est pas celle de la supervision, il va etre supprime et recree avec la bonne destination"
rm -f $PATH_HOSTNAME/$hostname
ln -s "$PATH_IP/$IP" "$PATH_HOSTNAME/$hostname"
else
echo "le lien symbolique $PATH_HOSTNAME/$hostname pointe bien vers la bonne ip "
fi
done
### 1.2 Verfication que l'equipement est present dans le fichier de supervision, sinon on retire le lien symbolique et le repertoire de l'ip associde est conserve ###
for hostname in $(ls $PATH_HOSTNAME)
do
if [ `grep -cw $hostname $CONF_VISION` -eq 0 ];
then
rm -f $PATH_HOSTNAME/$hostname
echo "le lien $PATH_HOSTNAME/$hostname n existe pas dans la conf et a ete supprime"
fi
done
### 2. Verification pour chaque conf de la supervision ###
### 2.1 Verification que l'ip dans le champs "filename" de la supervision correspond à un répertoire dans byip, alors on ajoute le lien symbolique de l'arborescence "hostnames", on garde le répertoire
### et on retire l'ip du fichier de contrôle 'ignore.txt' si il y existe. - Si l'ip dans le champs "filename" de la supervision ne correspond pas à un répertoire dans byip alors, on envoie un mail vers "le 3eme" ####
for ip in $(grep "filename" $CONF_VISION | awk -F\/ {' print $6 '} | sort | uniq)
do
if [ -d $PATH_IP/$ip ];then
HOST=$(grep -w target $CONF_VISION | grep -w $ip | awk -F '\"*\"' '{ print $2 }' | tail -1)
if [ ! -h $PATH_HOSTNAME/$HOST ]; then
echo "le lien symbolique $PATH_IP/$ip vers $PATH_HOSTNAME/$HOST n'existe pas, il va etre cree "
ln -s "$PATH_IP/$ip" "$PATH_HOSTNAME/$HOST"
sed -i '/$ip/d' /opt/agarik/script/ignore.txt
fi
else echo -e "L'ip $ip existe dans la conf vision, mais pas dans le repertoire $PATH_IP\n" >> /opt/agarik/script/anomalie_syslog
fi
done
### 3. Verification des liens dans /data/local/syslog/by_ip ###
### 3.1 Verification que l'ip fait partie des destinations d'un lien symbolique de l'arborescence "hostnames", alors on garde le répertoire et on retire l'ip du fichier de contrôle 'ignore.txt' si il y existe. Si l'ip ne fait pas partie des destinations d'un lien symbolique de l'arborescence "hostnames", on vérifie le contenu :
# - s'il y a des fichiers non vides, on garde le répertoire, on vérifie s'il est présent dans un fichier de contrôle 'ignore.txt' et si ce n'est pas le cas on envoie un mail vers "le 3eme",
# - si tous les fichiers du répertoire sont vides, alors on supprime le répertoire et on retire l'ip du fichier de contrôle 'ignore.txt'
for ip in $(ls $PATH_IP | egrep -vw "127.0.0.1|192.168.26.14")
do
if [ `ls -l $PATH_HOSTNAME | grep -cw $ip$` -eq 1 ]; then
echo "l'ip $ip fait partie des destinations d'un lien symbolique de l'arborescence hostnames"
sed -i '/$ip/d' /opt/agarik/script/ignore.txt
else
if [ `find $PATH_IP/$ip -type f -size +1c | wc -l` -gt 0 ];then
if [ `grep -cw $ip$ /opt/agarik/script/ignore.txt` -eq 0 ]; then
echo -e "Le repertoire $PATH_IP/$ip contient des fichiers non vide et n'est pas present dans le fichier /opt/agarik/script/ignore.txt\n" >> /opt/agarik/script/anomalie_syslog
fi
elif [ `find $PATH_IP/$ip -type f -size +1c | wc -l` -eq 0 ];then
echo "Le repertoire $PATH_IP/$ip contient que des fichiers vides, il va etre archive, et l'ip $ip retire de /opt/agarik/script/ignore.txt"
/opt/agarik/script/archivages.sh $ip
sed -i '/$ip$/d' /opt/agarik/script/ignore.txt
fi
fi
done;