-
-
Save adeekshith/fef4ff9949b88ce102bd to your computer and use it in GitHub Desktop.
Scripts for website monitoring using Python
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/env python | |
# sample usage: checksites.py eriwen.com nixtutor.com yoursite.org | |
import pickle, os, sys, logging | |
from httplib import HTTPConnection, socket | |
from smtplib import SMTP | |
def email_alert(message, status): | |
fromaddr = 'you@gmail.com' | |
toaddrs = 'yourphone@txt.att.net' | |
server = SMTP('smtp.gmail.com:587') | |
server.starttls() | |
server.login('you', 'password') | |
server.sendmail(fromaddr, toaddrs, 'Subject: %s\r\n%s' % (status, message)) | |
server.quit() | |
def get_site_status(url): | |
response = get_response(url) | |
try: | |
if getattr(response, 'status') == 200: | |
return 'up' | |
except AttributeError: | |
pass | |
return 'down' | |
def get_response(url): | |
'''Return response object from URL''' | |
try: | |
conn = HTTPConnection(url) | |
conn.request('HEAD', '/') | |
return conn.getresponse() | |
except socket.error: | |
return None | |
except: | |
logging.error('Bad URL:', url) | |
exit(1) | |
def get_headers(url): | |
'''Gets all headers from URL request and returns''' | |
response = get_response(url) | |
try: | |
return getattr(response, 'getheaders')() | |
except AttributeError: | |
return 'Headers unavailable' | |
def compare_site_status(prev_results): | |
'''Report changed status based on previous results''' | |
def is_status_changed(url): | |
status = get_site_status(url) | |
friendly_status = '%s is %s' % (url, status) | |
print friendly_status | |
if url in prev_results and prev_results[url] != status: | |
logging.warning(status) | |
# Email status messages | |
email_alert(str(get_headers(url)), friendly_status) | |
prev_results[url] = status | |
return is_status_changed | |
def is_internet_reachable(): | |
'''Checks Google then Yahoo just in case one is down''' | |
if get_site_status('www.google.com') == 'down' and get_site_status('www.yahoo.com') == 'down': | |
return False | |
return True | |
def load_old_results(file_path): | |
'''Attempts to load most recent results''' | |
pickledata = {} | |
if os.path.isfile(file_path): | |
picklefile = open(file_path, 'rb') | |
pickledata = pickle.load(picklefile) | |
picklefile.close() | |
return pickledata | |
def store_results(file_path, data): | |
'''Pickles results to compare on next run''' | |
output = open(file_path, 'wb') | |
pickle.dump(data, output) | |
output.close() | |
def main(urls): | |
# Setup logging to store time | |
logging.basicConfig(level=logging.WARNING, filename='checksites.log', | |
format='%(asctime)s %(levelname)s: %(message)s', | |
datefmt='%Y-%m-%d %H:%M:%S') | |
# Load previous data | |
pickle_file = 'data.pkl' | |
pickledata = load_old_results(pickle_file) | |
# Check sites only if Internet is_available | |
if is_internet_reachable(): | |
status_checker = compare_site_status(pickledata) | |
map(status_checker, urls) | |
else: | |
logging.error('Either the world ended or we are not connected to the net.') | |
# Store results in pickle file | |
store_results(pickle_file, pickledata) | |
if __name__ == '__main__': | |
# First arg is script name, skip it | |
main(sys.argv[1:]) |
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/env python | |
from threading import Thread | |
import requests ## pip install requests | |
import time | |
import smtplib | |
## email sending function | |
def email_sender(input_message, email_to, client): | |
''' function to send email ''' | |
to = email_to | |
gmail_user = '' ## email of sender account | |
gmail_pwd = '' ## password of sender account | |
smtpserver = smtplib.SMTP("smtp.gmail.com",587) | |
smtpserver.ehlo() | |
smtpserver.starttls() | |
smtpserver.ehlo | |
smtpserver.login(gmail_user, gmail_pwd) | |
header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:site down! \n' | |
input_message = input_message + client | |
msg = header + input_message | |
smtpserver.sendmail(gmail_user, to, msg) | |
smtpserver.close() | |
## list of sites to track along with email address to send the alert | |
clients = {"client":"email", | |
"client":"email", | |
"client":"email"} | |
## temporary dictionary used to do separate monitoring when a site is down | |
temp_dic = {} | |
## site 'up' function | |
def site_up(): | |
''' function to monitor up time ''' | |
while True: | |
for client, email in clients.items(): | |
try: | |
r = requests.get(client) | |
if r.status_code == 200: | |
print client, 'Site ok' | |
time.sleep(60) ## sleep for 1 min | |
else: | |
print client, 'Site first registered as down - added to the "site down" monitoring' | |
temp_dic[client]=email | |
del clients[client] | |
except requests.ConnectionError: | |
print client, 'Site first registered as down - added to the "site down" monitoring' | |
temp_dic[client]=email | |
del clients[client] | |
## site 'down' function | |
def site_down(): | |
''' function to monitor site down time ''' | |
while True: | |
time.sleep(900) ## sleeps 15 mins | |
for client, email in temp_dic.items(): | |
try: | |
r = requests.get(client) | |
if r.status_code == 200: | |
print client, 'Site is back up!!' | |
email_sender('Site back up!! ', email, client) | |
clients[client]=email | |
del temp_dic[client] | |
else: | |
email_sender('Site down!! ', email, client) | |
print client, 'Site Currently down - email sent' | |
except requests.ConnectionError: | |
email_sender('Site down!! ', email, client) | |
print client, 'Site Currently down - email sent' | |
t1 = Thread(target = site_up) | |
t2 = Thread(target = site_down) | |
t1.start() | |
t2.start() |
I am new to python. Can this script send an email when the site is down?
yes it does send email when the website is down
can this script check the total active users on the website??
can this script check the total active users on the website??
nope
can this script monitor HTTPS connections also?
what is we have multiple websites to moniot at a time?how can we do it with this script
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I am new to python. Can this script send an email when the site is down?