[fix] Wrap script output with non-blocking object in hook_exec #30

This commit is contained in:
Jérôme Lebleu 2014-07-28 14:06:20 +02:00
parent cb9b038747
commit 31ef39e4e5

31
hook.py
View file

@ -29,6 +29,7 @@ import re
import json import json
import errno import errno
import subprocess import subprocess
from shlex import split as arg_split
from moulinette.core import MoulinetteError from moulinette.core import MoulinetteError
@ -129,6 +130,7 @@ def hook_exec(file, args=None):
args -- Arguments to pass to the script args -- Arguments to pass to the script
""" """
from moulinette.helpers import NonBlockingStreamReader
from yunohost.app import _value_for_locale from yunohost.app import _value_for_locale
if isinstance(args, list): if isinstance(args, list):
@ -183,13 +185,24 @@ def hook_exec(file, args=None):
msignals.display(m18n.n('executing_script')) msignals.display(m18n.n('executing_script'))
p = subprocess.Popen('su - admin -c "cd \\"{:s}\\" && ' \ p = subprocess.Popen(
'/bin/bash -x \\"{:s}\\" {:s}"'.format(file_path, file, arg_str), arg_split('su - admin -c "cd \\"{:s}\\" && ' \
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) '/bin/bash -x \\"{:s}\\" {:s}"'.format(
for line in iter(p.stdout.readline, ''): file_path, file, arg_str)),
line = line.rstrip() stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
msignals.display(line, 'log') shell=False)
errorcode = p.poll()
p.stdout.close()
return errorcode # Wrap and get process ouput
stream = NonBlockingStreamReader(p.stdout)
while True:
line = stream.readline(True, 0.1)
if not line:
# Check if process has terminated
returncode = p.poll()
if returncode is not None:
break
else:
msignals.display(line.rstrip(), 'log')
stream.close()
return returncode