Пример #1
0
 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
Пример #2
0
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
Пример #3
0
    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
Пример #4
0
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()
Пример #5
0
 def ssh_close(self):
     if (self.isConnected):
         self.sftp.close()
         self.ssh_client.close()
         logger.info("SSH connection has been closed.")
Пример #6
0
            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.")