Skip to content

Instantly share code, notes, and snippets.

@Narayana108
Created September 21, 2020 12:39
Show Gist options
  • Save Narayana108/f29c6f913cf5b99d456e16bfd34e0252 to your computer and use it in GitHub Desktop.
Save Narayana108/f29c6f913cf5b99d456e16bfd34e0252 to your computer and use it in GitHub Desktop.
Monitor website downtime
#!/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