client/rhel/spacewalk-oscap/scap.py | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
New commits:
commit cc9a2a119ff3519dca56ed1e6f2b189a98a8f024
Author: Simon Lukasik <slukasik(a)redhat.com>
Date: Fri Oct 11 14:32:39 2013 +0200
1009512 - redirect stdout of xsltproc to /dev/null
Do not try to capture the output in the memory. It may get full
and cause oscap's flush() operation to hang out. Like:
#0 0x0000003c85edb690 in __write_nocancel () from /lib64/libc.so.6
#1 0x0000003c85e71d93 in _IO_new_file_write () from /lib64/libc.so.6
#2 0x0000003c85e73345 in _IO_new_do_write () from /lib64/libc.so.6
#3 0x0000003c85e71a0d in _IO_new_file_xsputn () from /lib64/libc.so.6
#4 0x0000003c85e67d0d in fwrite () from /lib64/libc.so.6
(...)
Related: 56f4bc473665b617e8fc23739fb43740c647d274
diff --git a/client/rhel/spacewalk-oscap/scap.py b/client/rhel/spacewalk-oscap/scap.py
index 21af704..f2c50e5 100644
--- a/client/rhel/spacewalk-oscap/scap.py
+++ b/client/rhel/spacewalk-oscap/scap.py
@@ -38,7 +38,7 @@ def xccdf_eval(args, cache_only=None):
_cleanup_temp(results_dir)
return (1, 'oscap tool did not produce valid xml.\n' + oscap_err, {})
- ret, resume, xslt_err = _xccdf_resume(results_file.name)
+ ret, resume, xslt_err = _xccdf_resume(results_file.name, temp_dir=results_dir)
if ret != 0 or resume == '':
del(results_file)
_cleanup_temp(results_dir)
@@ -68,15 +68,24 @@ def _run_oscap(arguments):
log.log_debug('The oscap tool completed\n%s' % errors)
return errors
-def _xccdf_resume(results_file):
+def _xccdf_resume(results_file, temp_dir=None):
xslt = '/usr/share/openscap/xsl/xccdf-resume.xslt'
- c = _popen(['/usr/bin/xsltproc', xslt, results_file])
+
+ dev_null = open('/dev/null')
+ resume_file = tempfile.NamedTemporaryFile(dir=temp_dir)
+ c = _popen(['/usr/bin/xsltproc', '--output', resume_file.name,
+ xslt, results_file], stdout=dev_null.fileno())
ret = c.wait()
+ dev_null.close()
+
errors = c.stderr.read()
if ret != 0:
errors += 'xccdf_eval: xsltproc tool returned %i\n' % ret
log.log_debug('The xsltproc tool completed:\n%s' % errors)
- return ret, c.stdout.read(), errors
+
+ resume = resume_file.read()
+ del(resume_file)
+ return ret, resume, errors
def _popen(args, stdout=subprocess.PIPE):
log.log_debug('Running: ' + str(args))
Show replies by date