aboutsummaryrefslogtreecommitdiff
path: root/samplejobs/BWAuthChecker.py
blob: 618075e431f29b3ee3bd0517f82d346e22422009 (plain)
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
#!/usr/bin/env python

import os
import re
import time
import base64
import logging
import datetime 

import requests

import JobBase

class BWAuthChecker(JobBase.JobBase):
    def executeEvery(self):
        return JobBase.JobFrequency.HOUR
    def notifyOnFailureEvery(self):
        return JobBase.JobFailureNotificationFrequency.EVERYTIME
    def execute(self):
        body = ""
        url = "https://bwauth.ritter.vg/bwauth/bwscan.V3BandwidthsFile"
        try:
            r = requests.get(url)
            lines = r.content.split("\n")
            if len(lines) < 1:
                body = "Got no response for " + url + " from the server.\n\n" + r.content
            else:
                then = datetime.datetime.utcfromtimestamp(int(lines[0]))
                now = datetime.datetime.utcfromtimestamp(time.time())
                if now - then > datetime.timedelta(hours=4):
                    body = "The bandwidth file is more than 4 hours old.\n"
                    body += str((now-then).seconds / 60) + " minutes old.\n"
                elif len(lines) < 8300:
                    body = "The bandwidth file has a low number of relays: " + str(len(lines)) + "\n"
        except Exception as e:
            body = "Caught an exception checking the bwandwidth file timestamp:\n\n" + str(e)

        url = "https://bwauth.ritter.vg/bwauth/AA_percent-measured.txt"
        try:
            r = requests.get(url)
            lines = r.content.split("\n")
            if len(lines) < 1:
                body += "\n\nGot no response for " + url + " from the server.\n\n" + r.content
            else:
                i = -1
                while not lines[i].strip():
                    i -= 1
                g = re.match('NOTICE\[.+\]:Measured ([0-9].+)% of all tor nodes', lines[i])
                if not g:
                    body += "\n\nCould not find the measured percentage at " + url
                else:
                    percent = float(g.groups(0)[0])
                    if percent < 96:
                        body += "\n\nMeasured percentant of all tor nodes is low: " + str(percent)
        except Exception as e:
            body += "\n\nCaught an exception measuring the percentage of relays measured:\n\n" + str(e)
                    

        url = "https://bwauth.ritter.vg/bwauth/AA_scanner_loop_times.txt"
        try:
            r = requests.get(url)
            lines = r.content.split("\n")
            if len(lines) < 1:
                body += "\n\nGot no response for " + url + " from the server.\n\n" + r.content
            else:
                this_scanner = 0
                last_measured = None
                measurement_times = {}
                for l in lines:
                    if "Scanner" in l:
                        if this_scanner != 0:
                            measurement_times[this_scanner] = last_measured
                        this_scanner = int(l.replace("Scanner ", "").strip())
                    elif l.strip():
                        last_measured = re.match("NOTICE\[[^\s]+ ([0-9a-zA-Z: ]+)\]", l).groups(0)[0]
                        last_measured = datetime.datetime.strptime(last_measured, "%b %d %H:%M:%S %Y")
                measurement_times[this_scanner] = last_measured

                for t in measurement_times:
                    if measurement_times[t] + datetime.timedelta(days=6) < datetime.datetime.now():
                        body += "\n\nhttps://bwauth.ritter.vg/bwauth/AA_scanner_loop_times.txt\n"
                        body += "Scanner " + str(t) + " appears to be several days behind schedule."
        except Exception as e:
            body += "\n\nCaught an exception measuring the scanner loop times:\n\n" + str(e)

        if body:
            logging.warn("tor bwauth is broken?")
            logging.warn(body)
            self.logdetails = body
            return False
        else:
            return True
    def onFailure(self):
        return self.sendEmail("tor bwauth is broken?", self.logdetails)