github.com/emc-advanced-dev/unik@v0.0.0-20190717152701-a58d3e8e33b7/containers/compilers/rump/python3/python-wrapper/python-wrapper-ec2.py (about) 1 import http.client 2 import json 3 from io import StringIO 4 import sys 5 import threading 6 from http.server import BaseHTTPRequestHandler, HTTPServer 7 8 ###From https://github.com/bmc/grizzled-python/blob/bf9998bd0f6497d1e368610f439f9085d019bf76/grizzled/io/__init__.py 9 # --------------------------------------------------------------------------- 10 # Imports 11 # --------------------------------------------------------------------------- 12 13 import os 14 import zipfile 15 16 class MultiWriter(object): 17 """ 18 Wraps multiple file-like objects so that they all may be written at once. 19 For example, the following code arranges to have anything written to 20 ``sys.stdout`` go to ``sys.stdout`` and to a temporary file: 21 .. python:: 22 import sys 23 from grizzled.io import MultiWriter 24 sys.stdout = MultiWriter(sys.__stdout__, open('/tmp/log', 'w')) 25 """ 26 def __init__(self, *args): 27 """ 28 Create a new ``MultiWriter`` object to wrap one or more file-like 29 objects. 30 :Parameters: 31 args : iterable 32 One or more file-like objects to wrap 33 """ 34 self.__files = args 35 36 def write(self, buf): 37 """ 38 Write the specified buffer to the wrapped files. 39 :Parameters: 40 buf : str or bytes 41 buffer to write 42 """ 43 for f in self.__files: 44 f.write(buf) 45 46 def flush(self): 47 """ 48 Force a flush. 49 """ 50 for f in self.__files: 51 f.flush() 52 53 def close(self): 54 """ 55 Close all contained files. 56 """ 57 for f in self.__files: 58 f.close() 59 60 logsbuf = StringIO() 61 62 class Capturing(list): 63 def __enter__(self): 64 self._stdout = sys.stdout 65 self._stderr = sys.stderr 66 sys.stdout = self._stringioout = MultiWriter(logsbuf, self._stdout) 67 sys.stderr = self._stringioerr = MultiWriter(logsbuf, self._stderr) 68 return self 69 def __exit__(self, *args): 70 self.extend(logsbuf.getvalue().splitlines()) 71 self.extend(logsbuf.getvalue().splitlines()) 72 sys.stdout = self._stdout 73 sys.stderr = self._stderr 74 75 CONST_PORT=9967 76 77 # HTTPRequestHandler class 78 class LogServer(BaseHTTPRequestHandler): 79 # GET 80 def do_GET(self): 81 # Send response status code 82 self.send_response(200) 83 84 # Send headers 85 self.send_header('Content-type','text/html') 86 self.end_headers() 87 88 # Send message back to client 89 message = logsbuf.getvalue() 90 # Write content as utf-8 data 91 self.wfile.write(bytes(message, "utf8")) 92 return 93 94 def run(): 95 print('starting server on port', CONST_PORT) 96 server_address = ('127.0.0.1', CONST_PORT) 97 httpd = HTTPServer(server_address, LogServer) 98 print('running server...') 99 httpd.serve_forever() 100 101 with Capturing(): 102 os.chdir("/bootpart") 103 t = threading.Thread(target = run) 104 t.daemon = True 105 t.start() 106 107 connection = http.client.HTTPConnection("169.254.169.254") 108 connection.request('GET', '/latest/user-data') 109 print("sending GET 169.254.169.254/latest/user-data") 110 response = connection.getresponse() 111 env = json.loads(response.read().decode()) 112 print("received", env) 113 for key in env: 114 os.environ[key] = env[key] 115 116 import main.py ##NAME OF SCRIPT GOES HERE