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