Dankegon ! Superbe script, c'est le moins que l'on puisse dire.

----- Original Message -----
From: "Christophe HENRY" <[email protected]>
To: [email protected]
Sent: Friday, March 8, 2019 10:53:53 AM
Subject: Re: [graoulug-libre] Script bash

Hello,

J'ai utilisé des variables globales. C'est plus flexible pour la
configuration et les messages d'erreur.

Le script pose un mutex. Ce type de verrou permet d'empêcher l'exécution
du même script plusieurs fois en même temps. Si soucis il y a, tu peux
supprimer le fichier de verrou à la main.

Le ping n'attend qu'une seconde et fait un seul test. Le réseau est
local, la réponse (positive) est forcément rapide. Pas la peine
d'attendre plus.

L'ancien état est mémorisé dans un fichier. Une action n'est entreprise
que s'il y a un changement d'état. Cela permet d'appeler le script
autant de fois que voulu, s'il n'y a rien à faire alors il ne fera
rien. S'il doit le faire, il ne le fera qu'une seule fois à la fois,
grâce au verrou.

Le script se contente d'afficher les commandes qu'il ferait. Tu peux le
lancer sans risque pour tester. Enlève les "echo" par la suite.


""""""""""""""""""""""""""""""""""""""""""""""""""""" script
#!/bin/bash

# Arrêt dès qu'il y a une erreur
set -e

IP="192.168.1.3"
# IP="127.0.0.1" # debug
CONF_FILE="dhcpd.conf"
CONF_SUCCES="dhcp_succes.conf"
CONF_FAILOVER="dhcp_failover.conf"
ancienUp_fichier="/tmp/.ancienUp"

LOCK_FILE="/var/lock/dhcp_failover" # Supprimer si soucis de verrou

[ -f "$CONF_FILE" ] || { echo "$CONF_FILE manquant !" >&2; exit 1; }
[ -f "$CONF_SUCCES" ] || { echo "$CONF_SUCCES manquant !" >&2; exit 1; }
[ -f "$CONF_FAILOVER" ] || { echo "$CONF_FAILOVER manquant !" >&2; exit 1; }

# Verrou : évite que deux lancements du script se marchent dessus.
exec {lock}>"$LOCK_FILE" || exit 1
flock --nonblock "$lock" || { echo "$0 en cours d'exécution !" >&2;
exit 1; }

# En l'absence d'ancien état, on suppose qu'il était positif.
[ -f $ancienUp_fichier ] || { echo -n "SUCCÈS" > $ancienUp_fichier; }

set +e # sinon un échec de ping arrêterait le script
ping -q -c1 -W1 "$IP" >/dev/null
# -c1: un seul essai
# -W1: n'attends qu'une seconde avant d'échouer
if [ $? == 0 ]
then
     export up="SUCCÈS"
else
     export up="FAILOVER"
fi
set -e

#up="SUCCÈS"    # debug
#up="FAILOVER"  # debug

# Récupère l'ancien état et le met à jour ensuite
ancienUp=$(cat "$ancienUp_fichier")
echo -n $up > "$ancienUp_fichier"
if [ "$up" != "$ancienUp" ] ;then
    echo "Changement: $ancienUp --> $up"
    # Changement d'état, il faudra redémarrer le démon,
    # choix de la configuration à faire.
    if [ $up == "SUCCÈS" ]; then
        dhcpConf=$CONF_SUCCES
    else
        dhcpConf=$CONF_FAILOVER
    fi
    echo '    cp "$dhcpConf" "$CONF_FILE"'
    echo "    systemctl restart dhcpd"
else
    echo "Aucun changement: $ancienUp == $up"
fi


-- 
Christophe HENRY
FR EO EN - http://sbgodin.fr

_______________________________________________
libre mailing list
[email protected]
https://brassens.heberge.info/cgi-bin/mailman/listinfo/libre
_______________________________________________
libre mailing list
[email protected]
https://brassens.heberge.info/cgi-bin/mailman/listinfo/libre

Répondre à