diff options
-rw-r--r-- | maintenance/health_monitor.py | 78 | ||||
-rw-r--r-- | requirements.txt | 3 | ||||
-rw-r--r-- | sbhs_server/credentials.py.example | 3 | ||||
-rw-r--r-- | sbhs_server/settings.py | 12 |
4 files changed, 91 insertions, 5 deletions
diff --git a/maintenance/health_monitor.py b/maintenance/health_monitor.py new file mode 100644 index 0000000..87946b2 --- /dev/null +++ b/maintenance/health_monitor.py @@ -0,0 +1,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() + + + + diff --git a/requirements.txt b/requirements.txt index 323eaed..600139a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ appdirs==1.4.3 backports-abc==0.5 certifi==2017.4.17 Django==1.11.1 +django-crontab==0.7.1 django-taggit==0.18.1 django-undelete==0.1 oauthlib==2.0.2 @@ -9,7 +10,7 @@ packaging==16.8 pkg-resources==0.0.0 PyJWT==1.5.0 pyparsing==2.2.0 -pyserial==2.7 +pyserial==3.0 python-openid==2.2.5 python-social-auth==0.2.19 pytz==2017.2 diff --git a/sbhs_server/credentials.py.example b/sbhs_server/credentials.py.example index 9f6ec5f..255bbae 100644 --- a/sbhs_server/credentials.py.example +++ b/sbhs_server/credentials.py.example @@ -2,4 +2,5 @@ PROJECT_SECRET_KEY = 'your django project secret key' EMAIL_HOST_USER = 'username' EMAIL_HOST_PASSWORD = 'password' MAP_FILE = 'path/to/file/map_machine_ids.txt' -LOG_FILE = '/path/to/logfile'
\ No newline at end of file +LOG_FILE = '/path/to/logfile' +ADMIN_EMAIL='admin email'
\ No newline at end of file diff --git a/sbhs_server/settings.py b/sbhs_server/settings.py index 1b6091f..82c95d7 100644 --- a/sbhs_server/settings.py +++ b/sbhs_server/settings.py @@ -63,6 +63,7 @@ INSTALLED_APPS = ( #'yaksh', 'taggit', #'corsheaders' + 'django_crontab', 'account', 'myadmin', @@ -137,6 +138,7 @@ EMAIL_HOST = 'smtp.gmail.com' #'smtp-auth.iitb.ac.in' EMAIL_PORT = 587 #25 EMAIL_HOST_USER = credentials.EMAIL_HOST_USER EMAIL_HOST_PASSWORD = credentials.EMAIL_HOST_PASSWORD +ADMIN_EMAIL=credentials.ADMIN_EMAIL # Static files (CSS, JavaScript, Images) @@ -184,6 +186,10 @@ TEMPLATES = [ }, ] +CRONJOBS = [ + ('2 * * * *', 'maintenance.health_monitor.main', '>> /tmp/health_monitor.log'), +] + import warnings warnings.filterwarnings( 'ignore', r"DateTimeField .* received a naive datetime", @@ -254,13 +260,13 @@ with open(os.path.join(BASE_DIR, 'map_machine_ids.txt')) as f: for line in f: try: data = line.split("=") - MID_PORT_MAP[int(data[0])]=data[1].strip() brd = sbhs.Sbhs() b = brd.connect(int(data[0])) assert b == True - key = int(brd.getMachineId()) + key = int(brd.getMachineId()) assert key > 0 brd.reset_board() + MID_PORT_MAP[key]=data[1].strip() boards[str(key)] = {"board": brd, "experiment_id": None} except: pass @@ -272,6 +278,6 @@ print "No of machines online : ", len(online_mids) import sys print >>sys.stderr, online_mids[1:33] #srikant #srikant -#f = open('/tmp/online_mids', 'w') +#f = open(os.path.join(BASE_DIR, 'maintenance/online_mids.txt'), 'w') #f.write(online_mids) #f.close() |