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