Backup automatizado de switches con python (versión 2)

Buenas tardes.

Tal y como ya publiqué en la entrada que podéis leer aquí, tengo un script de python para realizar backup automatizados de los switches HP Procurve (ahora Aruba).

Os dejo por aquí la segunda versión del script, ya que lo he modificado para que se puedan hacer backups de todos los switches sea cual sea su pantalla de login.

Cada switch pide una cosa distinta al conectar por telnet: unos nada más conectar piden usuario y password, otros sólo piden password, otros hay que pusar enter antes de que te pida user y password, o sólo password…

Con éste script se solucionan todas las combinaciones posibles (recordad modificar la indentación del texto…).

Un saludo.


#!/usr/bin/python

import telnetlib
import datetime
import time
import os
import sys
import subprocess
import zipfile
#import tftpy

now=datetime.datetime.now()

os.mkdir("/media/oscar/ALMACEN/Backups_Switches/Backup_Switches_" + now.strftime("%d%m%Y"))

listado=[]
respuesta=""
index=-1

with open("/home/oscar/Backup_Switches/lista","r") as origen:
for line in origen:
listado.append(line[:-1])

for elemento in listado:

datos=elemento.split(",")

host = datos[0]
tn=telnetlib.Telnet(host)
print "Conectado a " + host + " (" + datos[1] + ")"
time.sleep(2)
respuesta=tn.read_very_eager()
index=respuesta.find("Username:")
if index!=-1:
tn.write(datos[2] + "\n")
time.sleep(2)
tn.read_until("Password:")
tn.write(datos[3] + "\n")
time.sleep(2)
else:
tn.write("\n")
time.sleep(2)
if datos[2]!="":
prueba=tn.read_very_eager()
index1=prueba.find("Username:")
if index1!=-1:
#tn.read_until("Username:")
tn.write(datos[2] + "\n")
time.sleep(2)
tn.read_until("Password:")
tn.write(datos[3] + "\n")
time.sleep(2)
else:
tn.write(datos[3] + "\n")
time.sleep(2)
tn.read_until(str(datos[1]) + "#")
tn.write("terminal length 1000\n")
tn.write("show run\n")
time.sleep(2)
tn.write("exit\n")
time.sleep(2)
tn.write("exit\n")
time.sleep(2)
tn.write("y")
output = tn.read_all()
tn.close()
filename = "tmp"
fp=open(filename,"w")
fp.write(output + "\n")
fp.close()
with open("tmp") as myfile:
suma = sum(1 for line in myfile)
myfile.close()
contador = 1
with open("tmp","r") as input:
with open("/media/oscar/ALMACEN/Backups_Switches/Backup_Switches_" + now.strftime("%d%m%Y") + "/backup_" + datos[0] + "_" + now.strftime("%d%m%Y") + "_" + now.strftime("%H%M") + ".txt","wb") as output:
for line in input:
if contador!=1 and contador!=suma and contador!=suma-1:
output.write(line)
contador=contador+1
input.close()
output.close()
os.remove("tmp")

zf=zipfile.ZipFile("/media/oscar/ALMACEN/Backups_Switches/Backup_Switches_" + now.strftime("%d%m%Y") + ".zip", "w")
for dirname, subdirs, files in os.walk("/media/oscar/ALMACEN/Backups_Switches/Backup_Switches_" + now.strftime("%d%m%Y")):
zf.write(dirname)
for filename in files:
zf.write(os.path.join(dirname,filename))
zf.close()

for root, dirs, files in os.walk("/media/oscar/ALMACEN/Backups_Switches/Backup_Switches_" + now.strftime("%d%m%Y"), topdown=False):
for name in files:
os.remove(os.path.join(root,name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir("/media/oscar/ALMACEN/Backups_Switches/Backup_Switches_" + now.strftime("%d%m%Y"))

origen.close()
sys.exit()

De Nairobi a Rusia. Eso sí, pasando por mi PC.

Buenas de nuevo.

Hace un par de días, recibí en mi correo personal un correo de esos que traen sorpresas adjuntas. Esta vez, tocaba un documento Word escaneado en una fotocopiadora supuestamente de mi empresa y enviado por correo desde una cuenta de mi propio dominio.

Como esa noche no tenía ningún “proyecto Manhattan” pendiente, me propuse investigar un poco a ver qué podía sacar del citado documento. No pretende ser un “forense” en toda regla ni pretendo estar a la altura de grandes profesionales con los que me gusta comentar las jugadas por Twitter. Solamente pretendo explicar la información que he podido sacar del documento y como la he obtenido.

Vamos al lío. Continuar leyendo “De Nairobi a Rusia. Eso sí, pasando por mi PC.”