Created
September 21, 2020 12:39
-
-
Save Narayana108/f29c6f913cf5b99d456e16bfd34e0252 to your computer and use it in GitHub Desktop.
Monitor website downtime
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
# -*- coding: utf-8 -*- | |
import os | |
import csv | |
import sys | |
import time | |
import socket | |
import datetime | |
import requests | |
def internet(host="127.0.0.1", port=3000, timeout=3): | |
""" Generates a new request""" | |
try: | |
socket.setdefaulttimeout(timeout) | |
socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port)) | |
return True | |
except Exception as ex: | |
return False | |
def uptime(site="https://google.com"): | |
# print("Monotoring: ", site) | |
try: | |
r = requests.get(site) | |
if r.status_code == 200: | |
return True | |
else: | |
r.status_code | |
return False | |
except: | |
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.csv') | |
def create_record_file(): | |
""" Create a new record file """ | |
with open('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.csv', 'r') as csvfile: | |
reader = csv.DictReader(csvfile) | |
for row in reader: | |
result = row | |
return None if result == None else result['status'] | |
def write_record(status): | |
""" Create a new record """ | |
with open('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.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, website): | |
""" Start monitoring """ | |
while True: | |
last_record = last_record_status() | |
# if not internet(): | |
if not uptime(website): | |
if last_record == '1' or last_record == None: | |
print('Site went down') | |
write_record(0) | |
else: | |
if last_record == '0' or last_record == None: | |
print('Site is up') | |
write_record(1) | |
time.sleep(sleep_time) | |
def args_error(): | |
print('Please provide an argument\nOptions\n./downtime.py monitor <site>\n./downtime.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, args[2]) | |
elif args[1] == 'downtime': | |
print('\nRemained down for : ', get_total_downtime(), ' HH:MM:SS ') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment