blob: 795746537870bb6297e8d3f44bd1885198b13455 [file] [log] [blame]
#!/usr/bin/env python
import paramiko
from paramiko.ssh_exception import AuthenticationException, NoValidConnectionsError, SSHException
from paramiko.buffered_pipe import PipeTimeout as PipeTimeout
import scp
import socket
from socket import timeout as SocketTimeout
class SSHRemoteclient:
r"""
Class to create ssh connection to remote host
for remote host command execution and scp.
"""
def __init__(self, hostname, username, password):
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
"""
self.ssh_output = None
self.ssh_error = None
self.sshclient = None
self.scpclient = None
self.hostname = hostname
self.username = username
self.password = password
def ssh_remoteclient_login(self):
r"""
Method to create a ssh connection to remote host.
"""
try:
# SSHClient to make connections to the remote server
self.sshclient = paramiko.SSHClient()
# setting set_missing_host_key_policy() to allow any host.
self.sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Connect to the server
self.sshclient.connect(hostname=self.hostname,
username=self.username,
password=self.password)
except AuthenticationException:
print("\n>>>>>\tERROR: Authentication failed, please verify your login credentials")
except SSHException:
print("\n>>>>>\tERROR: Failures in SSH2 protocol negotiation or logic errors.")
except NoValidConnectionsError:
print('\n>>>>>\tERROR: No Valid SSH Connection after multiple attempts.')
except socket.error:
print("\n>>>>>\tERROR: SSH Connection refused.")
except Exception:
raise Exception("\n>>>>>\tERROR: Unexpected Exception.")
def ssh_remoteclient_disconnect(self):
r"""
Clean up.
"""
if self.sshclient:
self.sshclient.close()
if self.scpclient:
self.scpclient.close()
def execute_command(self, command):
"""
Execute command on the remote host.
Description of argument(s):
command Command string sent to remote host
"""
try:
stdin, stdout, stderr = self.sshclient.exec_command(command)
stdout.channel.recv_exit_status()
response = stdout.readlines()
return response
except (paramiko.AuthenticationException, paramiko.SSHException,
paramiko.ChannelException) as ex:
print("\n>>>>>\tERROR: Remote command execution fails.")
def scp_connection(self):
r"""
Create a scp connection for file transfer.
"""
self.scpclient = scp.SCPClient(self.sshclient.get_transport())
def scp_file_from_remote(self, remote_file, local_file):
r"""
scp file in remote system to local with date-prefixed filename.
Description of argument(s):
remote_file Full path filename on the remote host
local_file Full path filename on the local host
local filename = date-time_remote filename
"""
try:
self.scpclient.get(remote_file, local_file)
except scp.SCPException:
print("scp.SCPException scp %s from remotehost" % remote_file)
return False
except (SocketTimeout, PipeTimeout) as ex:
# Future enhancement: multiple retries on these exceptions due to bad ssh connection
print("Timeout scp %s from remotehost" % remote_file)
return False
# Return True for file accounting
return True