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)
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)