|
|
|
|
@ -182,6 +182,7 @@ import os
|
|
|
|
|
import signal
|
|
|
|
|
import socket
|
|
|
|
|
import traceback
|
|
|
|
|
import time
|
|
|
|
|
from io import BytesIO
|
|
|
|
|
|
|
|
|
|
from ansible.errors import AnsibleConnectionFailure
|
|
|
|
|
@ -359,6 +360,15 @@ class Connection(NetworkConnectionBase):
|
|
|
|
|
display.debug("ssh connection has been closed successfully")
|
|
|
|
|
super(Connection, self).close()
|
|
|
|
|
|
|
|
|
|
def receive_ssh_data(self, count, timeout):
|
|
|
|
|
if timeout:
|
|
|
|
|
start = time.time()
|
|
|
|
|
while not self._ssh_shell.recv_ready():
|
|
|
|
|
if time.time() - start >= timeout:
|
|
|
|
|
raise AnsibleConnectionFailure("timeout waiting ssh data")
|
|
|
|
|
time.sleep(0.001)
|
|
|
|
|
return self._ssh_shell.recv(count)
|
|
|
|
|
|
|
|
|
|
def receive(self, command=None, prompts=None, answer=None, newline=True, prompt_retry_check=False, check_all=False):
|
|
|
|
|
'''
|
|
|
|
|
Handles receiving of output from command
|
|
|
|
|
@ -376,12 +386,14 @@ class Connection(NetworkConnectionBase):
|
|
|
|
|
buffer_read_timeout = self.get_option('persistent_buffer_read_timeout')
|
|
|
|
|
self._validate_timeout_value(buffer_read_timeout, "persistent_buffer_read_timeout")
|
|
|
|
|
|
|
|
|
|
receive_data_timeout = self._ssh_shell.gettimeout()
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
if command_prompt_matched:
|
|
|
|
|
try:
|
|
|
|
|
signal.signal(signal.SIGALRM, self._handle_buffer_read_timeout)
|
|
|
|
|
signal.setitimer(signal.ITIMER_REAL, buffer_read_timeout)
|
|
|
|
|
data = self._ssh_shell.recv(256)
|
|
|
|
|
data = self.receive_ssh_data(256, receive_data_timeout)
|
|
|
|
|
signal.alarm(0)
|
|
|
|
|
# if data is still received on channel it indicates the prompt string
|
|
|
|
|
# is wrongly matched in between response chunks, continue to read
|
|
|
|
|
@ -395,7 +407,7 @@ class Connection(NetworkConnectionBase):
|
|
|
|
|
except AnsibleCmdRespRecv:
|
|
|
|
|
return self._command_response
|
|
|
|
|
else:
|
|
|
|
|
data = self._ssh_shell.recv(256)
|
|
|
|
|
data = self.receive_ssh_data(256, receive_data_timeout)
|
|
|
|
|
|
|
|
|
|
# when a channel stream is closed, received data will be empty
|
|
|
|
|
if not data:
|
|
|
|
|
|