socle_bash/lib/rotattrace.lib

98 lines
4.6 KiB
Plaintext
Executable File

##----------------------------------------------------------------------------
## Script : rotattrace.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 12-04-2017
## Version : 2.0.6
## Objet : Rotation du fichier passe en parametre
##
## Fonction : fct_rotation fichier retention
##
## Detail :
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 24-01-2008 - Emmanuel Confrere - Cre : Creation
# 1.0.0 06-06-2008 - Emmanuel Confrere - Ano : Correction des noms de variable
# 1.1.0 06-06-2008 - Emmanuel Confrere - Evo : Ajout recherche fichier
# 2.0.0 10-02-2016 - Emmanuel Confrere - Evo : Integration au socle DTSI
# 2.0.1 09-03-2016 - Pierre Trhin - Ano : Ajout du suivie des liens symbolique
# 2.0.2 04-01-2017 - Emmanuel Confrere - Ano : Limiter la profondeur de la purge au dossier specifier - Cf. Jira : DBA-2372
# Ajout d un control de validite des variables L_FIC2 et L_REP_FIC
# 2.0.3 05-01-2017 - Emmanuel Confrere - Ano : Erreur de syntax dans le control de validite
# 2.0.4 06-04-2017 - Emmanuel Confrere - Ano : Degradation de performance serveur (Cf. DBA-2458)
# 2.0.5 06-04-2017 - Emmanuel Confrere - Ano : Degradation de performance serveur,
# ajout de l option "-delete" dans find a la place de "-exec rm {} \;"
# 2.0.6 12-04-2017 - Emmanuel Confrere - Ano : l expension des nom ne se fait pas dans l instruction rm -f "${L_REP_FIC}/${L_FIC2}*"
# a cause des double-cotes. Du coup les fichiers ne sont pas supprimees.
##----------------------------------------------------------------------------
function fct_rotation
{
# Objet : Tourne les fichier de trace
# Parametre : Nom du fichier, periode de retention en jours
local L_FICHIER=`basename $1` # nom du fichier
local L_FIC2=""
local L_RET=$2 # Retention en jour - Entier positif
local L_SEQ=1
local L_REP_FIC="`dirname $1`" # Chemin absolu vers le fichier
local L_TMP=""
local L_TMP2=""
local L_OSPID=""
# Recuperation du PID du fichier ( uniquement pour les fichiers de trace )
L_OSPID=`echo ${L_FICHIER}|sed 's/.*_\([0-9][0-9]*\)\..*/\1/'`
# Si les chaine L_OSPID et L_FICHIER sont egale , alors le SH_SESSION_ID n as pas ete trouve
[ "${L_OSPID}" = "${L_FICHIER}" ] && L_OSPID=""
# L_OSPID doit etre un chiffre !
[ -z "`echo ${L_OSPID}|sed 's/[0-9][0-9]*//'`" ] || L_OSPID=""
if [ -n "${L_OSPID}" ]
then
# L_OSPID n est pas vide, L_FICHIER est donc un fichier de trace
# Extraction du nom de fichiers sans le numero d identification
L_FIC2=`echo ${L_FICHIER}|sed 's/^\(.*\)_\([0-9][0-9]*_[0-9][0-9]*\)\..*/\1/'`
else
L_FIC2=${L_FICHIER}
fi
# On controle ... de securite
[ "${L_FIC2}" = "*" ] && return 1 # Le fichier a supprimer ne peut pas etre "*"
[ -z "${L_FIC2}" -o -z "${L_REP_FIC}" ] && return 4 # Le nom du fichier et son repertoire doivent etre soumis
[ "${L_REP_FIC:0:1}" != "/" ] && return 2 # Le repertoire est fourni en valuer absolu
L_TMP=`echo ${L_REP_FIC}|cut -d "/" -f2` # Les repertoires suivant sont interdit
L_TMP2=`echo "bin boot sbin cgroup dev lib lib64 misc proc root selinux sys srv usr run"|grep -c "${L_TMP}"`
[ ${L_TMP2} -gt 0 ] && return 3
# fct_rotation du fichier ${L_REP_FIC}/${L_FICHIER}
# Suppression des fichier de trace anterieure a ${L_RET} jours
if [ ${L_RET} -eq 0 ]
then
# Si la retention est null on supprime tous les fichiers
rm -f ${L_REP_FIC}/${L_FIC2}*
else
# Limitation de la profondeur de la purge au dossier specifier (Ne pas prendre en compte les sous-dossier - Cf. Jira : DBA-2372)
# pour eliminer un find on reduit la pronfondeur de recherche L_RET-- (Induit par le fonctionnement de find).
((L_RET--))
find -L ${L_REP_FIC} -maxdepth 1 -name ${L_FIC2}\* -daystart -type f -mtime +${L_RET} -delete;
fi
if [ -z "${L_OSPID}" ]
then
# il s agit d un fichier sans SH_SESSION_ID on effectue donc la rotation des fichiers
# Nombre de fichier residuel...
L_SEQ=`ls ${L_REP_FIC}/${L_FICHIER}* 2>/dev/null|wc -l`
# Rotattion des fichiers
while [ ${L_SEQ} -gt 0 ]
do
L_TMP=$(( ${L_SEQ} - 1 ))
[ -f ${L_REP_FIC}/${L_FICHIER}.${L_TMP} ] && mv ${L_REP_FIC}/${L_FICHIER}.${L_TMP} ${L_REP_FIC}/${L_FICHIER}.${L_SEQ}
((L_SEQ--))
done
[ -f ${L_REP_FIC}/${L_FICHIER} ] && mv ${L_REP_FIC}/${L_FICHIER} ${L_REP_FIC}/${L_FICHIER}.1
fi
}
typeset -Ffx fct_rotation