~smoser/curtin/yakkety.lp1666986

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/python3
try:
    # python2
    import SimpleHTTPServer as http_server
    import SocketServer as socketserver
except ImportError:
    import http.server as http_server
    import socketserver

import json
import sys

EXAMPLE_CONFIG = """\
# example config
reporting:
  mypost:
    type: webhook
    endpoint: %(endpoint)s
install:
  log_file: /tmp/foo
  post_files: [/tmp/foo]

# example python:
from curtin.reporter import events, update_configuration
cfg = {'mypost': {'type': 'webhook', 'endpoint': '%(endpoint)s'}}
update_configuration(cfg)
with events.ReportEventStack(name="myname", description="mydesc",
                             reporting_enabled=True):
    print("do something")
"""

if len(sys.argv) > 2:
    PORT = int(sys.argv[2])
    addr = sys.argv[1]
elif len(sys.argv) > 1:
    PORT = int(sys.argv[1])
    addr = ""
else:
    PORT = 8000
    addr = ""


def render_event_string(event_str):
    return json.dumps(json.loads(event_str), indent=1)


class ServerHandler(http_server.SimpleHTTPRequestHandler):

    def log_request(self, code, size=None):
        lines = [
            "== %s %s ==" % (self.command, self.path),
            str(self.headers).replace('\r', '')]
        if self._message:
            lines.append(self._message)
        sys.stdout.write('\n'.join(lines) + '\n')
        sys.stdout.flush()

    def do_GET(self):
        self._message = None
        self.send_response(200)
        self.end_headers()
        self.wfile.write("content of %s\n" % self.path)

    def do_POST(self):
        length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(length).decode('utf-8')
        try:
            self._message = render_event_string(post_data)
        except Exception as e:
            self._message = '\n'.join(
		["failed printing event: %s" % e, post_data])

        msg = "received post to %s" % self.path
        self.send_response(200)
        self.send_header("Content-type", "text/plain")
        self.end_headers()
        self.wfile.write(msg.encode('utf-8'))

# avoid 'Address already in use' after ctrl-c
socketserver.TCPServer.allow_reuse_address = True

Handler = ServerHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
httpd.allow_reuse_address = True

info = {
    'interface': addr or "localhost",
    'port': PORT,
    'endpoint': "http://" + (addr or "localhost") + ":%s" % PORT
}
print("Serving at: %(endpoint)s" % info)
print("Post to this with:\n%s\n" % (EXAMPLE_CONFIG % info))

try:
    httpd.serve_forever()
except KeyboardInterrupt:
    sys.stdout.flush()
    pass
httpd.server_close()
sys.exit(0)