2016-04-20 18:06:12 +03:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Author: Volkan Şahin <volkansah.in> <bm.volkansahin@gmail.com>
|
|
|
|
|
2016-06-29 12:41:31 +03:00
|
|
|
from base.util.util import Util
|
|
|
|
from base.system.system import System
|
2016-08-24 18:05:54 +03:00
|
|
|
from base.scope import Scope
|
2016-05-06 16:36:50 +03:00
|
|
|
import paramiko
|
2016-07-21 18:03:09 +03:00
|
|
|
import logging
|
2016-04-20 18:06:12 +03:00
|
|
|
|
|
|
|
|
2016-06-29 12:41:31 +03:00
|
|
|
class Ssh(object):
|
|
|
|
def __init__(self, parameter_map):
|
2016-04-20 18:06:12 +03:00
|
|
|
|
2016-09-21 12:05:48 +03:00
|
|
|
scope = Scope().get_instance()
|
|
|
|
self.logger = scope.get_logger()
|
|
|
|
self.configuration_manager = scope.get_configuration_manager()
|
2016-07-21 18:03:09 +03:00
|
|
|
logging.getLogger("paramiko").setLevel(logging.INFO)
|
2016-04-20 18:06:12 +03:00
|
|
|
|
2016-06-29 12:41:31 +03:00
|
|
|
try:
|
2016-06-30 12:40:29 +03:00
|
|
|
self.target_hostname = parameter_map['host']
|
2016-07-01 16:58:20 +03:00
|
|
|
self.target_port = parameter_map['port']
|
2016-06-29 12:41:31 +03:00
|
|
|
self.target_username = parameter_map['username']
|
|
|
|
self.target_path = parameter_map['path']
|
|
|
|
self.target_password = None
|
|
|
|
self.p_key = None
|
2016-07-01 16:58:20 +03:00
|
|
|
if Util.has_attr_json(parameter_map, 'password'):
|
2016-06-29 12:41:31 +03:00
|
|
|
self.target_password = parameter_map['password']
|
|
|
|
else:
|
|
|
|
self.p_key = parameter_map['pkey']
|
|
|
|
except Exception as e:
|
2016-08-24 18:05:54 +03:00
|
|
|
self.logger.error(
|
2016-09-21 12:05:48 +03:00
|
|
|
'A problem occurred while parsing ssh connection parameters. Error Message: {0}'.format(str(e)))
|
2016-04-20 18:06:12 +03:00
|
|
|
|
2016-06-29 12:41:31 +03:00
|
|
|
self.connection = None
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.debug('Parameters set up')
|
2016-04-20 18:06:12 +03:00
|
|
|
|
2016-07-01 16:58:20 +03:00
|
|
|
def send_file(self, local_path, md5):
|
2016-04-20 18:06:12 +03:00
|
|
|
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.debug(' {0} is sending to {1}'.format(local_path, self.target_path + md5))
|
2016-04-20 18:06:12 +03:00
|
|
|
try:
|
|
|
|
sftp = paramiko.SFTPClient.from_transport(self.connection)
|
2016-07-01 16:58:20 +03:00
|
|
|
try:
|
|
|
|
sftp.chdir(self.target_path) # Test if remote_path exists
|
|
|
|
except IOError:
|
2016-07-13 15:56:42 +03:00
|
|
|
sftp.mkdir(self.target_path) # Create remote_path
|
2016-07-01 16:58:20 +03:00
|
|
|
sftp.chdir(self.target_path)
|
|
|
|
|
|
|
|
sftp.put(local_path, self.target_path + md5)
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.debug('File was sent to {0} from {1}'.format(local_path, self.target_path))
|
2016-07-01 16:58:20 +03:00
|
|
|
return True
|
2016-04-20 18:06:12 +03:00
|
|
|
except Exception as e:
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.error('A problem occurred while sending file. Exception message: {0}'.format(str(e)))
|
2016-07-01 16:58:20 +03:00
|
|
|
return False
|
2016-04-20 18:06:12 +03:00
|
|
|
|
2016-09-21 15:13:42 +03:00
|
|
|
def get_file(self, local_path=None, file_name=None):
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.debug('Getting file ...')
|
2016-04-20 18:06:12 +03:00
|
|
|
try:
|
2016-06-29 12:41:31 +03:00
|
|
|
tmp_file_name = str(Util.generate_uuid())
|
|
|
|
local_full_path = System.Ahenk.received_dir_path() + tmp_file_name
|
2016-04-20 18:06:12 +03:00
|
|
|
sftp = paramiko.SFTPClient.from_transport(self.connection)
|
2016-06-29 12:41:31 +03:00
|
|
|
sftp.get(self.target_path, local_full_path)
|
2016-09-21 15:13:42 +03:00
|
|
|
|
2016-09-21 12:05:48 +03:00
|
|
|
if local_path is None:
|
|
|
|
receive_path = System.Ahenk.received_dir_path()
|
|
|
|
else:
|
|
|
|
receive_path = local_path
|
2016-09-21 15:13:42 +03:00
|
|
|
if file_name is not None:
|
|
|
|
f_name = file_name
|
|
|
|
else:
|
|
|
|
f_name = str(Util.get_md5_file(local_full_path))
|
|
|
|
Util.rename_file(local_full_path, receive_path + f_name)
|
|
|
|
self.logger.debug('File was downloaded to {0} from {1}'.format(receive_path, self.target_path))
|
2016-04-20 18:06:12 +03:00
|
|
|
except Exception as e:
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.warning('A problem occurred while downloading file. Exception message: {0}'.format(str(e)))
|
2016-05-17 12:29:51 +03:00
|
|
|
raise
|
2016-09-21 15:13:42 +03:00
|
|
|
return f_name
|
2016-04-20 18:06:12 +03:00
|
|
|
|
|
|
|
def connect(self):
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.debug('Connecting to {0} via {1}'.format(self.target_hostname, self.target_port))
|
2016-04-20 18:06:12 +03:00
|
|
|
try:
|
2016-07-01 16:58:20 +03:00
|
|
|
connection = paramiko.Transport(self.target_hostname, int(self.target_port))
|
2016-04-20 18:06:12 +03:00
|
|
|
connection.connect(username=self.target_username, password=self.target_password, pkey=self.p_key)
|
|
|
|
self.connection = connection
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.debug('Connected.')
|
2016-04-20 18:06:12 +03:00
|
|
|
except Exception as e:
|
2016-08-24 18:05:54 +03:00
|
|
|
self.logger.error(
|
2016-09-21 12:05:48 +03:00
|
|
|
'A problem occurred while connecting to {0} . Exception message: {1}'.format(
|
2016-08-24 18:05:54 +03:00
|
|
|
self.target_hostname, str(e)))
|
2016-06-29 12:41:31 +03:00
|
|
|
|
|
|
|
def disconnect(self):
|
|
|
|
self.connection.close()
|
2016-09-21 12:05:48 +03:00
|
|
|
self.logger.debug('Connection is closed.')
|
2016-06-29 12:41:31 +03:00
|
|
|
# TODO
|
|
|
|
pass
|
|
|
|
|
|
|
|
def is_connected(self):
|
|
|
|
# TODO
|
|
|
|
pass
|