Commit 301edb5b by Michael DeHaan

use StringIO for output concatenation, minor other tweaks to previous commit

parent 3cc564c1
...@@ -28,6 +28,7 @@ from ansible import errors ...@@ -28,6 +28,7 @@ from ansible import errors
from ansible import __version__ from ansible import __version__
import ansible.constants as C import ansible.constants as C
import time import time
import StringIO
VERBOSITY=0 VERBOSITY=0
...@@ -120,6 +121,7 @@ def json_loads(data): ...@@ -120,6 +121,7 @@ def json_loads(data):
def parse_json(raw_data): def parse_json(raw_data):
''' this version for module return data only ''' ''' this version for module return data only '''
# ignore stuff like tcgetattr spewage or other warnings
data = filter_leading_non_json_lines(raw_data) data = filter_leading_non_json_lines(raw_data)
try: try:
...@@ -417,29 +419,30 @@ def do_encrypt(result, encrypt, salt_size=None, salt=None): ...@@ -417,29 +419,30 @@ def do_encrypt(result, encrypt, salt_size=None, salt=None):
return result return result
def last_non_blank_line(lines): def last_non_blank_line(buf):
all_lines = lines.splitlines()
all_lines = buf.splitlines()
all_lines.reverse() all_lines.reverse()
for line in all_lines: for line in all_lines:
if (len(line) > 0): if (len(line) > 0):
return line return line
# shouldn't occur unless there's no output
return "" # we shouldn't come here (no lines?) but let's pretend nothing happend return ""
# We can't return all lines here because calling code expects only one
# line. And since we don't know which line to return we return an empty def filter_leading_non_json_lines(buf):
# line. '''
used to avoid random output from SSH at the top of JSON output, like messages from
def is_valid_json_line(line): tcagetattr, or where dropbear spews MOTD on every single command (which is nuts).
return line.startswith('=') or line.startswith('{') or line.startswith('[')
need to filter anything which starts not with '{', '[', ', '=' or is an empty line.
def filter_leading_non_json_lines(lines): filter only leading lines since multiline JSON is valid.
''' we need to filter anything which starts not with '{', '[', ', '=' or is an empty line. '''
But we filter only leading lines since multiline JSON is valid. '''
filtered_lines = '' filtered_lines = StringIO.StringIO()
no_more_filtering = False stop_filtering = False
for line in lines.splitlines(): for line in buf.splitlines():
if (no_more_filtering or is_valid_json_line(line)): if stop_filtering or "=" in line or line.startswith('{') or line.startswith('['):
no_more_filtering = True stop_filtering = True
filtered_lines += line + '\n' filtered_lines.write(line + '\n')
return filtered_lines return filtered_lines.getvalue()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment