#!/usr/bin/env python3


import os
import sys

# ---------Set sys.path for pluqin execution---------------------------------------
# Absolute path to this plugin
abs_path = os.path.abspath(os.path.dirname(sys.argv[0]))
# full_path to plugins parent directory
full_path = abs_path.split("plugins")[0]
sys.path.append(full_path)
# Walk path and append to sys.path
for root, dirs, files in os.walk(full_path):
    for found_dir in dirs:
        sys.path.append(os.path.join(root, found_dir))

# ssh_utility is in ../lib
from ssh_utility import SSHRemoteclient  # NOQA


def ssh_execute_cmd(
    hostname, username, password, port_ssh, command, timeout=60, type=None
):
    r"""
    Description of argument(s):

    hostname        Name/IP of the remote (targeting) host
    username        User on the remote host with access to FFCD files
    password        Password for user on remote host
    port_ssh        SSH port value. By default 22.
    command         Command to run on remote host
    timeout         Time, in second, to wait for command completion
    type            Data type return as list or others.
    """
    ssh_remoteclient = SSHRemoteclient(hostname, username, password, port_ssh)

    cmd_exit_code = 0
    err = ""
    response = ""
    if ssh_remoteclient.ssh_remoteclient_login():
        """
        cmd_exit_code: command exit status from remote host
        err: stderr from remote host
        response: stdout from remote host
        """
        cmd_exit_code, err, response = ssh_remoteclient.execute_command(
            command, int(timeout)
        )

    # Close ssh session
    if ssh_remoteclient:
        ssh_remoteclient.ssh_remoteclient_disconnect()

    if type == "list":
        return response.split("\n")
    else:
        return response
