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)
|