#!/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()
