summaryrefslogtreecommitdiff
path: root/maintenance/health_monitor.py
blob: 87946b28b373f6fcdc822804914f9a7a3d5b8cca (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
import os, serial, smtplib
from time import sleep
from sbhs_server.credentials import ADMIN_EMAIL
from sbhs_server.helpers import mailer 

MAX_PORTS = 256
MIN_TEMP = 10
MAX_TEMP = 70

def write_to_port(s, com, arg):
    s.write(chr(int(com)))
    sleep(0.5)
    s.write(chr(int(arg)))
    sleep(0.5)

def read_from_port(s, com):
    s.write(chr(int(com)))
    sleep(0.5)
    if com == 255:
        result = ord(s.read(1)) + (0.1 * ord(s.read(1)))
    elif com == 252:
        result = ord(s.read(1))
    else:
        result = -1
    sleep(0.5)
    return result

def create_message(check_mids, defective_ports):
    msg = ''
    if len(check_mids) != 0:
        msg += 'Please check the following machine ids :\n'
        for i,mid in enumerate(check_mids):
            msg = msg + str(i) + '. ' + str(mid) + '\n'
    if len(defective_ports) != 0:
        msg = msg + '\nPlease check the following ports :\n'
        for port in defective_ports:
            msg = msg + str(port) + '\n'
    return msg

def main():
    present_online_mids, offline_mids, defective_ports = [], [], []
    for i in range(0,MAX_PORTS):
        path = '/dev/ttyUSB' + str(i)
        if os.path.exists(path):
            try:
                s = serial.Serial(port=path, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=2)
                if not s.is_open:
                    s.open()
                assert s.is_open
                mid = read_from_port(s, 252) # get machine id
                assert mid > 0
                write_to_port(s, 253, 100) # set fan speed
                write_to_port(s, 254, 0) # set heater value
                current_temp = read_from_port(s, 255) # get current temperature
                assert current_temp >= MIN_TEMP and current_temp <= MAX_TEMP
                present_online_mids.append(mid)
            except:
                if s.is_open:
                    if mid > 0:
                        offline_mids.append(mid)
                    else:
                        defective_ports.append(path)
            if s.is_open:
                s.close()
    check_mids = list(set(online_mids).difference(set(present_online_mids)))
    msg = create_message(check_mids, defective_ports)
    if len(msg) == 0:
        msg = "Nothing out of order was detected on the server. :)"
    #thread.start_new_thread(mailer.email, (ADMIN_EMAIL, "Health report of SBHS Server", msg))
    mailer.email(ADMIN_EMAIL, "Health report of SBHS Server", msg)
    #print msg

if __name__ == "__main__":
    main()