2016-03-26 13:32:11 +01:00
#! /usr/bin/env python
# encoding: utf-8
2018-01-31 11:48:43 +02:00
# Thomas Nagy, 2016-2018 (ita)
2016-03-26 13:32:11 +01:00
import os , sys , traceback , base64 , signal
try :
import cPickle
except ImportError :
import pickle as cPickle
try :
import subprocess32 as subprocess
except ImportError :
import subprocess
try :
TimeoutExpired = subprocess . TimeoutExpired
except AttributeError :
2018-01-31 11:48:43 +02:00
class TimeoutExpired ( Exception ) :
2016-03-26 13:32:11 +01:00
pass
def run ( ) :
txt = sys . stdin . readline ( ) . strip ( )
if not txt :
# parent process probably ended
sys . exit ( 1 )
[ cmd , kwargs , cargs ] = cPickle . loads ( base64 . b64decode ( txt ) )
cargs = cargs or { }
2019-06-03 10:40:55 +02:00
if not ' close_fds ' in kwargs :
# workers have no fds
kwargs [ ' close_fds ' ] = False
2016-03-26 13:32:11 +01:00
ret = 1
out , err , ex , trace = ( None , None , None , None )
try :
proc = subprocess . Popen ( cmd , * * kwargs )
try :
out , err = proc . communicate ( * * cargs )
except TimeoutExpired :
if kwargs . get ( ' start_new_session ' ) and hasattr ( os , ' killpg ' ) :
os . killpg ( proc . pid , signal . SIGKILL )
else :
proc . kill ( )
out , err = proc . communicate ( )
exc = TimeoutExpired ( proc . args , timeout = cargs [ ' timeout ' ] , output = out )
exc . stderr = err
raise exc
ret = proc . returncode
2018-01-31 11:48:43 +02:00
except Exception as e :
2016-03-26 13:32:11 +01:00
exc_type , exc_value , tb = sys . exc_info ( )
exc_lines = traceback . format_exception ( exc_type , exc_value , tb )
trace = str ( cmd ) + ' \n ' + ' ' . join ( exc_lines )
ex = e . __class__ . __name__
# it is just text so maybe we do not need to pickle()
tmp = [ ret , out , err , ex , trace ]
obj = base64 . b64encode ( cPickle . dumps ( tmp ) )
sys . stdout . write ( obj . decode ( ) )
sys . stdout . write ( ' \n ' )
sys . stdout . flush ( )
while 1 :
try :
run ( )
except KeyboardInterrupt :
break
2018-01-31 11:48:43 +02:00