mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
373 lines
15 KiB
Python
373 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()
|