paramiko transport appears to hang if it gets a sudo lecture

* bring paramiko transport closer to ssh transport in how it deals with prompt
This commit is contained in:
Matthew Stoltenberg 2016-02-09 15:08:33 -07:00
parent a54f472b08
commit c90ab8856d

View file

@ -230,13 +230,9 @@ class Connection(ConnectionBase):
chan.exec_command(cmd) chan.exec_command(cmd)
if self._play_context.prompt: if self._play_context.prompt:
passprompt = False passprompt = False
while True: become_sucess = False
while not (become_sucess or passprompt):
display.debug('Waiting for Privilege Escalation input') display.debug('Waiting for Privilege Escalation input')
if self.check_become_success(become_output):
break
elif self.check_password_prompt(become_output):
passprompt = True
break
chunk = chan.recv(bufsize) chunk = chan.recv(bufsize)
display.debug("chunk is: %s" % chunk) display.debug("chunk is: %s" % chunk)
@ -247,6 +243,17 @@ class Connection(ConnectionBase):
break break
#raise AnsibleError('ssh connection closed waiting for password prompt') #raise AnsibleError('ssh connection closed waiting for password prompt')
become_output += chunk become_output += chunk
# need to check every line because we might get lectured
# and we might get the middle of a line in a chunk
for l in become_output.splitlines(True):
if self.check_become_success(l):
become_sucess = True
break
elif self.check_password_prompt(l):
passprompt = True
break
if passprompt: if passprompt:
if self._play_context.become and self._play_context.become_pass: if self._play_context.become and self._play_context.become_pass:
chan.sendall(self._play_context.become_pass + '\n') chan.sendall(self._play_context.become_pass + '\n')