Ejemplo n.º 1
0
 def test_ssh_bootstrap_sh_cmd_limit(self):
     # dropbear has a 9000 bytes maximum command length limit
     sh_script, _, _ = bootstrap_script(SSHOptions({'interpreter': 'sh'}),
                                        script_type='sh',
                                        remote_args=[],
                                        request_id='123-123')
     rcmd = wrap_bootstrap_script(sh_script, 'sh')
     self.assertLessEqual(sum(len(x) for x in rcmd), 9000)
Ejemplo n.º 2
0
    def check_bootstrap(self,
                        sh,
                        home_dir,
                        login_shell='',
                        SHELL_INTEGRATION_VALUE='enabled',
                        test_script='',
                        pre_data='',
                        ssh_opts=None,
                        launcher='sh'):
        ssh_opts = ssh_opts or {}
        if login_shell:
            ssh_opts['login_shell'] = login_shell
        if 'python' in sh:
            if test_script.startswith('env;'):
                test_script = f'os.execlp("sh", "sh", "-c", {test_script!r})'
            test_script = f'print("UNTAR_DONE", flush=True); {test_script}'
        else:
            test_script = f'echo "UNTAR_DONE"; {test_script}'
        ssh_opts['shell_integration'] = SHELL_INTEGRATION_VALUE or 'disabled'
        script, replacements, shm_name = bootstrap_script(
            SSHOptions(ssh_opts),
            script_type='py' if 'python' in sh else 'sh',
            request_id="testing",
            test_script=test_script,
            request_data=True)
        try:
            env = basic_shell_env(home_dir)
            # Avoid generating unneeded completion scripts
            os.makedirs(os.path.join(home_dir, '.local', 'share', 'fish',
                                     'generated_completions'),
                        exist_ok=True)
            # prevent newuser-install from running
            open(os.path.join(home_dir, '.zshrc'), 'w').close()
            cmd = wrap_bootstrap_script(script, sh)
            pty = self.create_pty([launcher, '-c', ' '.join(cmd)],
                                  cwd=home_dir,
                                  env=env)
            pty.turn_off_echo()
            del cmd
            if pre_data:
                pty.write_buf = pre_data.encode('utf-8')
            del script

            def check_untar_or_fail():
                q = pty.screen_contents()
                if 'bzip2' in q:
                    raise ValueError(
                        'Untarring failed with screen contents:\n' + q)
                return 'UNTAR_DONE' in q

            pty.wait_till(check_untar_or_fail)
            self.assertTrue(
                os.path.exists(
                    os.path.join(home_dir, '.terminfo/kitty.terminfo')))
            if SHELL_INTEGRATION_VALUE != 'enabled':
                pty.wait_till(
                    lambda: len(pty.screen_contents().splitlines()) > 1)
                self.assertEqual(pty.screen.cursor.shape, 0)
            else:
                pty.wait_till(lambda: pty.screen.cursor.shape == CURSOR_BEAM)
            return pty
        finally:
            with suppress(FileNotFoundError):
                shm_unlink(shm_name)