aboutsummaryrefslogtreecommitdiffstats
path: root/deploy/ssh_client.py
diff options
context:
space:
mode:
Diffstat (limited to 'deploy/ssh_client.py')
-rw-r--r--deploy/ssh_client.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/deploy/ssh_client.py b/deploy/ssh_client.py
new file mode 100644
index 000000000..24119dbfa
--- /dev/null
+++ b/deploy/ssh_client.py
@@ -0,0 +1,103 @@
+###############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+# szilard.cserey@ericsson.com
+# peter.barabas@ericsson.com
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+###############################################################################
+
+
+import paramiko
+import scp
+
+from common import (
+ log,
+ err,
+)
+
+TIMEOUT = 600
+
+class SSHClient(object):
+
+ def __init__(self, host, username, password):
+ self.host = host
+ self.username = username
+ self.password = password
+ self.client = None
+
+ def open(self, timeout=TIMEOUT):
+ self.client = paramiko.SSHClient()
+ self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ self.client.connect(self.host, username=self.username,
+ password=self.password, look_for_keys=False,
+ timeout=timeout)
+
+ def close(self):
+ if self.client is not None:
+ self.client.close()
+ self.client = None
+
+ def __enter__(self):
+ self.open()
+ return self
+
+ def __exit__(self, type, value, traceback):
+ self.close()
+
+ def exec_cmd(self, command, check=True, sudo=False, timeout=TIMEOUT):
+ if sudo and self.username != 'root':
+ command = "sudo -S -p '' %s" % command
+ stdin, stdout, stderr = self.client.exec_command(command,
+ timeout=timeout)
+ if sudo:
+ stdin.write(self.password + '\n')
+ stdin.flush()
+ response = stdout.read().strip()
+ error = stderr.read().strip()
+
+ if check:
+ if error:
+ self.close()
+ raise Exception(error)
+ else:
+ return response
+ return response, error
+
+ def run(self, command):
+ transport = self.client.get_transport()
+ transport.set_keepalive(1)
+ chan = transport.open_session()
+ chan.exec_command(command)
+ while not chan.exit_status_ready():
+ if chan.recv_ready():
+ data = chan.recv(1024)
+ while data:
+ log(data.strip())
+ data = chan.recv(1024)
+
+ if chan.recv_stderr_ready():
+ error_buff = chan.recv_stderr(1024)
+ while error_buff:
+ log(error_buff.strip())
+ error_buff = chan.recv_stderr(1024)
+ return chan.recv_exit_status()
+
+ def scp_get(self, remote, local='.', dir=False):
+ try:
+ with scp.SCPClient(self.client.get_transport(),
+ sanitize=lambda x: x,
+ socket_timeout=TIMEOUT) as _scp:
+ _scp.get(remote, local, dir)
+ except Exception as e:
+ err(e)
+
+ def scp_put(self, local, remote='.', dir=False):
+ try:
+ with scp.SCPClient(self.client.get_transport(),
+ sanitize=lambda x: x,
+ socket_timeout=TIMEOUT) as _scp:
+ _scp.put(local, remote, dir)
+ except Exception as e:
+ err(e)