Create collector.py
diff --git a/collector.py b/collector.py
new file mode 100644
index 0000000..4d5b71d
--- /dev/null
+++ b/collector.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python3
+
+import subprocess
+import json
+import re
+import time
+import threading
+import http.server
+import socketserver
+
+ALLOWED_IPS = [
+    '116.203.81.167',  # tools-vm-he-de
+]
+
+
+def gather_stats():
+   """Gathers stats via qshape"""
+    while True:
+        real_now = time.time()
+        now = real_now - (real_now % 300)
+        recipient_data = subprocess.check_output(
+            '/usr/sbin/qshape | /usr/bin/head -n 25',
+            shell=True,
+            stderr=subprocess.DEVNULL
+        ).decode('ascii')
+        sender_data = subprocess.check_output(
+            '/usr/sbin/qshape -s | /usr/bin/head -n 25',
+            shell=True,
+            stderr=subprocess.DEVNULL
+        ).decode('ascii')
+        recipients = {}
+        senders = {}
+        for match in re.finditer(r"^\s+([^\s.]+\.\S+)\s+(\d+)((\s+\d+)+)\n", recipient_data, re.MULTILINE):
+            domain = match.group(1)
+            pending = int(match.group(2))
+            times = [int(x) for x in match.group(3).split(' ') if x]
+            recipients[domain] = {
+                'pending': pending,
+                'times': times,
+            }
+        for match in re.finditer(r"^\s+([^\s.]+\.\S+)\s+(\d+)((\s+\d+)+)\n", sender_data, re.MULTILINE):
+            domain = match.group(1)
+            pending = int(match.group(2))
+            times = [int(x) for x in match.group(3).split(' ') if x]
+            senders[domain] = {
+                'pending': pending,
+                'times': times,
+            }
+
+        try:
+            file_json = json.loads(open('qshape.json', 'r').read())
+        except:
+            file_json = []
+        while len(file_json) > 288:
+            file_json.pop()
+        file_json.append({
+            'timestamp': int(now),
+            'recipients': recipients,
+            'senders': senders,
+        })
+        with open('qshape.json', 'w') as f:
+            json.dump(file_json, f, indent=2)
+            f.close()
+
+        then = time.time()
+        diff = then - real_now
+        print("Sleeping for %u seconds now.." % (300-diff))
+        time.sleep(300 - diff)
+
+
+class StatsHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
+    def do_GET(self):
+        if self.client_address[0] in ALLOWED_IPS:
+            print("%s is allowed, handing JSON.." % self.client_address[0])
+            self.path = './qshape.json'
+            return http.server.SimpleHTTPRequestHandler.do_GET(self)
+        else:
+            return None
+
+
+def main():
+    print("Starting stats collector")
+    gs = threading.Thread(target=gather_stats)
+    gs.start()
+    server = socketserver.ThreadingTCPServer(("0.0.0.0", 8083), StatsHttpRequestHandler)
+    print("Started json server at 8083...")
+    server.serve_forever()
+
+
+if __name__ == '__main__':
+    main()