~smoser/curtin/yakkety.lp1666986

1.1.32 by Scott Moser
Import upstream version 0.1.0~bzr314
1
#!/usr/bin/python3
2
try:
3
    # python2
4
    import SimpleHTTPServer as http_server
5
    import SocketServer as socketserver
6
except ImportError:
7
    import http.server as http_server
8
    import socketserver
9
1.1.30 by Scott Moser
Import upstream version 0.1.0~bzr275
10
import json
11
import sys
12
13
EXAMPLE_CONFIG = """\
14
# example config
15
reporting:
16
  mypost:
17
    type: webhook
18
    endpoint: %(endpoint)s
19
install:
20
  log_file: /tmp/foo
1.1.32 by Scott Moser
Import upstream version 0.1.0~bzr314
21
  post_files: [/tmp/foo]
22
23
# example python:
24
from curtin.reporter import events, update_configuration
25
cfg = {'mypost': {'type': 'webhook', 'endpoint': '%(endpoint)s'}}
26
update_configuration(cfg)
27
with events.ReportEventStack(name="myname", description="mydesc",
28
                             reporting_enabled=True):
29
    print("do something")
30
"""
1.1.30 by Scott Moser
Import upstream version 0.1.0~bzr275
31
32
if len(sys.argv) > 2:
33
    PORT = int(sys.argv[2])
34
    addr = sys.argv[1]
35
elif len(sys.argv) > 1:
36
    PORT = int(sys.argv[1])
37
    addr = ""
38
else:
39
    PORT = 8000
40
    addr = ""
41
42
43
def render_event_string(event_str):
44
    return json.dumps(json.loads(event_str), indent=1)
45
46
1.1.32 by Scott Moser
Import upstream version 0.1.0~bzr314
47
class ServerHandler(http_server.SimpleHTTPRequestHandler):
1.1.30 by Scott Moser
Import upstream version 0.1.0~bzr275
48
49
    def log_request(self, code, size=None):
50
        lines = [
51
            "== %s %s ==" % (self.command, self.path),
52
            str(self.headers).replace('\r', '')]
53
        if self._message:
54
            lines.append(self._message)
55
        sys.stdout.write('\n'.join(lines) + '\n')
56
        sys.stdout.flush()
57
58
    def do_GET(self):
59
        self._message = None
60
        self.send_response(200)
61
        self.end_headers()
62
        self.wfile.write("content of %s\n" % self.path)
63
64
    def do_POST(self):
65
        length = int(self.headers['Content-Length'])
66
        post_data = self.rfile.read(length).decode('utf-8')
67
        try:
68
            self._message = render_event_string(post_data)
69
        except Exception as e:
70
            self._message = '\n'.join(
71
		["failed printing event: %s" % e, post_data])
72
1.1.32 by Scott Moser
Import upstream version 0.1.0~bzr314
73
        msg = "received post to %s" % self.path
74
        self.send_response(200)
75
        self.send_header("Content-type", "text/plain")
76
        self.end_headers()
77
        self.wfile.write(msg.encode('utf-8'))
1.1.30 by Scott Moser
Import upstream version 0.1.0~bzr275
78
79
# avoid 'Address already in use' after ctrl-c
1.1.32 by Scott Moser
Import upstream version 0.1.0~bzr314
80
socketserver.TCPServer.allow_reuse_address = True
1.1.30 by Scott Moser
Import upstream version 0.1.0~bzr275
81
82
Handler = ServerHandler
1.1.32 by Scott Moser
Import upstream version 0.1.0~bzr314
83
httpd = socketserver.TCPServer(("", PORT), Handler)
1.1.30 by Scott Moser
Import upstream version 0.1.0~bzr275
84
httpd.allow_reuse_address = True
85
86
info = {
87
    'interface': addr or "localhost",
88
    'port': PORT,
89
    'endpoint': "http://" + (addr or "localhost") + ":%s" % PORT
90
}
91
print("Serving at: %(endpoint)s" % info)
92
print("Post to this with:\n%s\n" % (EXAMPLE_CONFIG % info))
93
94
try:
95
    httpd.serve_forever()
96
except KeyboardInterrupt:
97
    sys.stdout.flush()
98
    pass
99
httpd.server_close()
100
sys.exit(0)