#!/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, 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
    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)

    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
