diff --git a/awx/api/views.py b/awx/api/views.py
index be0f93aec9..779a718a13 100644
--- a/awx/api/views.py
+++ b/awx/api/views.py
@@ -1653,6 +1653,8 @@ class UnifiedJobStdout(RetrieveAPIView):
unified_job = self.get_object()
if request.accepted_renderer.format in ('html', 'api'):
scheme = request.QUERY_PARAMS.get('scheme', None)
+ start_line = request.QUERY_PARAMS.get('start_line', 0)
+ end_line = request.QUERY_PARAMS.get('end_line', None)
if scheme not in SCHEME:
scheme = 'ansi2html'
dark_val = request.QUERY_PARAMS.get('dark', '')
@@ -1663,11 +1665,11 @@ class UnifiedJobStdout(RetrieveAPIView):
title=get_view_name(self.__class__))
if content_only:
headers = conv.produce_headers()
- body = conv.convert(unified_job.result_stdout_raw, full=False)
+ body = conv.convert(unified_job.result_stdout_raw_limited(start_line, end_line), full=False)
data = '\n'.join([headers, body])
data = '
%s
' % data
else:
- data = conv.convert(unified_job.result_stdout_raw)
+ data = conv.convert(unified_job.result_stdout_raw_limited(start_line, end_line))
# Fix ugly grey background used by default.
data = data.replace('.body_background { background-color: #AAAAAA; }',
'.body_background { background-color: #f5f5f5; }')
diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py
index 9e18ccf361..152d5910aa 100644
--- a/awx/main/models/unified_jobs.py
+++ b/awx/main/models/unified_jobs.py
@@ -8,6 +8,7 @@ import re
import shlex
import os
import os.path
+from cStringIO import StringIO
# PyYAML
import yaml
@@ -501,21 +502,35 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
pass
super(UnifiedJob, self).delete()
- @property
- def result_stdout_raw(self):
+ def result_stdout_raw_handle(self):
if self.result_stdout_file != "":
if not os.path.exists(self.result_stdout_file):
- return "stdout capture is missing"
- with open(self.result_stdout_file, "r") as stdout_fd:
- return stdout_fd.read()
+ return StringIO("stdout capture is missing")
+ return open(self.result_stdout_file, "r")
else:
- return self.result_stdout_text
+ return StringIO(self.result_stdout_text)
+
+ @property
+ def result_stdout_raw(self):
+ return self.result_stdout_raw_handle().read()
@property
def result_stdout(self):
ansi_escape = re.compile(r'\x1b[^m]*m')
return ansi_escape.sub('', self.result_stdout_raw)
+ def result_stdout_raw_limited(self, start_line=0, end_line=None):
+ return_buffer = ""
+ if end_line is not None:
+ end_line = int(end_line)
+ for line in self.result_stdout_raw_handle().readlines()[int(start_line):end_line]:
+ return_buffer += line
+ return return_buffer
+
+ def result_stdout_limited(self, start_line=0, end_line=None):
+ ansi_escape = re.compile(r'\x1b[^m]*m')
+ return ansi_escape.sub('', self.result_stdout_raw_limited(start_line, end_line))
+
@property
def celery_task(self):
try: