Update cnos_backup.py (#44246)

* Update cnos_backup.py

* Removing unused methods in cnos.py util file.
This commit is contained in:
Anil Kumar Muraleedharan 2018-08-17 21:37:55 +05:30 committed by Nathaniel Case
parent dafe633d02
commit 6f94f8be08
2 changed files with 74 additions and 272 deletions

View file

@ -1363,101 +1363,6 @@ def portChannelConfig(module, prompt, answer):
# EOM # EOM
def doStartupConfigBackUp(
protocol, timeout, confServerIp, confPath, confServerUser,
confServerPwd, obj):
# server = "10.241.105.214"
server = confServerIp
# username = "pbhosale"
username = confServerUser
# password = "Lab4man1"
password = confServerPwd
if((confPath is None) or (confPath is "")):
confPath = "cnos_config"
retVal = ""
# config backup command happens here
if(protocol == "ftp"):
command = "cp startup-config " + protocol + " " + protocol + "://" + \
username + "@" + server + "/" + confPath + " vrf management\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "Password:", 3, obj)
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(password, "#", timeout, obj)
elif(protocol == "tftp"):
command = "cp startup-config " + protocol + " " + protocol + \
"://" + server + "/" + confPath + " vrf management\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "#", 3, obj)
else:
return "Error-110"
return retVal
# EOM
# Utility Method to back up the start up config
# This method supports only SCP or SFTP
# Tuning of timeout parameter is pending
def doSecureStartupConfigBackUp(
protocol, timeout, confServerIp, confPath, confServerUser,
confServerPwd, obj):
# server = "10.241.105.214"
server = confServerIp
# username = "pbhosale"
username = confServerUser
# password = "Lab4man1"
password = confServerPwd
if((confPath is None) or (confPath is "")):
confPath = "cnos_config"
retVal = ""
# config backup command happens here
command = "cp startup-config " + protocol + " " + protocol + "://" + \
username + "@" + server + "/" + confPath + " vrf management\n"
# debugOutput(command)
response = waitForDeviceResponse(command, "(yes/no)", 3, obj)
if(response.lower().find('error-101')):
command = password + "\n"
retVal = retVal + waitForDeviceResponse(command, "#", timeout, obj)
return retVal
retVal = retVal + response
if(protocol == "scp"):
command = "yes \n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "timeout:", 3, obj)
command = "0\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "Password:", 3, obj)
elif(protocol == "sftp"):
command = "yes \n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "Password:", 3, obj)
else:
return "Error-110"
# Password entry happens here
# debugOutput(command)
command = password + "\n"
retVal = retVal + waitForDeviceResponse(command, "#", timeout, obj)
return retVal
# EOM
# Utility Method to restore the Running config
# This method supports only TFTP or FTP
# Tuning of timeout parameter is pending
def doStartUpConfigRollback( def doStartUpConfigRollback(
protocol, timeout, confServerIp, confPath, confServerUser, protocol, timeout, confServerIp, confPath, confServerUser,
confServerPwd, obj): confServerPwd, obj):
@ -1560,104 +1465,6 @@ def doSecureStartUpConfigRollback(
return retVal return retVal
# EOM # EOM
# Utility Method to back up the Running config
# This method supports only TFTP or FTP
# Tuning of timeout parameter is pending
def doRunningConfigBackUp(
protocol, timeout, confServerIp, confPath, confServerUser,
confServerPwd, obj):
# server = "10.241.105.214"
server = confServerIp
# username = "pbhosale"
username = confServerUser
# password = "Lab4man1"
password = confServerPwd
if((confPath is None) or (confPath is "")):
confPath = "cnos_config"
retVal = ""
# config backup command happens here
if(protocol == "ftp"):
command = "cp running-config " + protocol + " " + protocol + "://" + \
username + "@" + server + "/" + confPath + " vrf management\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "Password:", 3, obj)
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(password, "#", timeout, obj)
elif(protocol == "tftp"):
command = "cp running-config " + protocol + " " + protocol + \
"://" + server + "/" + confPath + " vrf management\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "#", 3, obj)
else:
return "Error-110"
return retVal
# EOM
# Utility Method to back up the running config
# This method supports only SCP or SFTP
# Tuning of timeout parameter is pending
def doSecureRunningConfigBackUp(
protocol, timeout, confServerIp, confPath, confServerUser,
confServerPwd, obj):
# server = "10.241.105.214"
server = confServerIp
# username = "pbhosale"
username = confServerUser
# password = "Lab4man1"
password = confServerPwd
if((confPath is None) or (confPath is "")):
confPath = "cnos_config"
retVal = ""
# config backup command happens here
command = "cp running-config " + protocol + " " + protocol + "://" + \
username + "@" + server + "/" + confPath + " vrf management\n"
# debugOutput(command)
response = waitForDeviceResponse(command, "(yes/no)", 3, obj)
if(response.lower().find('error-101')):
command = password + "\n"
retVal = retVal + waitForDeviceResponse(command, "#", timeout, obj)
return retVal
retVal = retVal + response
if(protocol == "scp"):
command = "yes \n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "timeout:", 3, obj)
command = "0\n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "Password:", 3, obj)
elif(protocol == "sftp"):
command = "yes \n"
# debugOutput(command)
retVal = retVal + waitForDeviceResponse(command, "Password:", 3, obj)
else:
return "Error-110"
# Password entry happens here
# debugOutput(command)
command = password + "\n"
retVal = retVal + waitForDeviceResponse(command, "#", timeout, obj)
return retVal
# EOM
# Utility Method to restore the Running config
# This method supports only TFTP or FTP
# Tuning of timeout parameter is pending
def doRunningConfigRollback( def doRunningConfigRollback(
protocol, timeout, confServerIp, confPath, confServerUser, protocol, timeout, confServerIp, confPath, confServerUser,

View file

@ -33,7 +33,8 @@ DOCUMENTATION = '''
--- ---
module: cnos_backup module: cnos_backup
author: "Anil Kumar Muraleedharan (@amuraleedhar)" author: "Anil Kumar Muraleedharan (@amuraleedhar)"
short_description: Backup the current running or startup configuration to a remote server on devices running Lenovo CNOS short_description: Backup the current running or startup configuration to a
remote server on devices running Lenovo CNOS
description: description:
- This module allows you to work with switch configurations. It provides a - This module allows you to work with switch configurations. It provides a
way to back up the running or startup configurations of a switch to a way to back up the running or startup configurations of a switch to a
@ -45,9 +46,10 @@ description:
Authentication details required by the remote server must be provided as Authentication details required by the remote server must be provided as
well. This module uses SSH to manage network device configuration. well. This module uses SSH to manage network device configuration.
The results of the operation will be placed in a directory named 'results' The results of the operation will be placed in a directory named 'results'
that must be created by the user in their local directory to where the playbook is run. that must be created by the user in their local directory to where the
For more information about this module from Lenovo and customizing it usage for your playbook is run. For more information about this module from Lenovo and
use cases, please visit U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_backup.html) customizing it usage for your use cases, please visit
U(http://systemx.lenovofiles.com/help/index.jsp?topic=%2Fcom.lenovo.switchmgt.ansible.doc%2Fcnos_backup.html)
version_added: "2.3" version_added: "2.3"
extends_documentation_fragment: cnos extends_documentation_fragment: cnos
options: options:
@ -65,8 +67,8 @@ options:
- This refers to the protocol used by the network device to - This refers to the protocol used by the network device to
interact with the remote server to where to upload the backup interact with the remote server to where to upload the backup
configuration. The choices are FTP, SFTP, TFTP, or SCP. Any other configuration. The choices are FTP, SFTP, TFTP, or SCP. Any other
protocols will result in error. If this parameter is not specified, protocols will result in error. If this parameter is
there is no default value to be used. not specified, there is no default value to be used.
required: Yes required: Yes
default: Null default: Null
choices: [SFTP, SCP, FTP, TFTP] choices: [SFTP, SCP, FTP, TFTP]
@ -98,7 +100,8 @@ options:
default: Null default: Null
''' '''
EXAMPLES = ''' EXAMPLES = '''
Tasks : The following are examples of using the module cnos_backup. These are written in the main.yml file of the tasks directory. Tasks : The following are examples of using the module cnos_backup.
These are written in the main.yml file of the tasks directory.
--- ---
- name: Test Running Config Backup - name: Test Running Config Backup
cnos_backup: cnos_backup:
@ -170,17 +173,13 @@ msg:
''' '''
import sys import sys
try:
import paramiko
HAS_PARAMIKO = True
except ImportError:
HAS_PARAMIKO = False
import time import time
import socket import socket
import array import array
import json import json
import time import time
import re import re
import os
try: try:
from ansible.module_utils.network.cnos import cnos from ansible.module_utils.network.cnos import cnos
HAS_LIB = True HAS_LIB = True
@ -190,6 +189,60 @@ from ansible.module_utils.basic import AnsibleModule
from collections import defaultdict from collections import defaultdict
# Utility Method to back up the running config or start up copnfig
# This method supports only SCP or SFTP or FTP or TFTP
# Tuning of timeout parameter is pending
def doConfigBackUp(module, prompt, answer):
host = module.params['host']
server = module.params['serverip']
username = module.params['serverusername']
password = module.params['serverpassword']
protocol = module.params['protocol'].lower()
rcPath = module.params['rcpath']
configType = module.params['configType']
confPath = rcPath + host + '_' + configType + '.txt'
retVal = ''
# config backup command happens here
command = "copy " + configType + " " + protocol + " " + protocol + "://"
command = command + username + "@" + server + "/" + confPath
command = command + " vrf management\n"
cnos.debugOutput(command + "\n")
# cnos.checkForFirstTimeAccess(module, command, 'yes/no', 'yes')
cmd = []
if(protocol == "scp"):
scp_cmd1 = [{'command': command, 'prompt': 'timeout:', 'answer': '0'}]
scp_cmd2 = [{'command': '\n', 'prompt': 'Password:',
'answer': password}]
cmd.extend(scp_cmd1)
cmd.extend(scp_cmd2)
retVal = retVal + str(cnos.run_cnos_commands(module, cmd))
elif(protocol == "sftp"):
sftp_cmd = [{'command': command, 'prompt': 'Password:',
'answer': password}]
cmd.extend(sftp_cmd)
retVal = retVal + str(cnos.run_cnos_commands(module, cmd))
elif(protocol == "ftp"):
ftp_cmd = [{'command': command, 'prompt': 'Password:',
'answer': password}]
cmd.extend(ftp_cmd)
retVal = retVal + str(cnos.run_cnos_commands(module, cmd))
elif(protocol == "tftp"):
command = "copy " + configType + " " + protocol + " " + protocol
command = command + "://" + server + "/" + confPath
command = command + + " vrf management\n"
# cnos.debugOutput(command)
tftp_cmd = [{'command': command, 'prompt': None, 'answer': None}]
cmd.extend(tftp_cmd)
retVal = retVal + str(cnos.run_cnos_commands(module, cmd))
else:
return "Error-110"
return retVal
# EOM
def main(): def main():
module = AnsibleModule( module = AnsibleModule(
@ -208,80 +261,22 @@ def main():
serverpassword=dict(required=False, no_log=True),), serverpassword=dict(required=False, no_log=True),),
supports_check_mode=False) supports_check_mode=False)
username = module.params['username']
password = module.params['password']
enablePassword = module.params['enablePassword']
outputfile = module.params['outputfile'] outputfile = module.params['outputfile']
host = module.params['host']
deviceType = module.params['deviceType']
configType = module.params['configType']
protocol = module.params['protocol'].lower() protocol = module.params['protocol'].lower()
rcserverip = module.params['serverip'] output = ''
rcpath = module.params['rcpath'] if(protocol == "tftp" or protocol == "ftp" or
serveruser = module.params['serverusername'] protocol == "sftp" or protocol == "scp"):
serverpwd = module.params['serverpassword'] transfer_status = doConfigBackUp(module, None, None)
output = ""
timeout = 90
tftptimeout = 450
if not HAS_PARAMIKO:
module.fail_json(msg='paramiko is required for this module')
# Create instance of SSHClient object
remote_conn_pre = paramiko.SSHClient()
# Automatically add untrusted hosts (make sure okay for security policy in
# your environment)
remote_conn_pre.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# initiate SSH connection with the switch
remote_conn_pre.connect(host, username=username, password=password)
time.sleep(2)
# Use invoke_shell to establish an 'interactive session'
remote_conn = remote_conn_pre.invoke_shell()
time.sleep(2)
#
# Enable and then send command
output = output + cnos.waitForDeviceResponse("\n", ">", 2, remote_conn)
output = output + \
cnos.enterEnableModeForDevice(enablePassword, 3, remote_conn)
# Make terminal length = 0
output = output + \
cnos.waitForDeviceResponse("terminal length 0\n", "#", 2, remote_conn)
# Invoke method for config transfer from server
if(configType == 'running-config'):
if(protocol == "tftp" or protocol == "ftp"):
transfer_status = cnos.doRunningConfigBackUp(
protocol, tftptimeout, rcserverip, rcpath, serveruser,
serverpwd, remote_conn)
elif(protocol == "sftp" or protocol == "scp"):
transfer_status = cnos.doSecureRunningConfigBackUp(
protocol, timeout, rcserverip, rcpath, serveruser,
serverpwd, remote_conn)
else: else:
transfer_status = "Invalid Protocol option" transfer_status = "Invalid Protocol option"
elif(configType == 'startup-config'):
if(protocol == "tftp" or protocol == "ftp"):
transfer_status = cnos.doStartupConfigBackUp(
protocol, tftptimeout, rcserverip, rcpath, serveruser,
serverpwd, remote_conn)
elif(protocol == "sftp" or protocol == "scp"):
transfer_status = cnos.doSecureStartupConfigBackUp(
protocol, timeout, rcserverip, rcpath, serveruser, serverpwd,
remote_conn)
else:
transfer_status = "Invalid Protocol option"
else:
transfer_status = "Invalid configType Option"
output = output + "\n Config Back Up status \n" + transfer_status output = output + "\n Config Back Up status \n" + transfer_status
# Save it into the file # Save it into the file
path = outputfile.rsplit('/', 1)
# cnos.debugOutput(path[0])
if not os.path.exists(path[0]):
os.makedirs(path[0])
file = open(outputfile, "a") file = open(outputfile, "a")
file.write(output) file.write(output)
file.close() file.close()