Copia de respaldo automatica del archivo de configuracion de Switches CloudEngine con Python 3 Destacado

Última respuesta nov. 11, 2019 10:12:42 192 17 7 2

Buen día.

Comparto con todos ustedes, el siguiente ejemplo de script de Python para hacer copia de respaldo automatica del archivo de configuración en Switches CloudEngine.


Requerimientos.

Como se muestra en la siguiente imagen, el servidor remoto es un servidor FTP. SwitchA y el servidor FTP tienen rutas accesibles entre sí. El administrador requiere que SwitchA realice una copia de seguridad automática del archivo de configuración en el servidor FTP cada vez que se modifica y guarda la configuración, lo que reduce la carga de trabajo de la copia de seguridad manual.


NOTA:

El protocolo FTP traerá riesgo a la seguridad del switch. Se recomienda el modo SFTP.


imgDownload?uuid=ad99e662ae8e47329baa8cf


Configuraciones.


  1. Creeamos un script de Python que pueda obtener y enviar el archivo de configuración actual a un servidor FTP.
  2. Cargamos el script de Python en SwitchA e instalamos el script.
  3. Enlazamos el script de Python a un asistente de comando y establecemos la condición de activación del asistente para el evento de cambio de configuración. Luego, el asistente puede ejecutar el script Python automáticamente cuando cambia el archivo de configuración.


1. Hacemos un script de Python.

# Creamos un script de Python llamado backupconfig.py. Para obtener detalles sobre el formato del script, consulte el ejemplo del script backupconfig.py. Este script de Python implementa las siguientes funciones:


  • Obtiene la configuración actual utilizando las API descritas en la Referencia de API RESTful.

  • Envía el archivo de configuración actual al servidor FTP.


2. Cargamos e instalamos el script de Python.

# Suponga que el script de Python se guarda en el servidor FTP. Suba la secuencia de comandos de Python a SwitchA mediante FTP.

<HUAWEI> system-view[~HUAWEI] sysname SwitchA[*HUAWEI] commit[~SwitchA] quit<SwitchA> ftp 192.168.20.1Trying 192.168.20.1 ...
Press CTRL + K to abort
Connected to 192.168.20.1.
220 FTP Server ready.
User(192.168.20.1:(none)):ftpuser331 Password required for ftpuser.
Enter password:
230 User ftpuser logged in.
[ftp] binary200 Type set to I.
[ftp] get backupconfig.py213 3659
200 Port command successful.
150 Opening data connection for backupconfig.py.
\     100% [***********]
226 File sent ok

FTP: 3659 byte(s) received in 1.610 second(s) 2.219Kbyte(s)/sec.
[ftp] bye221 Goodbye.

# Instalamos el script de Python en SwitchA.

<SwitchA> ops install file backupconfig.py

# Después de instalar el script de Python, ejecutamos el comando ops run python file-name para ejecutar manualmente el script y verificar si hay un archivo de configuración de respaldo en el servidor FTP. Si el archivo de configuración de respaldo existe, el script puede implementar la función de respaldo del archivo de configuración.


Configuramos un asistente de comando.

# Creamos un asistente de comando y establecemos la condición de activación del asistente para el evento de cambio del archivo de configuración (cfg_file_change). Enlazamos el script de Python backupconfig.py al asistente.

<SwitchA> system-view

[~SwitchA] ops

[~SwitchA-ops] assistant backup_config

[*SwitchA-ops-assistant-backup_config] condition event feature configuration name cfg_file_change

[*SwitchA-ops-assistant-backup_config] execute 1 python backupconfig.py

[*SwitchA-ops-assistant-backup_config] commit

[~SwitchA-ops-assistant-backup_config] return

Validamos la configuración.

# Validamos la configuración del asistente.

<SwitchA> display ops assistant verbose name backup_configAssistant information
  Name                 : backup_config
  State                : ready
  Type                 : command
  Default assistant    : no
 Running statistics
  Running times        : 0
  Queue size/(free)    : 10/(10)
  Skip for queue full  : 0
  Skip for delay       : 0
  Skip for suppression : 0
  Skip for error       : 0
 Execute information
  Task abstract        : backupconfig.py
 Trigger control
  Occurs threshold     : 1
  Period (s)           : 30
  Delay (s)            : 0
  Suppress max         : 0
  Hits in period       : 0
 Condition information
  Correlate expression :
  Condition tag        :
    Condition type     : event
    Subscribe result   : success
    Occurs threshold   : 0
    Period (s)         : 0
    Hits in period     : 0

# Una vez completada la configuración, ejecutamos el comando guardar, para guardar la configuración y luego validamos si se guarda un archivo de configuración de respaldo en el servidor FTP.


Ejemplo de script backupconfig.py

#!/usr/bin/env python

import traceback
import httplib
import string

class OPSConnection(object):
    """Make an OPS connection instance."""

    def __init__(self, host, port = 80):
        self.host = host
        self.port = port
        self.headers = {
            "Content-type": "text/xml",
            "Accept":       "text/xml"
            }
        self.conn = None

    def close(self):
        """Close the connection"""
        self.conn.close()

    def create(self, uri, req_data):
        """Create operation"""
        ret = self.rest_call("POST", uri, req_data)
        return ret

    def delete(self, uri, req_data):
        """Delete operation"""
        ret = self.rest_call("DELETE", uri, req_data)
        return ret

    def get(self, uri, req_data = None):
        """Get operation"""
        ret = self.rest_call("GET", uri, req_data)
        return ret

    def set(self, uri, req_data):
        """Set operation"""
        ret = self.rest_call("PUT", uri, req_data)
        return ret

    def rest_call(self, method, uri, req_data):
        """REST call"""
        print('|---------------------------------- request: ----------------------------------|')
        print('%s %s HTTP/1.1\n' % (method, uri))
        if req_data == None:
            body = ""
        else:
            body = req_data
            print(body)
        if self.conn:
            self.conn.close()
        self.conn = httplib.HTTPConnection(self.host, self.port)

        self.conn.request(method, uri, body, self.headers)
        response = self.conn.getresponse()
        response.status = httplib.OK    # stub code
        ret = (response.status, response.reason, response.read())
        print('|---------------------------------- response: ---------------------------------|')
        print('HTTP/1.1 %s %s\n\n%s' % ret)
        print('|------------------------------------------------------------------------------|')
        return ret

def get_startup_info(ops_conn):
    """Get startup info. """

    uri = "/cfg/startupInfos/startupInfo"
    req_data = \
'''<?xml version="1.0" encoding="UTF-8"?>
<startupInfo>
</startupInfo>
'''
    ret, _, rsp_data = ops_conn.get(uri, req_data)
    if ret != httplib.OK:
        return None

    return rsp_data

def backup_file(ops_conn,cfgFileName):
	"""Copy configuration."""

	uri = "/ftpc/ftpcTransferFiles/ftpcTransferFile"
	str_temp = string.Template(
'''<?xml version="1.0" encoding="UTF-8"?>
<ftpcTransferFile>
	<serverIpv4Address>192.168.20.1</serverIpv4Address>
	<commandType>put</commandType>
	<userName>ftpuser</userName>
	<password>pwd123</password>
	<localFileName>$srcFileName</localFileName>
	<remoteFileName>$desFileName</remoteFileName>
</ftpcTransferFile>
''')

	req_data = str_temp.substitute(srcFileName = cfgFileName,desFileName = cfgFileName.strip('flash:/'))
	ret, _, rsp_data = ops_conn.create(uri, req_data)
	if ret != httplib.OK:
		return None
	return rsp_data

def main():
    """The main function."""

    host = "localhost"
    try:
        ops_conn = OPSConnection(host)
        print('+-------------------------- Open a OPS connection. ----------------------------+')
        rsp_data = get_startup_info(ops_conn)
        if rsp_data is not None:
            cfgFileName = rsp_data[rsp_data.find("curStartupFile")+15 : rsp_data.find("/curStartupFile")-1]
            backup_file(ops_conn,cfgFileName)
        ops_conn.close()
        print('+-------------------------- Close a OPS connection. ---------------------------+')
        return
    except:
        errinfo = traceback.format_exc()
        print(errinfo)
        return

if __name__ == "__main__":
    main()

Descripción del script backupconfig.py

#!/usr/bin/env python

import traceback
import httplib
import string

En conocimiento de Python, el campo de importación se utiliza para importar módulos. Un módulo es un archivo de algunas funciones y clases para lograr algunos propósitos.


Puede importar módulos de acuerdo con los requisitos del servicio.

class OPSConnection(object):
    """Make an OPS connection instance."""    def __init__(self, host, port = 80):
        self.host = host
        self.port = port
        self.headers = {
            "Content-type": "text/xml",
            "Accept":       "text/xml"
            }
        self.conn = None    def close(self):
        """Close the connection"""
        self.conn.close()    def create(self, uri, req_data):
        """Create operation"""
        ret = self.rest_call("POST", uri, req_data)
        return ret    def delete(self, uri, req_data):
        """Delete operation"""
        ret = self.rest_call("DELETE", uri, req_data)
        return ret    def get(self, uri, req_data = None):
        """Get operation"""
        ret = self.rest_call("GET", uri, req_data)
        return ret    def set(self, uri, req_data):
        """Set operation"""
        ret = self.rest_call("PUT", uri, req_data)
        return ret    def rest_call(self, method, uri, req_data):
        """REST call"""
        print('|---------------------------------- request: ----------------------------------|')
        print('%s %s HTTP/1.1\n' % (method, uri))
        if req_data == None:
            body = ""
        else:
            body = req_data
            print(body)
        if self.conn:
            self.conn.close()
        self.conn = httplib.HTTPConnection(self.host, self.port)

        self.conn.request(method, uri, body, self.headers)
        response = self.conn.getresponse()
        response.status = httplib.OK    # stub code
        ret = (response.status, response.reason, response.read())
        print('|---------------------------------- response: ---------------------------------|')
        print('HTTP/1.1 %s %s\n\n%s' % ret)
        print('|------------------------------------------------------------------------------|')
        return ret

OPSConnection es una clase utilizada para invocar la API RESTful. Esta clase define algunos métodos para realizar las operaciones de configuración de una conexión HTTP:

  • def __init __ (): es una clase de inicialización que crea una conexión HTTP.

  • def close (): cierra una conexión HTTP.

  • def create (): crea recursos del dispositivo.

  • def delete (): elimina los recursos del dispositivo.

  • def get (): consulta los recursos del dispositivo.

  • def set (): modifica los recursos del dispositivo.

  • def rest_call (): invoca clases internamente.

Puede invocar esta parte del script sin modificarlo.

def get_startup_info(ops_conn):
    """Get startup info. """    uri = "/cfg/startupInfos/startupInfo" req_data = \
'''<?xml version="1.0" encoding="UTF-8"?>
<startupInfo>
</startupInfo>
'''
 ret, _, rsp_data = ops_conn.get(uri, req_data)
    if ret != httplib.OK:
        return None

    return rsp_data

Define la función para consultar la información de inicio del dispositivo.

uri = "/ cfg / startupInfos / startupInfo" indica el identificador uniforme de recursos (URI) del objeto a gestionar. Para más detalles, vea API RESTful.

req_data = indica la solicitud que se enviará.

ret, _, rsp_data = ops_conn.get (uri, req_data) indica una solicitud para obtener algunos datos. Para obtener detalles, consulte los métodos de solicitud definidos en la clase OPSConnection.

rsp_data indica los datos enviados por el dispositivo en respuesta a la solicitud.

def backup_file(ops_conn,cfgFileName):
	"""Copy configuration."""

	uri = "/ftpc/ftpcTransferFiles/ftpcTransferFile"
	str_temp = string.Template(
'''<?xml version="1.0" encoding="UTF-8"?>
<ftpcTransferFile>
	<serverIpv4Address>192.168.20.1</serverIpv4Address>
	<commandType>put</commandType>
	<userName>ftpuser</userName>
	<password>pwd123</password>
	<localFileName>$srcFileName</localFileName>
	<remoteFileName>$desFileName</remoteFileName>
</ftpcTransferFile>
''')

	req_data = str_temp.substitute(srcFileName = cfgFileName,desFileName = cfgFileName.strip('flash:/'))
	ret, _, rsp_data = ops_conn.create(uri, req_data)
	if ret != httplib.OK:
		return None
	return rsp_data

Defina la función utilizada para hacer una copia de respaldo del archivo de configuración en un servidor. El formato de la función es similar a get_startup_info ().

def main():
    """The main function."""    host = "localhost"
    try:        ops_conn = OPSConnection(host)
        print('+-------------------------- Open a OPS connection. ----------------------------+')        rsp_data = get_startup_info(ops_conn)
        if rsp_data is not None:
            cfgFileName = rsp_data[rsp_data.find("curStartupFile")+15 : rsp_data.find("/curStartupFile")-1]
            backup_file(ops_conn,cfgFileName)        ops_conn.close()
        print('+-------------------------- Close a OPS connection. ---------------------------+')
        return
    except:
        errinfo = traceback.format_exc()
        print(errinfo)
        return

if __name__ == "__main__":
    main()

La función main () define las operaciones que debe realizar este script. Puede modificar la función según los requisitos del servicio.

host = indica una dirección de loop. Actualmente, la API RESTful solo se puede invocar dentro del dispositivo. Es decir, el valor es localhost.

ops_conn = OPSConnection (host) indica la operación de configurar una conexión HTTP.

rsp_data = get_startup_info (ops_conn) indica la operación de invocar funciones.

ops_conn.close () indica la operación de cerrar una conexión HTTP.


Archivo de configuración de SwitchA

#
sysname SwitchA
#
ops
 assistant backup_config
  execute 1 python backupconfig.py
  condition event feature configuration name CFG_FILE_CHANGE
#
return


Cualquier comentario sera bienvenido.


Saludos!

  • x
  • convención:

Gustavo.HdezF
Moderador Publicado 2019-10-9 11:37:36 Útil(0) Útil(0)
Interesante tema para automatizar algunas actividades de operación y mantenimiento. Gracias por compartir esta información en el foro. Saludos.
  • x
  • convención:

Jorge
Jorge Publicado 2019-10-24 08:29
@Gustavo.HdezF Gracias por tu comentario. Saludos!  
Ingeniero%20en%20Comunicaciones%20y%20Electr%C3%B3nica%20con%2020%20a%C3%B1os%20de%20experiencia%20en%20el%20%C3%A1rea%20de%20las%20telecomunicaciones%20para%20voz%20y%20datos%2C%20comparto%20mi%20experiencia%20dando%20clases%20en%20la%20Universidad%20Polit%C3%A9cnica%20de%20Quer%C3%A9taro.
gabo.lr
VIP Publicado 2019-10-14 07:24:01 Útil(0) Útil(0)
Excelente aporte, gracias por compartir la información!! Saludos
  • x
  • convención:

Jorge
Jorge Publicado 2019-10-14 07:49
@gabo.lr buen día. Gracias por tu comentario. Saludos!  
Telecommunications%20and%20Electronics%20Engineer%2C%20with%208%20years%20of%20experience%20working%20with%20Huawei%20equipment.
Aurea
Admin Publicado 2019-10-14 07:51:45 Útil(0) Útil(0)
Excelente aporte Jorge!Copia de respaldo automatica del archivo de configuracion de Switches CloudEngine con Python 3-3081650-1
  • x
  • convención:

Jorge
Jorge Publicado 2019-10-24 08:30
@Aurea gracias por tu comentario. Saludos!  
Ingeniera%20en%20Tel%C3%A9matica%2C%20me%20gusta%20hacer%20bromas%20y%20re%C3%ADr%2C%20soy%20nueva%20en%20esto%20%3A)
mcalderon
Publicado 2019-10-24 02:09:50 Útil(1) Útil(1)
Excelente aporte Jorge :)
Copia de respaldo automatica del archivo de configuracion de Switches CloudEngine con Python 3-3094094-1
  • x
  • convención:

Jorge
Jorge Publicado 2019-10-24 08:31
@mcalderon gracias por tu comentario. Saludos!  
Profesional%20del%20UNMSM%20(Lima%2C%20Per%C3%BA)%20con%20conocimentos%20y%20experiencia%20en%20Networking%2C%20Seguridad%20de%20la%20Informaci%C3%B3n%20y%20Telecomunicaciones.
Jfriash
Publicado 2019-11-4 16:52:20 Útil(0) Útil(0)
Excelente aportación muchas Gracias!
  • x
  • convención:

Hola%20mi%20nombre%20es%20Jorge%20Arturo%20Frias%20Hernandez%2C%20trabajo%20en%20Zona%20IP%20y%20estoy%20estudiando%20la%20carrera%20de%20Ing.%20Mecatronica.%20Me%20gustan%20la%20inform%C3%A1tica%20y%20es%20algo%20a%20lo%20que%20me%20eh%20dedicado%20toda%20mi%20vida%20laboral%2C%20me%20gusta%20aprender%20y%20compartir%20conocimiento.
Wutang
Publicado 2019-11-4 18:07:03 Útil(0) Útil(0)
Excelente aportacion, muchas gracias!
  • x
  • convención:

IT%20service%20desk%2C%20dos%20a%C3%B1os%20de%20experiencia%20en%20soporte%20t%C3%A9cnico%20y%20aficionado%20a%20Datacom
Michely
VIP Publicado 2019-11-5 05:22:00 Útil(0) Útil(0)
Excelente material muchas gracias
  • x
  • convención:

Ing. Michely Lopez
mcalderon
Publicado hace 5 días Útil(0) Útil(0)
Excelente aporte. Gracias
  • x
  • convención:

Jorge
VIP Publicado hace 3 días Útil(0) Útil(0)
Publicado por Jfriash a las 2019-11-04 02:52 Excelente aportación muchas Gracias!
@jfriash, gracias por tu comentario. Saludos!
  • x
  • convención:

Senior Cybersecurity Engineer
12
Volver a la lista

Comentar

Responder
Debe iniciar sesión para responder la publicación Inicio de sesión | Registrarse

Aviso Aviso: Para garantizar sus legítimos derechos e intereses, la comunidad y los terceros no publicarán contenido que pueda generar riesgos legales a las partes, por ejemplo, pornografía, contenido político, contenido sobre juego, consumo y tráfico de drogas, así como contenido que viole los derechos de propiedad intelectual de terceros, por ejemplo, secretos comerciales, marcas, derechos de autor, patentes y privacidad personal. No comparta su cuenta ni su contraseña con terceros. Todas las operaciones realizadas usando su cuenta se considerarán como sus acciones y todas las consecuencias que estas acciones generen serán responsabilidad suya. Para obtener información detallada, consulte la “ Política de privacidad.”
Si el botón para adjuntar no está disponible, actualice Adobe Flash Player con la versión más reciente
¡Ingresa y disfruta de todos los beneficios para los miembros!

¡Ingresa y disfruta de todos los beneficios para los miembros!

Aterrizaje