From 6f94f8be0821856d4486947b5ed002bbd34f319a Mon Sep 17 00:00:00 2001 From: Anil Kumar Muraleedharan Date: Fri, 17 Aug 2018 21:37:55 +0530 Subject: [PATCH] Update cnos_backup.py (#44246) * Update cnos_backup.py * Removing unused methods in cnos.py util file. --- lib/ansible/module_utils/network/cnos/cnos.py | 193 ------------------ .../modules/network/cnos/cnos_backup.py | 153 +++++++------- 2 files changed, 74 insertions(+), 272 deletions(-) diff --git a/lib/ansible/module_utils/network/cnos/cnos.py b/lib/ansible/module_utils/network/cnos/cnos.py index a1996c4e60..2a00633cd4 100644 --- a/lib/ansible/module_utils/network/cnos/cnos.py +++ b/lib/ansible/module_utils/network/cnos/cnos.py @@ -1363,101 +1363,6 @@ def portChannelConfig(module, prompt, answer): # 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( protocol, timeout, confServerIp, confPath, confServerUser, confServerPwd, obj): @@ -1560,104 +1465,6 @@ def doSecureStartUpConfigRollback( return retVal # 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( protocol, timeout, confServerIp, confPath, confServerUser, diff --git a/lib/ansible/modules/network/cnos/cnos_backup.py b/lib/ansible/modules/network/cnos/cnos_backup.py index 1add9baf8b..1fae9eeb63 100644 --- a/lib/ansible/modules/network/cnos/cnos_backup.py +++ b/lib/ansible/modules/network/cnos/cnos_backup.py @@ -33,7 +33,8 @@ DOCUMENTATION = ''' --- module: cnos_backup 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: - 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 @@ -45,9 +46,10 @@ description: Authentication details required by the remote server must be provided as well. This module uses SSH to manage network device configuration. 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. - For more information about this module from Lenovo and 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) + that must be created by the user in their local directory to where the + playbook is run. For more information about this module from Lenovo and + 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" extends_documentation_fragment: cnos options: @@ -65,8 +67,8 @@ options: - This refers to the protocol used by the network device to interact with the remote server to where to upload the backup configuration. The choices are FTP, SFTP, TFTP, or SCP. Any other - protocols will result in error. If this parameter is not specified, - there is no default value to be used. + protocols will result in error. If this parameter is + not specified, there is no default value to be used. required: Yes default: Null choices: [SFTP, SCP, FTP, TFTP] @@ -98,7 +100,8 @@ options: default: Null ''' 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 cnos_backup: @@ -170,17 +173,13 @@ msg: ''' import sys -try: - import paramiko - HAS_PARAMIKO = True -except ImportError: - HAS_PARAMIKO = False import time import socket import array import json import time import re +import os try: from ansible.module_utils.network.cnos import cnos HAS_LIB = True @@ -190,6 +189,60 @@ from ansible.module_utils.basic import AnsibleModule 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(): module = AnsibleModule( @@ -208,80 +261,22 @@ def main(): serverpassword=dict(required=False, no_log=True),), supports_check_mode=False) - username = module.params['username'] - password = module.params['password'] - enablePassword = module.params['enablePassword'] outputfile = module.params['outputfile'] - host = module.params['host'] - deviceType = module.params['deviceType'] - configType = module.params['configType'] protocol = module.params['protocol'].lower() - rcserverip = module.params['serverip'] - rcpath = module.params['rcpath'] - serveruser = module.params['serverusername'] - serverpwd = module.params['serverpassword'] - 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: - 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" + output = '' + if(protocol == "tftp" or protocol == "ftp" or + protocol == "sftp" or protocol == "scp"): + transfer_status = doConfigBackUp(module, None, None) else: - transfer_status = "Invalid configType Option" + transfer_status = "Invalid Protocol option" output = output + "\n Config Back Up status \n" + transfer_status # 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.write(output) file.close()