L'ensemble des scripts et bibliothèques bash utilisés pour maintenir l'infrastructure du Tetalab. Ce socle Bash est une version légère et adaptée du socle Bash essentiellement développé par Emmanuel Confrère, éminent DBA Calédonien.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

227 lines
8.1 KiB

#!/bin/bash
#------------------------------------------------------------------------------------------------------------------
# Script : sys_refresh_ref_cron.sh
# Auteur : Doug Le Tough
# Date : 24-07-2017
# Version : 1.0.0
# Objet : Met à jour le référentiel des jobs cron de l'ensemble de l'infra
# accessible par https://ref.tetalab.org
#
#
#------------------------------------------------------------------------------------------------------------------
# Mise a jour :
#
# 1.0.0 22/07/2017 - Doug Le Tough - Cre : Mise en production
#
#------------------------------------------------------------------------------------------------------------------
# Dependances : Aucune
#
#
#------------------------------------------------------------------------------------------------------------------
# Liste des options et arguments:
#
# Ce script n'accepte *aucune* option
#
# @OPT: f:force:force:1/1:false:show_only::
# @OPT: f:show_only:show_only:1/1:false:force::
#
#------------------------------------------------------------------------------------------------------------------
# Liste des erreurs:
#
# 2 | erreur | stop | ${ERROR}
#
#------------------------------------------------------------------------------------------------------------------
# Liste des paramètres de configuration:
#
# PGPASSFILE=/home/asr/.pgpass
# DB_TABLE=ref_cron
# TETALAB_USERS[0]=root
# TETALAB_USERS[1]=asr
# TETALAB_VM[0]=sousetsuken.local.tetalab.org
# TETALAB_VM[1]=jimmy.local.tetalab.org
# TETALAB_VM[2]=billy.local.tetalab.org
# TETALAB_VM[3]=marian.local.tetalab.org
# TETALAB_VM[4]=sonny.local.tetalab.org
# TETALAB_VM[5]=web.local.tetalab.org
#
##------------------------------------------------------------------------------------------------------------------
##
## Syntaxe :
## --------
##
## prompt> sys_refresh_ref_cron.sh [-force true] [-show_only true]
##
## Prérequis:
## ----------
## - Le script doit être executé par l'utilisateur asr
##
## Fonctionnement:
## ---------------
## Récupère l'ensemble des cronjobs des utilisateurs listés dans TETALAB_USERS
## mis en place sur les VM définies dans TETALAB_VM et les enregistre dans la table
## DB_TABLE de la base de données "referentiel".
##
## À moins que l'option -force soit passée à true, le script ne fait qu'ajouter les nouvelles
## entrées dans la base. Par défaut cette option est positionnée à false, de ce fait
## aucune données n'est supprimée dans la base y compris si le cronjob n'existe plus sur le
## système concernée.
##
## Lorsqu'un cron job est supprimé, forcer une régénération complète des entrées de la base est
## donc nécessaire (sys_refresh_ref_cron.sh -force true)
##
## L'option -show_only positionnée à true permet de lister les cronjobs installés sur les VM sans
## les enregistrer dans la base de données.
##
## Les informations de connexion à la base de données doivent être stockées dans
## le fichier PGPASSFILE sur sousetsuken au format suivant:
##
## hostname:port:database:username:password
##
## https://www.postgresql.org/docs/9.6/static/libpq-pgpass.html
##
##
#------------------------------------------------------------------------------------------------------------------
# Initialisation de l'environement
#------------------------------------------------------------------------------------------------------------------
if [ "${USER}" != "asr" ]; then
ERROR="Seul l'utilisateur asr peut utiliser ce script"
echo -e "\033[91m${ERROR}\033[0m"
exit 1
fi
source /etc/profile.d/tetalab.sh
if [ ! -f ${NC_EXPL_CFG}/init.conf ]; then
echo "Le fichier d'initialisation du socle \${NC_EXPL_CFG}/init.conf n'éxiste pas !"
echo "Arrêt du script par sécurité"
exit 250
fi
source ${NC_EXPL_CFG}/init.conf
#------------------------------------------------------------------------------------------------------------------
# Fonctions
#------------------------------------------------------------------------------------------------------------------
function check_config
{
fct_message "Vérification de la configuration:" -color jaune
if [ ! -r ${SH_FICCFG} ]; then
ERROR="Fichier de configuration ${SH_FICCFG} absent ou illisible"
fct_erreur 2
fi
if [ ! -r ${PGPASSFILE} ]; then
ERROR="Fichier des informations de connexion ${PGPASSFILE} absent ou illisible"
fct_erreur 2
fi
fct_message " * PGPASSFILE: ${PGPASSFILE}"
if [ ${#DB_TABLE} -eq 0 ]; then
ERROR="Paramètre manquant ou vide dans le fichier de configuration: DB_TABLE"
fct_erreur 2
fi
fct_message " * DB_TABLE: ${DB_TABLE}"
fct_message " * Force: ${force}"
fct_message " * Show only: ${show_only}"
if [ ${#TETALAB_USERS[*]} -eq 0 ]; then
ERROR="Aucune VM définie dans le fichier de configuration"
fct_erreur 2
fi
INDEX=0
for TETALAB_USER in ${TETALAB_USERS[@]}
do
fct_message " * TETALAB_USERS[${INDEX}]: ${TETALAB_USER}"
INDEX=$(( INDEX+1 ))
done
if [ ${#TETALAB_VM[*]} -eq 0 ]; then
ERROR="Aucune VM définie dans le fichier de configuration"
fct_erreur 2
fi
INDEX=0
for VM in ${TETALAB_VM[@]}
do
fct_message " * VM[${INDEX}]: ${VM}"
INDEX=$(( INDEX+1 ))
done
}
function get_db_info
{
DB_HOST=$(cat ${PGPASSFILE} | cut -d: -f1)
DB_DATABASE=$(cat ${PGPASSFILE} | cut -d: -f3)
DB_USER=$(cat ${PGPASSFILE} | cut -d: -f4)
}
function clean_table
{
if [ "${force}" == "true" ]; then
fct_message "Option -force activée: Suppression des données dans la table." -color orange
SQL="delete from ref_cron where id > 0;"
psql -q -t -h ${DB_HOST} -U ${DB_USER} -d ${DB_DATABASE} -c "${SQL}"
fi
}
function refresh_cronjobs
{
fct_message "Récupération des cronjobs:" -color jaune
for VM in ${TETALAB_VM[@]}
do
fct_message " * ${VM}" -color rose
for TETALAB_USER in ${TETALAB_USERS[@]}
do
fct_message " * ${TETALAB_USER}" -color orange
IFS_BAK=${IFS}
IFS=$'\n'
CRONJOBS=$(ssh ${VM} "sudo crontab -u ${TETALAB_USER} -l 2>/dev/null | grep -v '^\#' | grep -v '^$' | grep -vP '^ +$'")
for CRONJOB in ${CRONJOBS}
do
COLOR="blanc"
MESSAGE=" - ${CRONJOB}"
if [ $(echo "${CRONJOB}" | grep "run-parts" | wc -l) -eq 1 ]; then
COLOR="vert"
fi
fct_message ${MESSAGE} -color ${COLOR}
if [ "${show_only}" == "false" ]; then
if [ ${#CRONJOB} -gt 0 ]; then
fct_message " Checking database:"
MINUTES=$(echo ${CRONJOB} | cut -d' ' -f1)
HOURS=$(echo ${CRONJOB} | cut -d' ' -f2)
DAYS=$(echo ${CRONJOB} | cut -d' ' -f3)
MONTHS=$(echo ${CRONJOB} | cut -d' ' -f4)
DAYSOFWEEK=$(echo ${CRONJOB} | cut -d' ' -f5)
COMMAND=$(echo ${CRONJOB} | cut -d' ' -f6-)
REQUEST_ID_PARAMS="host='${VM}' and s_user='${TETALAB_USER}' and minutes='${MINUTES}' and hours='${HOURS}'
and days='${DAYS}' and months='${MONTHS}' and daysofweek='${DAYSOFWEEK}' and command='${COMMAND}'"
RESULT=$(psql -q -t -h ${DB_HOST} -U ${DB_USER} -d ${DB_DATABASE} -c "select ID from
ref_cron where ${REQUEST_ID_PARAMS};")
if [ ${#RESULT} -eq 0 ]; then
fct_message " -> Cronjob not in database, inserting..."
REQUEST_INSERT_PARAMS="'${VM}', '${TETALAB_USER}', '${MINUTES}',
'${HOURS}', '${DAYS}', '${MONTHS}', '${DAYSOFWEEK}', '${COMMAND}'"
psql -q -t -h ${DB_HOST} -U ${DB_USER} -d ${DB_DATABASE} -c "insert into ref_cron
(\"host\", \"s_user\", \"minutes\", \"hours\", \"days\", \"months\", \"daysofweek\", \"command\")
values (${REQUEST_INSERT_PARAMS});"
else
fct_message " -> Cronjob already in database"
fi
fi
fi
done
IFS=${IFS_BAK}
done
done
}
#------------------------------------------------------------------------------------------------------------------
# Traitement
#------------------------------------------------------------------------------------------------------------------
DB_HOST=""
DB_DATABASE=""
DB_USER=""
check_config
get_db_info
clean_table
refresh_cronjobs
fct_erreur 0