@ -2,7 +2,6 @@
from multiprocessing import Process
from subprocess import PIPE
from subprocess import Popen
from sys import stdout as stdoutput
from . logs import Logs
@ -14,37 +13,52 @@ class Runner(object):
self . log = Logs ( ) . log
self . cmds = cmds
self . raw_output = config . raw_output
self . parallele_run = config . run_post_commands_in_parallele
self . stdout_cb = self . log . info if not self . raw_output else print
self . stderr_cb = self . log . warning if not self . raw_output else print
def stdout ( self , output ) :
for line in output :
self . stdout_cb ( line . rstrip ( ) )
def stderr ( self , output ) :
for line in output :
self . stderr_cb ( line . rstrip ( ) )
def stream_output ( self , proc ) :
display_stdout = Process ( target = self . stdout , args = ( proc . stdout , ) )
display_stdout . start ( )
display_stderr = Process ( target = self . stderr , args = ( proc . stderr , ) )
display_stderr . start ( )
def run_cmd ( self , cmd , stdout = False ) :
self . log . debug ( ' run command: {} ' . format ( cmd ) )
proc = Popen ( cmd , shell = True , stdout = PIPE , stderr = PIPE )
out , err = proc . communicate ( )
def dispout ( output , cb ) :
enc = stdoutput . encoding or ' UTF-8 '
output = output . decode ( enc ) . split ( ' \n ' )
lenght = len ( output )
for c , line in enumerate ( output ) :
if c + 1 == lenght and not len ( line ) :
# Do not display last empty line
break
cb ( line )
if err :
display_cb = self . log . warning if not self . raw_output else print
dispout ( err , display_cb )
if out :
display_cb = self . log . info if not self . raw_output else print
with Popen ( cmd ,
shell = True ,
stdout = PIPE ,
stderr = PIPE ,
universal_newlines = True ) as proc :
if stdout :
return out . decode ( )
dispout ( out , display_cb )
output , _ = proc . communicate ( )
else :
self . stream_output ( proc )
if proc . returncode :
raise Exception ( ' Command exit code: {} ' . format ( proc . returncode ) )
if stdout and output :
return output
def run ( self ) :
for cmd in self . cmds :
self . run_cmd ( cmd )
def run_in_process ( self ) :
if self . parallele_run :
return self . run_in_parallele ( )
self . proc = Process ( target = self . run )
self . proc . start ( )
def run_in_parallele ( self ) :
for cmd in self . cmds :
self . proc = Process ( target = self . run_cmd ,
args = [ cmd ] )
self . proc . start ( )