def run(self, tmp=None, task_vars=None):
        changed = False
        socket_path = None
        network_os = self._get_network_os(task_vars).split(".")[-1]
        persistent_connection = self._play_context.connection.split(".")[-1]

        result = super(ActionModule, self).run(task_vars=task_vars)

        if persistent_connection != "network_cli":
            # It is supported only with network_cli
            result["failed"] = True
            result["msg"] = (
                "connection type %s is not valid for net_put module,"
                " please use fully qualified name of network_cli connection type"
                % self._play_context.connection
            )
            return result

        try:
            src = self._task.args["src"]
        except KeyError as exc:
            return {
                "failed": True,
                "msg": "missing required argument: %s" % exc,
            }

        src_file_path_name = src

        # Get destination file if specified
        dest = self._task.args.get("dest")

        # Get proto
        proto = self._task.args.get("protocol")
        if proto is None:
            proto = "scp"

        # Get mode if set
        mode = self._task.args.get("mode")
        if mode is None:
            mode = "binary"

        if mode == "text":
            try:
                self._handle_src_option(convert_data=False)
            except AnsibleError as exc:
                return dict(failed=True, msg=to_text(exc))

            # Now src has resolved file write to disk in current diectory for scp
            src = self._task.args.get("src")
            filename = str(uuid.uuid4())
            cwd = self._loader.get_basedir()
            output_file = os.path.join(cwd, filename)
            try:
                with open(output_file, "wb") as f:
                    f.write(to_bytes(src, encoding="utf-8"))
            except Exception:
                os.remove(output_file)
                raise
        else:
            try:
                output_file = self._get_binary_src_file(src)
            except ValueError as exc:
                return dict(failed=True, msg=to_text(exc))

        if socket_path is None:
            socket_path = self._connection.socket_path

        conn = Connection(socket_path)
        sock_timeout = conn.get_option("persistent_command_timeout")

        if dest is None:
            dest = src_file_path_name
        try:
            changed = self._handle_existing_file(
                conn, output_file, dest, proto, sock_timeout
            )
            if changed is False:
                result["changed"] = changed
                result["destination"] = dest
                if mode == "text":
                    # Cleanup tmp file expanded wih ansible vars
                    os.remove(output_file)
                return result
        except Exception as exc:
            result["msg"] = (
                "Warning: %s idempotency check failed. Check dest" % exc
            )

        try:
            conn.copy_file(
                source=output_file,
                destination=dest,
                proto=proto,
                timeout=sock_timeout,
            )
        except Exception as exc:
            if to_text(exc) == "No response from server":
                if network_os == "iosxr":
                    # IOSXR sometimes closes socket prematurely after completion
                    # of file transfer
                    result[
                        "msg"
                    ] = "Warning: iosxr scp server pre close issue. Please check dest"
            else:
                result["failed"] = True
                result["msg"] = "Exception received: %s" % exc

        if mode == "text":
            # Cleanup tmp file expanded wih ansible vars
            os.remove(output_file)

        result["changed"] = changed
        result["destination"] = dest
        return result
Exemple #2
0
    def run(self, tmp=None, task_vars=None):
        socket_path = None
        network_os = self._get_network_os(task_vars).split('.')[-1]
        persistent_connection = self._play_context.connection.split('.')[-1]

        result = super(ActionModule, self).run(task_vars=task_vars)

        if persistent_connection != 'network_cli':
            # It is supported only with network_cli
            result['failed'] = True
            result['msg'] = (
                'connection type %s is not valid for net_put module,'
                ' please use fully qualified name of network_cli connection type'
                % self._play_context.connection)
            return result

        try:
            src = self._task.args['src']
        except KeyError as exc:
            return {
                'failed': True,
                'msg': 'missing required argument: %s' % exc
            }

        src_file_path_name = src

        # Get destination file if specified
        dest = self._task.args.get('dest')

        # Get proto
        proto = self._task.args.get('protocol')
        if proto is None:
            proto = 'scp'

        # Get mode if set
        mode = self._task.args.get('mode')
        if mode is None:
            mode = 'binary'

        if mode == 'text':
            try:
                self._handle_template(convert_data=False)
            except ValueError as exc:
                return dict(failed=True, msg=to_text(exc))

            # Now src has resolved file write to disk in current diectory for scp
            src = self._task.args.get('src')
            filename = str(uuid.uuid4())
            cwd = self._loader.get_basedir()
            output_file = os.path.join(cwd, filename)
            try:
                with open(output_file, 'wb') as f:
                    f.write(to_bytes(src, encoding='utf-8'))
            except Exception:
                os.remove(output_file)
                raise
        else:
            try:
                output_file = self._get_binary_src_file(src)
            except ValueError as exc:
                return dict(failed=True, msg=to_text(exc))

        if socket_path is None:
            socket_path = self._connection.socket_path

        conn = Connection(socket_path)
        sock_timeout = conn.get_option('persistent_command_timeout')

        if dest is None:
            dest = src_file_path_name

        try:
            changed = self._handle_existing_file(conn, output_file, dest,
                                                 proto, sock_timeout)
            if changed is False:
                result['changed'] = changed
                result['destination'] = dest
                return result
        except Exception as exc:
            result['msg'] = (
                'Warning: %s idempotency check failed. Check dest' % exc)

        try:
            conn.copy_file(source=output_file,
                           destination=dest,
                           proto=proto,
                           timeout=sock_timeout)
        except Exception as exc:
            if to_text(exc) == "No response from server":
                if network_os == 'iosxr':
                    # IOSXR sometimes closes socket prematurely after completion
                    # of file transfer
                    result[
                        'msg'] = 'Warning: iosxr scp server pre close issue. Please check dest'
            else:
                result['failed'] = True
                result['msg'] = 'Exception received: %s' % exc

        if mode == 'text':
            # Cleanup tmp file expanded wih ansible vars
            os.remove(output_file)

        result['changed'] = changed
        result['destination'] = dest
        return result
Exemple #3
0
    def run(self, tmp=None, task_vars=None):
        socket_path = None
        play_context = copy.deepcopy(self._play_context)
        play_context.network_os = self._get_network_os(task_vars)

        result = super(ActionModule, self).run(task_vars=task_vars)

        if play_context.connection != 'network_cli':
            # It is supported only with network_cli
            result['failed'] = True
            result['msg'] = (
                'please use network_cli connection type for net_put module')
            return result

        src_file_path_name = self._task.args.get('src')

        try:
            self._handle_template()
        except ValueError as exc:
            return dict(failed=True, msg=to_text(exc))

        try:
            src = self._task.args.get('src')
        except KeyError as exc:
            return {
                'failed': True,
                'msg': 'missing required argument: %s' % exc
            }

        # Get destination file if specified
        dest = self._task.args.get('dest')

        # Get proto
        proto = self._task.args.get('protocol')
        if proto is None:
            proto = 'scp'

        sock_timeout = play_context.timeout

        # Now src has resolved file write to disk in current diectory for scp
        filename = str(uuid.uuid4())
        cwd = self._loader.get_basedir()
        output_file = cwd + '/' + filename
        with open(output_file, 'w') as f:
            f.write(src)

        if socket_path is None:
            socket_path = self._connection.socket_path

        conn = Connection(socket_path)
        if dest is None:
            dest = src_file_path_name

        try:
            out = conn.copy_file(source=output_file,
                                 destination=dest,
                                 proto=proto,
                                 timeout=sock_timeout)
        except Exception as exc:
            if to_text(exc) == "No response from server":
                if play_context.network_os == 'iosxr':
                    # IOSXR sometimes closes socket prematurely after completion
                    # of file transfer
                    result[
                        'msg'] = 'Warning: iosxr scp server pre close issue. Please check dest'
            else:
                result['failed'] = True
                result['msg'] = ('Exception received : %s' % exc)

        # Cleanup tmp file expanded wih ansible vars
        os.remove(output_file)
        result['changed'] = True
        return result