def _domatch(self, prompt, flush): if flush: func = self.tn.expect else: func = self.tn.waitfor # Wait for a prompt. self.response = None try: result, match, self.response = func(prompt, self.timeout) except Exception: self._dbg(1, 'Error while waiting for ' + repr(prompt)) raise if match: self._dbg(2, "Got a prompt, match was %s" % repr(match.group())) self.buffer.pop(len(self.response)) self._dbg(5, "Response was %s" % repr(self.response)) if result == -1: error = 'Error while waiting for response from device' raise TimeoutException(error) if result == -2: if self.driver_replaced: self.driver_replaced = False raise DriverReplacedException() else: raise ExpectCancelledException() if self.response is None: raise ProtocolException('whoops - response is None') return result, match
def _fill_buffer(self): # Wait for a response of the device. if not self._wait_for_data(): error = 'Timeout while waiting for response from device' raise TimeoutException(error) # Read the response. data = self.shell.recv(200) if not data: return False self._receive_cb(data, False) self.buffer.append(data) return True
def _domatch(self, prompt, flush): # Wait for a prompt. result, match, self.response = self._expect_any(prompt, flush) if match: self._dbg(2, "Got a prompt, match was %s" % repr(match.group())) else: self._dbg(2, "No prompt match") self._dbg(5, "Response was %s" % repr(str(self.buffer))) if result == -1: error = 'Error while waiting for response from device' raise TimeoutException(error) if result == -2: if self.driver_replaced: self.driver_replaced = False raise DriverReplacedException() else: raise ExpectCancelledException() return result, match
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