def _paramiko_shell(self): rows, cols = get_terminal_size() try: self.shell = self.client.open_session() self.shell.get_pty(self.termtype, cols, rows) self.shell.invoke_shell() except SSHException, e: self._dbg(1, 'Failed to open shell.') raise LoginFailure('Failed to open shell: ' + str(e))
def _app_authenticate(self, account, password, flush=True, bailout=False): user = account.get_name() while True: # Wait for any prompt. Once a match is found, we need to be able # to find out which type of prompt was matched, so we build a # structure to allow for mapping the match index back to the # prompt type. prompts = (('login-error', self.get_login_error_prompt()), ('username', self.get_username_prompt()), ('skey', [_skey_re]), ('password', self.get_password_prompt()), ('cli', self.get_prompt())) prompt_map = [] prompt_list = [] for section, sectionprompts in prompts: for prompt in sectionprompts: prompt_map.append((section, prompt)) prompt_list.append(prompt) # Wait for the prompt. try: index, match = self._waitfor(prompt_list) except TimeoutException: if self.response is None: self.response = '' msg = "Buffer: %s" % repr(self.response) raise TimeoutException(msg) except DriverReplacedException: # Driver replaced, retry. self._dbg(1, 'Protocol.app_authenticate(): driver replaced') continue except ExpectCancelledException: self._dbg(1, 'Protocol.app_authenticate(): expect cancelled') raise except EOFError: self._dbg(1, 'Protocol.app_authenticate(): EOF') raise # Login error detected. section, prompt = prompt_map[index] if section == 'login-error': raise LoginFailure("Login failed") # User name prompt. elif section == 'username': self._dbg(1, "Username prompt %s received." % index) self.expect(prompt) # consume the prompt from the buffer self.send(user + '\r') continue # s/key prompt. elif section == 'skey': self._dbg(1, "S/Key prompt received.") self.expect(prompt) # consume the prompt from the buffer seq = int(match.group(1)) seed = match.group(2) self.otp_requested_event(account, seq, seed) self._dbg(2, "Seq: %s, Seed: %s" % (seq, seed)) phrase = otp(password, seed, seq) # A password prompt is now required. self.expect(self.get_password_prompt()) self.send(phrase + '\r') self._dbg(1, "Password sent.") if bailout: break continue # Cleartext password prompt. elif section == 'password': self._dbg(1, "Cleartext password prompt received.") self.expect(prompt) # consume the prompt from the buffer self.send(password + '\r') if bailout: break continue # Shell prompt. elif section == 'cli': self._dbg(1, 'Shell prompt received.') if flush: self.expect_prompt() break else: assert False # No such section
for method in (self._paramiko_auth_password, self._paramiko_auth_agent, self._paramiko_auth_autokey, self._paramiko_auth_none): self._dbg(1, 'Authenticating with %s' % method.__name__) try: method(username, password) return except BadHostKeyException, e: self._dbg(1, 'Bad host key!') last_exception = e except AuthenticationException, e: self._dbg(1, 'Authentication with %s failed' % method.__name__) last_exception = e except SSHException, e: self._dbg(1, 'Missing host key.') last_exception = e raise LoginFailure('Login failed: ' + str(last_exception)) def _paramiko_shell(self): rows, cols = get_terminal_size() try: self.shell = self.client.open_session() self.shell.get_pty(self.termtype, cols, rows) self.shell.invoke_shell() except SSHException, e: self._dbg(1, 'Failed to open shell.') raise LoginFailure('Failed to open shell: ' + str(e)) def _connect_hook(self, hostname, port): self.host = hostname self.port = port or 22
def fail(data, *args, **kwargs): data.value += 1 raise LoginFailure('intended login failure')