#!/usr/bin/python3 # -*- coding: utf-8 -*- import os import csv import sys import time import socket import datetime import sqlite3 from pathlib import Path path = Path(__file__).resolve().parent def update_db(payload): conn = None try: db = (str(path) + "/data/db.sqlite3") conn = sqlite3.connect(db) c = conn.cursor() c.execute( ''' CREATE TABLE IF NOT EXISTS netmonResults ( id integer PRIMARY KEY, timestamp text, status integer ) ''' ) c.execute( ''' INSERT OR REPLACE into netmonResults ( timestamp, status ) VALUES (?, ?) ''', (payload) ) conn.commit() print (f"db update successful") except Exception as ex: print(ex) print (f"db operation failed") finally: if conn: conn.close() def internet(dstHost, dstPort, timeout=3): """ Generates a new request""" try: socket.setdefaulttimeout(timeout) socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((dstHost, int(dstPort))) return True except Exception as ex: # print(ex) return False def current_timestamp(): """ Get Current timestamp string """ return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") def str_to_date(timestamp): """ Convert timestamp string to date object """ return datetime.datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S") def secs_to_HMS(secs): """ Convert seconds to second and minutes Format : HH:MM:SS """ return str(datetime.timedelta(seconds=secs)); def record_file_exist(): """ Check if records file exist """ return os.path.isfile('data/data.csv') def create_record_file(): """ Create a new record file """ with open('data/data.csv', 'a') as csvfile: columns = ['timestamp', 'status'] writer = csv.DictWriter(csvfile, fieldnames=columns) writer.writeheader() def last_record_status(): """ Get last record """ result = None with open('data/data.csv', 'r') as csvfile: reader = csv.DictReader(csvfile) for row in reader: result = row return None if result is None else result['status'] def write_record(status): """ Create a new record """ with open('data/data.csv', 'a') as csvfile: columns = ['timestamp', 'status'] writer = csv.DictWriter(csvfile, fieldnames=columns) writer.writerow({'timestamp': str(current_timestamp()), 'status': status}) def get_total_downtime(): """ Calculate downtime """ seconds = 0 down = None up = None with open('data/data.csv', 'r') as csvfile: reader = csv.DictReader(csvfile) for record in reader: try: if record['status'] == '0': print('Went Down at : ', record['timestamp']) down = str_to_date(record['timestamp']) next_record = next(reader) up = str_to_date(next_record['timestamp']) seconds += (up - down).total_seconds() print('Went up at : ', next_record['timestamp']) except Exception as ex: print('\nCurrent Status : Still Down') seconds += (str_to_date(current_timestamp()) - down).total_seconds() return secs_to_HMS(seconds); def monitor_connection(sleep_time): try: dstHost = os.getenv('dstHost') dstPort = os.getenv('dstPort') if dstHost is None or dstPort is None: raise Exception('vars are fucked') except Exception as error: print('Caught this error: ' + repr(error)) print (""" pls set vars eg; for host: export dstHost=localhost dstPort=8000 for docker: -e dstHost=localhost -e dstPort=8000 """) sys.exit(1) """ Start monitoring """ print('Monitoring your connection for ' + dstHost) while True: last_record = last_record_status() if not internet(dstHost, dstPort): if last_record == '1' or last_record is None: print('Internet went down') write_record(0) update_db((str(current_timestamp()), '0')) else: if last_record == '0' or last_record is None: print('Internet is up') write_record(1) update_db((str(current_timestamp()), '1')) time.sleep(sleep_time) def args_error(): print('Please provide an argument\nOptions\n./internet.py monitor\n./internet.py downtime') args = sys.argv if not len(args) > 1: args_error() elif args[1] == 'monitor': if not record_file_exist(): create_record_file() monitor_connection(1) elif args[1] == 'downtime': print('\nRemained down for : ', get_total_downtime(), ' HH:MM:SS ')