Oprócz sprzętu Cisco miałem okazję zarządzać też paroma switchami Della z serii 6000. Niestety producent nie pomyślał w nich totalnie o tym, że nawet<a może zwłaszcza!> sprzęt sieciowy wymaga backupu. Niby jest opcja w CLI przełącznika by zapisać obecny konfig jako backup, ale … na przełączniku. A to nijak nie pomoże w przypadku padu urządzenia, czy innej katastrofy, która spowoduje, że nie będzie można odczytać z niego tej konfiguracji.

Dlatego tez postanowiłem sam napisać sobie skrypt, który mi ten backup zrobi. Wykorzystałem do tego: pythona z biblioteką telnetlib i serwer tftp. Pewną rolę odegrał tu także plik /etc/hosts. 🙂

Pomysł jest prosty. W pliku /etc/hosts odwzorowujemy nazwy naszych urządzeń na adresy IP. Może to wyglądać np. tak:

127.0.0.1       localhost
192.168.1.1     switch1
192.168.1.2     switch2
192.168.1.3     switch3
192.168.1.4     switch4

Dodatkowo tworzymy jeszcze sobie pliczek hosts w tym samym katalogu, z którego skrypt wczyta nazwy hostów. I tam wpisujemy tylko nazwy przełączników, które chcemy backupować. Powinien on wyglądać dokładnie tak:

switch1
switch2
switch3
switch4

Skrypt działa bardzo prosto:

  • wczytuje nazwy switchy z pliku hosts
  • w katalogu serwera tftp tworzy plik o nazwie hosta
  • loguje się za pomocą telnetu się na switcha
  • wykonuje komendę, która skopiuje plik startup-config na serwer tftp
  • przenosi plik z ogólnie dostępnego katalogu serwera tftp do bezpieczniejszej lokalizacji i dodaje do nazwy pliku datę wykonania kopii zapasowej.

Niestety minusem jest to, że Dell w tym sprzęcie zaimplementował tylko dwa poziomy dostępu: nieuprzywilejowany oraz uprzywilejowany. Spod tego pierwszego nie uda nam się skopiować konfiguracji na serwer tftp. Druga opcja wymaga niestety podania hasła do trybu enable, co nie jest najlepszym wyjściem, ale lepszego niestety, gdzie tworzy katalog z nazwą przełącznika nie znalazłem. 🙁

A o to jak wygląda skrypcik:

#!/usr/bin/env python
import getpass
import sys
import telnetlib
import os
import string
from datetime import date

backup_server_ip = "x.x.x.x"
hosts = []
user = ""
password = ""
enable = ""

def get_usrpass():
	global user
	global password
	global enable
	user = raw_input("Enter your remote account: ")
	print("Write your user password: ")
	password = getpass.getpass()
	print("Write password to enter enable mode")
	enable = getpass.getpass()

def get_hosts():
	if os.path.isfile("hosts"):
		file = open("hosts", "r")
		for line in file:
			hosts.append(line.rstrip('\n'))
	print hosts

def copy_startup_cnf(host):
	try:
		tn = telnetlib.Telnet(host)
		tn.read_until("User:")
		tn.write(user + "\n")
		tn.read_until("Password:")
		tn.write(password + "\n")
		tn.write("enable\n")
		tn.read_until("Password:")
		tn.write(enable + "\n")

		tn.write("copy running-config startup-config\n")
		tn.write("y\n")
		tn.write("copy startup-config tftp://" + backup_server_ip  + "/" + host + "\n")
		tn.write("y\n")
		tn.read_until("#")
		tn.write("quit\n")
		print tn.read_all() + "\n"
		tn.close()
	except:
		print "\n"
		print "Problem with switch " + host + " check connection!!!\n"

def get_files():
	os.chdir("/tftpboot/")
	for host in hosts:
		if os.path.isfile(host):
			print host + " - file exists"
			print host + " - removing old file!!!"
			os.remove(host)
			open(host, 'w').close()
			print host + " - creating new file"
			if os.path.isfile(host):
				print host + " - new file was created"
				os.chmod(host, 0666)
				copy_startup_cnf(host)
		else:
			open(host, 'w').close()
			print host + " - creating file"
			if os.path.isfile(host):
				print host + " - file was created"
				os.chmod(host, 0666)
				copy_startup_cnf(host)

def rotate_files():
	os.chdir("/tftpboot/")
	for host in hosts:
		if (os.path.isfile(host)) & (os.path.getsize(host) != 0):
			print host
			if os.path.isdir("/backup/" + host):
				print host + " - moving file to backup directory"
				os.rename(host, "/backup/" + host + "/" + host + str(date.today()))
			else:
				os.mkdir("/backup/" + host)
				print host + " - directory for this host is missing - creating directory"
		else:
			print host + " - file doesn't exist or has zero lenght"
			if (os.path.getsize(host) == 0):
				os.remove(host)
		print "\n"

get_hosts()
get_usrpass()
get_files()
rotate_files()

Chętnie usłyszę komentarze i propozycje ulepszeń.
Może ktoś kto ma pod swoja opieką switche Della znalazł jakieś lepsze rozwiązanie?