SwordArMor

Sauvegarder la configuration de ses switches et routeurs avec expect

Si vous ne connaissez pas expect, c’est un outil qui permet d’écrire des scripts en TCL qui iront interagir avec telnet/ssh et d’autres trucs du genre, sans que vous ayez à le faire vous même. C’est donc très pratique pour écrire des scripts qui seront exécutés vers des équipements qui n’ont pas de cron (ce qui est typiquement le cas des switches et des routeurs).

Ici, le script est utilisé pour sauvegarder la configuration des switchs de Breizh-IX

On commence par écrire le script TCL pour aller chercher la version de l’OS qui tourne ainsi que la configuration qui tourne. Bien sûr, il faut changer user et password par les valeurs qui vont bien pour vous.
Je teste les noms d’hôte des switch afin d’adapter les commandes qui différent entre Cisco et Brocade. Dans l’idéal il faudrait tester ça par rapport au sh ver du début, et non par rapport à l’argument que l’on passe au script, mais dans l’immédiat ça suffit vu que je n’ai que deux switches.

#!/usr/bin/expect -f

set host [lindex $argv 0]
set prompt "(>|#|\\\$) $"

spawn telnet $host

expect Connected
set current_line $expect_out(buffer)
if { [string first "Connected" "$current_line"] == -1 } {
	exit 1
}

expect -nocase "user "
send "user\r"

expect -nocase "pass"
send "password\r"

send "enable\r"
send "password\r"

send \r
expect -re $prompt

send "show version\r"
expect -re $prompt
expect *;

# disable pagination on brocade
if { [string first "asterix" $host]!=-1 } {
	send "skip-page-display\r"
}

# disable pagination on cisco
if { [string first "amonbeaufils" $host]!=-1 } {
	send "terminal length 0\r"
}

expect -re $prompt
send "show run\r"
expect "end"
send \r
expect -re $prompt
send "exit\r"

exit

Ensuite, on écrit un petit script shell qui va renvoyer la sortie dans le bon dossier, et compresser les fichiers histoire de ne pas perdre trop de place, puis on retire les backups qui ont plus d’un mois.

#!/bin/sh

./expect-sh-run.tcl $1 > /var/backups/switches/${1}-$(date +%F).txt

if [ $? = 0 ]; then
	gzip /var/backups/switches/${1}-$(date +%F).txt
	find "/var/backups/switches/${1}-*" -mtime +30
else
	echo "Backup error!"
	cat /var/backups/switches/${1}-$(date +%F).txt
fi