camembert/backend/multi-telnet/script.sh
2019-04-14 20:37:40 +02:00

178 lines
8.7 KiB
Bash

#!/bin/bash
#script.sh
echo "veuillez donner le mot de passe"
stty -echo #[1]
read password
stty echo
export ssh='./ssh.sh' #[2]
export telnet='./telnet.sh'
export erreur='./rapport_erreurs.log'
export temp='./tmp_routeur.log'
export cmdcisco='./commandes.txt'
export liste='./liste.txt'
export password
export routeur
export commande
rm -f $erreur #[3]
rm -f $ssh
rm -f $telnet
cat $liste | while read routeur;
do
if [ "$routeur" != "" ]
then
if[ ! -f $ssh ] #[4]
then
echo 'expect 2>&1 << EOF'>> $ssh
echo 'spawn ssh admin@$routeur' >> $ssh
echo 'expect {' >> $ssh
echo '"Password:" {send "$password\r"}' >> $ssh
echo 'timeout {exit}' >> $ssh
echo ' }' >> $ssh
echo 'expect "#"' >> $ssh
cat $cmdcisco | while read commande
do
echo "send \"$commande\r\""
echo 'expect "#"'
done >> $ssh
echo 'send "exit\r"' >> $ssh
echo 'expect "closed"' >> $ssh
echo 'exit' >> $ssh
echo 'EOF' >> $ssh
chmod +x $ssh #[5]
fi
time -p $ssh > $temp 2>&1 #[6]
COD_RET=$?
auth='cat $temp | grep -c "Password: "' #[7]
if [ "$auth" -gt "1" ]
then
echo "Problème d'authentification sur $routeur !"
echo "$routeur : wrong log-in/password" >> $erreur
continue
fi
temps='grep 'real ' $temp | sed 's/real /§/' | cut -d'§' -f2 | cut -d' ' -f1 | cut -d'.' -f1'
if [ $temps -ge 10 -a ! "'grep 'closed' $temp'" ] #[8]
then
echo "L'equipement $routeur ne réponds pas !";
echo "$routeur : connection timed out" >> $erreur
continue
fi
if [ "$COD_RET" != "0" ] #[9]
then
#Erreur de connexion a l'équipement en SSH
if [ ! -f $telnet ]
then
echo 'expect 2>&1 << EOF'>> $telnet
echo 'spawn telnet $routeur' >> $telnet
echo 'send "admin\r"' >> $telnet
echo 'expect "Password:"' >> $telnet
echo 'send "$password\r"' >> $telnet
echo 'expect "#"' >> $telnet
cat $cmdcisco | while read commande
do
echo "send \"$commande\r\""
echo 'expect "#"'
done >> $telnet
echo 'send "exit\r"' >> $telnet
echo 'expect "closed"' >> $telnet
echo 'exit' >> $telnet
echo 'EOF' >> $telnet
chmod +x $telnet
fi
$telnet > $temp 2>&1
fi
COD_RET=$?
auth='cat $temp | grep -c "Password: "' #[10]
if [ "$auth" -gt "1" ]
then
echo "Problème d'authentification sur $routeur !"
echo "$routeur : wrong log-in/password" >> $erreur
elif [ "'grep 'Host name lookup failure' $temp'" ]
then
echo "l'equipement $routeur n'existe pas !"
echo "$routeur : does not exist" >> $erreur
elif [ "'grep 'Unknown host' $temp'" ]
then
echo "la saisie de l'ip ou du nom $routeur est incorrecte !"
echo "$routeur : wrong spelling" >> $erreur
elif [ "'grep 'send: spawn id exp4 not open' $temp'" ]
then
echo "/!\ ERREUR dans la procédure. Consultez le fichier log de $routeur !!!"
echo "$routeur : Expect script execution failed !" >> $erreur
cp $temp $routeur.error.log
elif [ "'grep 'Authentication failed' $temp'" ]
then
echo "Mot de passe erroné pour $routeur !"
echo "$routeur : wrong log-in/password" >> $erreur
elif [ "'grep 'Connection refused' $temp'" ]
then
echo "Connexion à distance sur $routeur désactivé !"
echo "$routeur : vty connection disabled" >> $erreur
elif [ "'grep 'No route to host' $temp'" ]
then
echo "Alias DNS $routeur existant mais IP invalide !"
echo "$routeur : No route to host" >> $erreur
elif [ "'grep 'ProCurve' $temp'" ]
then
echo "routeur $routeur HP et non Cisco !"
echo "$routeur : non Cisco router (HP ProCurve)" >> $erreur
elif [ "'grep 'Alcatel' $temp'" ]
then
echo "routeur $routeur Alcatel et non Cisco !"
echo "$routeur : non Cisco router (Alcatel)" >> $erreur
elif [ "'grep 'Welcome to X1000' $temp'" ]
then
echo "routeur $routeur X1000 et non Cisco !"
echo "$routeur : non Cisco equipement (X1000)" >> $erreur
elif [ "'grep '% Unknown command' $temp'" -o "'grep '% Invalid' $temp'" ]
then
echo "/!\ Commandes Cisco non reconnues par l'equipement. Consultez le fichier log de $routeur !!!"
echo "$routeur : Unrecognized commands found" >> $erreur
cp $temp $routeur.error.log
elif [ "'grep 'Connected to ' $temp'" -o "'grep 'Connection closed by foreign host.' $temp'" ]
then
echo "$routeur Telnet OK !"
elif [ "'grep 'Connexion enregistree sur le terminal' $temp'" -o "'grep 'Connection to ' $temp'" ]
then
echo "$routeur SSH OK !"
elif [ "$COD_RET" != "0" ]
then
echo "Problème de connexion a l'equipement $routeur !"
echo "$routeur : connection problem" >> $erreur
fi
fi
done
rm -f $temp #[11]
exit
#Commentaires
#
# 1 : On cache la saisie du mot de passe
# 2 : Tous les fichiers sont stockés dans des variables en chemin relatif, pour que le script puisse être exécuté de n'importe où
# 3 : on supprime les fichiers générés existants si le script à déjà été exécuté
# 4 : on génère le fichier Expect si ce n'est pas déjà fait, en rentrant la procédure de connexion SSH ainsi que les commandes provenant de commandes.txt
# 5 : on attribue les droits d'exécution au script Expect généré, si on veut qu'il s'exécute correctement
# 6 : on execute le script expect, en regroupant la sortie d'erreur avec la sortie standard, en calculant le temps d'exécution pour gérer le timeout, et en crachant le tout dans un fichier temp
# 7 : on vérifie qu'il n'y ai pas un problème d'authentification en comptant le nombre d'occurrence "Password:" dans le fichier temp
# 8 : on récupère le nombre du temps d'execution, et on vérifie qu'il ne soit pas supérieur à 10 (valeur du timeout du expect)
# 9 : En cas d'erreur de connexion en SSH, on refait la procédure en Telnet
# 10 : On gère tous les cas d'erreur pris en compte par le script. (c.f. II)
# 11 : On supprime le fichier temp, qui devient inutile