Logs

De BlaxWiki
Aller à la navigationAller à la recherche

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;