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.
220 lines
7.8 KiB
220 lines
7.8 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::: |
|
# |
|
#------------------------------------------------------------------------------------------------------------------ |
|
# 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] |
|
## |
|
## 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) |
|
## |
|
## 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}" |
|
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 -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 [ ${#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 -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 -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 |
|
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
|
|
|