def exec_remote_command(self, command): if self.isConnected: self.ssh_client.get_transport().open_session() try: stdin_raw, stdout_raw, stderr_raw = \ self.ssh_client.exec_command(command) stdout = stdout_raw.read().decode() stderr = stderr_raw.read().decode() cmd_result = {"stdout": [], "stderr": []} if stdout: logger.info(stdout) cmd_result['stdout'] = stdout.splitlines() if stderr: logger.error(stderr) cmd_result['stderr'] = stderr.splitlines() return cmd_result except (paramiko.SSHException) as e: logger.error("SSH error({0}): {1}".format(e.errno, e.strerror)) else: logger.error("The host ssh channel is not opened.") return False
def call_subprocess(cmd, args, env_vars={}): child = subprocess.Popen(cmd.split(), env=env_vars, stdout=subprocess.PIPE, stderr=subprocess.PIPE) cmd_result = {"stdout": [], "stderr": []} while child.poll() is None: for line in iter(child.stdout.readline, b''): formated_string = line.decode().replace( line[:-1] if line[-1] == os.linesep else '\n', '') cmd_result["stdout"].append(formated_string) if args.debug: logger.info(message=formated_string) for line in iter(child.stderr.readline, b''): formated_string = line.decode().replace( line[:-1] if line[-1] == os.linesep else '\n', '') cmd_result["stderr"].append(formated_string) if args.debug: logger.error(message=formated_string) child.communicate() return cmd_result
def ssh_connect(self): if not self.isConnected: self.ssh_client.set_missing_host_key_policy( paramiko.AutoAddPolicy()) key = self.get_key(self.args.ssh_private_key) username = self.args.user if self.args.user else pwd.getpwuid(os.getuid())[0] try: self.ssh_client.connect(self.address, port=self.port, username=username, pkey=key, timeout=5) self.sftp = self.ssh_client.open_sftp() self.isConnected = True logger.info("SSH connection to {host} has been established.".format(host=self.address)) return True except (paramiko.BadHostKeyException, paramiko.AuthenticationException, paramiko.ssh_exception.NoValidConnectionsError) as e: logger.error(str(e)) return False else: return True
def check_disk(args): logger.info(pprint.PrettyPrinter(indent=2, width=400).pformat(args)) logger.info(message="> Task 1 called.") remote_SSH_host = Host(args) logger.echo( message="> Connecting to {name}.".format(name=str(remote_SSH_host)), color=logger.OKGREEN) if remote_SSH_host.ssh_connect(): cmd = "lsblk -l -b | awk 'NR>1 && /.*part.*/ {print $4, $6, $7}'" cmd_result = remote_SSH_host.exec_remote_command(cmd) pprint.PrettyPrinter(indent=2).pprint(cmd_result) remote_SSH_host.ssh_close() partitions_list = [line.encode('utf-8') for line in cmd_result['stdout']] patitions_available = get_patitions_with_free_space( partitions_list, 1073741824) # 1073741824 =1GB pprint.PrettyPrinter(indent=2, width=400).pprint(patitions_available) remote_SSH_host = Host(args) if patitions_available: if remote_SSH_host.ssh_connect(): mount_point = patitions_available[0].split()[-1] mount_point = mount_point[:-1] if mount_point[ -1] == '/' else mount_point for i in range(FILES_TO_CLEATE): cmd = "sudo mkdir -p {mount_point}/somedir ".format( mount_point=mount_point, i=i) cmd += "&& sudo chown -R {user} {mount_point}/somedir ".format( user=args.user, mount_point=mount_point, i=i) cmd += "&& touch {mount_point}/somedir/{i} ".format( mount_point=mount_point, i=i) cmd += "&& dd if=/dev/zero bs=5242880 count=1 >> {mount_point}/somedir/{i} ".format( mount_point=mount_point, i=i) cmd_result = remote_SSH_host.exec_remote_command(cmd) remote_SSH_host.ssh_close()
def ssh_close(self): if (self.isConnected): self.sftp.close() self.ssh_client.close() logger.info("SSH connection has been closed.")
for i in range(FILES_TO_CLEATE): cmd = "sudo mkdir -p {mount_point}/somedir ".format( mount_point=mount_point, i=i) cmd += "&& sudo chown -R {user} {mount_point}/somedir ".format( user=args.user, mount_point=mount_point, i=i) cmd += "&& touch {mount_point}/somedir/{i} ".format( mount_point=mount_point, i=i) cmd += "&& dd if=/dev/zero bs=5242880 count=1 >> {mount_point}/somedir/{i} ".format( mount_point=mount_point, i=i) cmd_result = remote_SSH_host.exec_remote_command(cmd) remote_SSH_host.ssh_close() def run_remote(args): pass if __name__ == '__main__': reload(sys) sys.setdefaultencoding('utf8') logger.log('\n\n*****************') logger.log("{args}".format(args=" ".join(sys.argv))) func_map = {'checkDisk': check_disk, 'runCommand': run_remote} args = parse_args(func_map) func = func_map[args.action] func(args) logger.info(message="> Infrastructure Provision finished.")