# # Copyright (c) 2017 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 ssh_client import SSHClient from ssh_util import SshUtil from utils_log import log_enter_exit, for_all_methods @for_all_methods(log_enter_exit) class Node(object): def __init__(self, name, address=None, port=None, user=None, password=None, jump=None, dict=None): self.name = name self.address = address self.jump = jump self.user = user self.port = port self.password = password if dict: self.read_from_dic(dict) self.sshc = SSHClient(self) self.has_access = False self.config = dict def read_from_dic(self, dic): allowed_keys = ['address', 'user', 'jump', 'password', 'port'] for (key, value) in dic.iteritems(): if key in allowed_keys: setattr(self, key, value) def ping(self, ip): self.execute(['ping', '-c', '1', ip]) def execute(self, cmd, **kwargs): return self.sshc.execute(cmd, **kwargs) def chown(self, user, path): self.execute('chown -R %(user)s:%(user)s %(path)s' % {'user': user, 'path': path}, as_root=True) def is_dir(self, path): rv, _ = self.execute('test -d %s && echo yes' % path, check_exit_code=[0, 1]) if rv == 'yes\n': return True else: return False def is_file(self, path): rv, _ = self.execute('test -f %s && echo yes' % path, check_exit_code=[0, 1]) if rv == 'yes\n': return True else: return False def reboot(self): self.execute('reboot', as_root=True, check_exit_code=[255]) def create_path_if_not_exsist(self, path, **kwargs): return self.sshc.execute('mkdir -p %s' % path, **kwargs) def copy(self, direction, local_path, remote_path, **kwargs): return self.sshc.copy(direction, local_path, remote_path, **kwargs) def to_ssh_config(self): config = ["Host %s" % self.name, " Hostname %s" % (self.address if self.address else self.name)] if self.jump: config.append(" ProxyCommand ssh -F %(config_path)s " "-W %%h:%%p %(name)s" % {'config_path': SshUtil.get_config_file_path(), 'name': self.jump.name}) if self.user: config.append(" user %s" % self.user) if self.port: config.append(" port %s" % self.port) return '\n'.join(config)