summaryrefslogtreecommitdiffstats
path: root/odl-pipeline/lib/utils/ssh_client.py
diff options
context:
space:
mode:
Diffstat (limited to 'odl-pipeline/lib/utils/ssh_client.py')
-rwxr-xr-xodl-pipeline/lib/utils/ssh_client.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/odl-pipeline/lib/utils/ssh_client.py b/odl-pipeline/lib/utils/ssh_client.py
new file mode 100755
index 0000000..464a74e
--- /dev/null
+++ b/odl-pipeline/lib/utils/ssh_client.py
@@ -0,0 +1,88 @@
+#
+# Copyright (c) 2015 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
+#
+#
+from processutils import execute
+from ssh_util import SshUtil
+from node_manager import NodeManager
+import os
+from utils_log import LOG
+import glob
+
+
+class SSHClient(object):
+
+ def __init__(self, node):
+ self.node = node
+
+ def execute(self, cmd, **kwargs):
+ if 'log_true' in kwargs:
+ if kwargs['log_true']:
+ LOG.info('Node: %s Executing: %s' % (self.node.name, cmd))
+ kwargs.pop('log_true')
+ NodeManager.gen_ssh_config(self.node)
+ if not isinstance(cmd, str):
+ cmd = ' '.join(cmd)
+ cmd_addition = ['ssh', '-i', SshUtil.get_id_rsa(), '-F',
+ SshUtil.get_config_file_path(),
+ self.node.name]
+ if self.node.password:
+ cmd_addition = ['sshpass', '-p', self.node.password] + cmd_addition
+ if 'as_root' in kwargs:
+ kwargs.pop('as_root')
+ cmd = 'sudo ' + cmd
+ cmd_addition.append(cmd)
+ return execute(cmd_addition, **kwargs)
+
+ def copy(self, direction, local_path, remote_path, **kwargs):
+ all_files = None
+ if direction is 'to':
+ msg = ('Copying file %s to %s:%s' % (local_path, self.node.name,
+ remote_path))
+ if self.node.is_dir(remote_path):
+ pass
+ elif remote_path[-1:] == '/':
+ self.node.create_path_if_not_exsist(remote_path)
+ else:
+ # Remove the file
+ self.execute('rm -f %s' % remote_path, as_root=True)
+ self.node.create_path_if_not_exsist(
+ os.path.dirname(remote_path))
+ if '*' in local_path:
+ all_files = glob.glob(local_path)
+ else:
+ if local_path[-1:] == '/':
+ execute('mkdir -p %s' % local_path)
+ msg = ('Copying file from %s:%s to %s' % (self.node.name,
+ remote_path,
+ local_path))
+ LOG.info(msg)
+ if all_files:
+ for one_file in all_files:
+ return self._copy(direction, one_file, remote_path, **kwargs)
+ else:
+ return self._copy(direction, local_path, remote_path, **kwargs)
+
+ def _copy(self, direction, local_path, remote_path, **kwargs):
+ # TODO create dir is not existing
+ NodeManager.gen_ssh_config(self.node)
+ cmd = ['scp', '-i', SshUtil.get_id_rsa(), '-F',
+ SshUtil.get_config_file_path()]
+ if direction == 'to':
+ if os.path.isdir(local_path):
+ cmd.append('-r')
+ cmd = cmd + [local_path,
+ ('%s:%s') % (self.node.name, remote_path)]
+ if direction == 'from':
+ if self.node.is_dir(remote_path):
+ cmd.append('-r')
+ cmd = cmd + [('%s:%s') % (self.node.name, remote_path),
+ local_path]
+ if self.node.password:
+ cmd = ['sshpass', '-p', self.node.password] + cmd
+ return execute(cmd, **kwargs)