1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00
community.general/plugins/modules/network/icx/icx_copy.py
Ansible Core Team aebc1b03fd Initial commit
2020-03-09 09:11:07 +00:00

372 lines
15 KiB
Python

#!/usr/bin/python
# Copyright: Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: icx_copy
author: "Ruckus Wireless (@Commscope)"
short_description: Transfer files from or to remote Ruckus ICX 7000 series switches
description:
- This module transfers files from or to remote devices running ICX.
notes:
- Tested against ICX 10.1.
- For information on using ICX platform, see L(the ICX OS Platform Options guide,../network/user_guide/platform_icx.html).
options:
upload:
description:
- Name of the resource to be uploaded. Mutually exclusive with download.
type: str
choices: ['running-config', 'startup-config', 'flash_primary', 'flash_secondary']
download:
description:
- Name of the resource to be downloaded. Mutually exclusive with upload.
type: str
choices: ['running-config', 'startup-config', 'flash_primary', 'flash_secondary', 'bootrom', 'fips-primary-sig', 'fips-secondary-sig', 'fips-bootrom-sig']
protocol:
description:
- Data transfer protocol to be used
type: str
choices: ['scp', 'https']
required: true
remote_server:
description:
- IP address of the remote server
type: str
required: true
remote_port:
description:
- The port number of the remote host. Default values will be selected based on protocol type.
Default scp:22, http:443
type: str
remote_filename:
description:
- The name or path of the remote file/resource to be uploaded or downloaded.
type: str
required: true
remote_user:
description:
- remote username to be used for scp login.
type: str
remote_pass:
description:
- remote password to be used for scp login.
type: str
public_key:
description:
- public key type to be used to login to scp server
type: str
choices: ['rsa', 'dsa']
'''
EXAMPLES = """
- name: upload running-config to the remote scp server
icx_copy:
upload: running-config
protocol: scp
remote_server: 172.16.10.49
remote_filename: running.conf
remote_user: user1
remote_pass: pass123
- name: download running-config from the remote scp server
icx_copy:
download: running-config
protocol: scp
remote_server: 172.16.10.49
remote_filename: running.conf
remote_user: user1
remote_pass: pass123
- name: download running-config from the remote scp server using rsa public key
icx_copy:
download: running-config
protocol: scp
remote_server: 172.16.10.49
remote_filename: running.conf
remote_user: user1
remote_pass: pass123
public_key: rsa
- name: upload startup-config to the remote https server
icx_copy:
upload: startup-config
protocol: https
remote_server: 172.16.10.49
remote_filename: config/running.conf
remote_user: user1
remote_pass: pass123
- name: upload startup-config to the remote https server
icx_copy:
upload: startup-config
protocol: https
remote_server: 172.16.10.49
remote_filename: config/running.conf
remote_user: user1
remote_pass: pass123
- name: Download OS image into the flash from remote scp ipv6 server
icx_copy:
download: startup-config
protocol: scp
remote_server: ipv6 FE80:CD00:0000:0CDE:1257:0000:211E:729C
remote_filename: img.bin
remote_user: user1
remote_pass: pass123
- name: Download OS image into the secondary flash from remote scp ipv6 server
icx_copy:
Download: flash_secondary
protocol: scp
remote_server: ipv6 FE80:CD00:0000:0CDE:1257:0000:211E:729C
remote_filename: img.bin
remote_user: user1
remote_pass: pass123
- name: Download OS image into the secondary flash from remote scp ipv6 server on port 5000
icx_copy:
Download: flash_secondary
protocol: scp
remote_server: ipv6 FE80:CD00:0000:0CDE:1257:0000:211E:729C
remote_port: 5000
remote_filename: img.bin
remote_user: user1
remote_pass: pass123
- name: Download OS image into the primary flash from remote https ipv6 server
icx_copy:
Download: flash_primary
protocol: https
remote_server: ipv6 FE80:CD00:0000:0CDE:1257:0000:211E:729C
remote_filename: images/img.bin
remote_user: user1
remote_pass: pass123
- name: Download OS image into the primary flash from remote https ipv6 server on port 8080
icx_copy:
Download: flash_primary
protocol: https
remote_server: ipv6 FE80:CD00:0000:0CDE:1257:0000:211E:729C
remote_port: 8080
remote_filename: images/img.bin
remote_user: user1
remote_pass: pass123
"""
RETURN = """
changed:
description: true when downloaded any configuration or flash. false otherwise.
returned: always
type: bool
"""
from ansible.module_utils._text import to_text
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.connection import ConnectionError, exec_command
from ansible_collections.community.general.plugins.module_utils.network.icx.icx import exec_scp, run_commands
def map_params_to_obj(module):
command = dict()
if(module.params['protocol'] == 'scp'):
if(module.params['upload'] is not None):
module.params["upload"] = module.params["upload"].replace("flash_primary", "primary")
module.params["upload"] = module.params["upload"].replace("flash_secondary", "secondary")
if(module.params["upload"] == 'running-config' or module.params["upload"] == 'startup-config'):
command["command"] = "copy %s scp %s%s %s%s" % (module.params['upload'],
module.params["remote_server"],
" " + module.params["remote_port"] if module.params["remote_port"] else "",
module.params["remote_filename"],
"public-key " + module.params["public_key"] if module.params["public_key"] else "")
else:
command["command"] = "copy flash scp %s%s %s%s %s" % (module.params["remote_server"],
" " + module.params["remote_port"] if module.params["remote_port"] else "",
module.params["remote_filename"],
"public-key " + module.params["public_key"] if module.params["public_key"] else "",
module.params["upload"])
command["scp_user"] = module.params["remote_user"]
command["scp_pass"] = module.params["remote_pass"]
if(module.params['download'] is not None):
module.params["download"] = module.params["download"].replace("flash_primary", "primary")
module.params["download"] = module.params["download"].replace("flash_secondary", "secondary")
if(module.params["download"] == 'running-config' or module.params["download"] == 'startup-config'):
command["command"] = "copy scp %s %s%s %s%s" % (module.params['download'],
module.params["remote_server"],
" " + module.params["remote_port"] if module.params["remote_port"] else "",
module.params["remote_filename"],
"public-key " + module.params["public_key"] if module.params["public_key"] else "")
else:
command["command"] = "copy scp flash %s%s %s%s %s" % (module.params["remote_server"],
" " + module.params["remote_port"] if module.params["remote_port"] else "",
module.params["remote_filename"],
"public-key " + module.params["public_key"] if module.params["public_key"] else "",
module.params["download"])
command["scp_user"] = module.params["remote_user"]
command["scp_pass"] = module.params["remote_pass"]
if(module.params['protocol'] == 'https'):
if(module.params['upload'] is not None):
module.params["upload"] = module.params["upload"].replace("flash_primary", "primary")
module.params["upload"] = module.params["upload"].replace("flash_secondary", "secondary")
if(module.params["upload"] == 'running-config' or module.params["upload"] == 'startup-config'):
command["command"] = "copy %s https %s %s%s" % (module.params['upload'],
module.params["remote_server"],
module.params["remote_filename"],
" port " + module.params["remote_port"] if module.params["remote_port"] else "")
else:
command["command"] = "copy https flash %s %s %s%s" % (module.params["remote_server"],
module.params["remote_filename"],
module.params['upload'],
" port " + module.params["remote_port"] if module.params["remote_port"] else "")
if(module.params['download'] is not None):
module.params["download"] = module.params["download"].replace("flash_primary", "primary")
module.params["download"] = module.params["download"].replace("flash_secondary", "secondary")
if(module.params["download"] == 'running-config' or module.params["download"] == 'startup-config'):
command["command"] = "copy https %s %s %s%s" % (module.params['download'],
module.params["remote_server"],
module.params["remote_filename"],
" port " + module.params["remote_port"] if module.params["remote_port"] else "")
else:
command["command"] = "copy https flash %s %s %s%s" % (module.params["remote_server"],
module.params["remote_filename"],
module.params['download'],
" port " + module.params["remote_port"] if module.params["remote_port"] else "")
return command
def checkValidations(module):
validation = dict(
scp=dict(
upload=[
'running-config',
'startup-config',
'flash_primary',
'flash_secondary'],
download=[
'running-config',
'startup-config',
'flash_primary',
'flash_secondary',
'bootrom',
'fips-primary-sig',
'fips-secondary-sig',
'fips-bootrom-sig']),
https=dict(
upload=[
'running-config',
'startup-config'],
download=[
'flash_primary',
'flash_secondary',
'startup-config']))
protocol = module.params['protocol']
upload = module.params['upload']
download = module.params['download']
if(protocol == 'scp' and module.params['remote_user'] is None):
module.fail_json(msg="While using scp remote_user argument is required")
if(upload is None and download is None):
module.fail_json(msg="Upload or download params are required.")
if(upload is not None and download is not None):
module.fail_json(msg="Only upload or download can be used at a time.")
if(upload):
if(not (upload in validation.get(protocol).get("upload"))):
module.fail_json(msg="Specified resource '" + upload + "' can't be uploaded to '" + protocol + "'")
if(download):
if(not (download in validation.get(protocol).get("download"))):
module.fail_json(msg="Specified resource '" + download + "' can't be downloaded from '" + protocol + "'")
def main():
"""entry point for module execution
"""
argument_spec = dict(
upload=dict(
type='str',
required=False,
choices=[
'running-config',
'flash_primary',
'flash_secondary',
'startup-config']),
download=dict(
type='str',
required=False,
choices=[
'running-config',
'startup-config',
'flash_primary',
'flash_secondary',
'bootrom',
'fips-primary-sig',
'fips-secondary-sig',
'fips-bootrom-sig']),
protocol=dict(
type='str',
required=True,
choices=[
'https',
'scp']),
remote_server=dict(
type='str',
required=True),
remote_port=dict(
type='str',
required=False),
remote_filename=dict(
type='str',
required=True),
remote_user=dict(
type='str',
required=False),
remote_pass=dict(
type='str',
required=False,
no_log=True),
public_key=dict(
type='str',
required=False,
choices=[
'rsa',
'dsa']))
mutually_exclusive = [['upload', 'download']]
module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=False, mutually_exclusive=mutually_exclusive)
checkValidations(module)
warnings = list()
result = {'changed': False, 'warnings': warnings}
exec_command(module, 'skip')
response = ''
try:
command = map_params_to_obj(module)
result['commands'] = [command["command"]]
if(module.params['protocol'] == 'scp'):
response = exec_scp(module, command)
else:
response = run_commands(module, command)
if('Response Code: 404' in response):
module.fail_json(msg=response)
else:
result['response'] = "in progress..."
if(module.params["download"] is not None):
result['changed'] = True
except ConnectionError as exc:
module.fail_json(msg=to_text(exc, errors='surrogate_then_replace'))
module.exit_json(**result)
if __name__ == '__main__':
main()