11#!/usr/bin/python
2+ import ns
23import traceback , json , socket , struct , os , sys , socket , threading
34import rethinkdb
4- import flask
55import tornado .ioloop
66import tornado .web
77import tornado .httpserver
88import tornado .netutil
9-
10- sys .path .append ('/handler' )
11- import lambda_func # assume submitted .py file is /handler/lambda_func
9+ import time
1210
1311flask_app = flask .Flask (__name__ )
14-
1512PROCESSES_DEFAULT = 10
1613PORT = 8080
1714initialized = False
@@ -24,7 +21,6 @@ def init():
2421 if initialized :
2522 return
2623 sys .stdout = sys .stderr # flask supresses stdout :(
27- config = json .loads (os .environ ['ol.config' ])
2824 if config .get ('db' , None ) == 'rethinkdb' :
2925 host = config .get ('rethinkdb.host' , 'localhost' )
3026 port = config .get ('rethinkdb.port' , 28015 )
@@ -38,14 +34,14 @@ def init():
3834def flask_post (path ):
3935 try :
4036 init ()
41- flask .request .get_data ()
42- data = flask .request .data
43- try :
37+ data = flask .request .get_data ()
38+ try :
4439 event = json .loads (data )
45- except :
46- return ('bad POST data: "%s"' % str (data ), 400 )
40+ except Exception :
41+ return ('bad POST data: "%s"' % str (data ), 400 )
4742 return json .dumps (lambda_func .handler (db_conn , event ))
48- except Exception :
43+ except Exception as e :
44+ print (e )
4945 return (traceback .format_exc (), 500 ) # internal error
5046
5147class SockFileHandler (tornado .web .RequestHandler ):
@@ -68,19 +64,64 @@ def post(self):
6864 (r".*" , SockFileHandler ),
6965])
7066
71- def main ():
72- config = json .loads (os .environ ['ol.config' ])
67+ def start_container (conf ):
68+ sys .path .append ('/handler' )
69+ global lambda_func , config
70+
71+ import lambda_func # assume submitted .py file is /handler/lambda_func
72+ config = conf
7373
7474 if 'sock_file' in config :
75+ #f.write("listening socket\n")
7576 # listen on sock file with Tornado
7677 server = tornado .httpserver .HTTPServer (tornado_app )
7778 socket = tornado .netutil .bind_unix_socket ('/host/' + config ['sock_file' ])
7879 server .add_socket (socket )
7980 tornado .ioloop .IOLoop .instance ().start ()
8081 else :
82+ #f.write("listening flask\n")
8183 # listen on port with Flask
8284 procs = config .get ('processes' , PROCESSES_DEFAULT )
8385 flask_app .run (processes = procs , host = '0.0.0.0' , port = PORT )
8486
87+ def listen (path ):
88+ args = ""
89+ with open (path ) as fifo :
90+ while True :
91+ data = fifo .read ()
92+ if len (data ) == 0 :
93+ break
94+ args += data
95+ return args
96+
97+ def main ():
98+ sys .stdout = sys .stderr
99+ if len (sys .argv ) < 2 :
100+ print ("Usage: %s <fifo>" % sys .argv [0 ])
101+ sys .exit (1 )
102+
103+ fifo = os .path .abspath (sys .argv [1 ])
104+
105+ #f = open('/tmp/log', 'w')
106+ while True :
107+ print ("host listening" )
108+ #f.write("host listening\n")
109+ pid , conf = listen (fifo ).split (None , 1 )
110+ conf = json .loads (conf )
111+ print ("pid: %s\n conf: %s\n " % (pid , conf ))
112+ #f.write("pid: %s\nconf: %s\n" % (pid, conf))
113+
114+ r = ns .forkenter (pid )
115+ # child escape
116+ if r == 0 :
117+ print ("forkentered" )
118+ #f.write("forkentered\n")
119+ break
120+
121+ try :
122+ start_container (conf )
123+ except Exception as e :
124+ print (e )
125+
85126if __name__ == '__main__' :
86127 main ()
0 commit comments