EMWIU/isitdown.py
2018-12-25 00:58:46 +01:00

144 lines
4.6 KiB
Python

import requests
import time
import sqlite3
import datetime
import api_credentials
import smtplib
import os
updateDelay = 5*60
maxDaysOldRequest = 100
def init():
"""
Initialize the program.
"""
print("[i] Initialization started.")
os.chdir(os.path.dirname(os.path.abspath(__file__)))
conn = sqlite3.connect("API.db")
cursor = conn.cursor()
cursor.execute(
"CREATE TABLE IF NOT EXISTS emwiu(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, url TEXT, email TEXT, ip TEXT, starttime TEXT)"
)
# emwiu (stands for "email me when it's up"):
# | id | url | email | ip | starttime |
conn.commit()
conn.close()
print("[i] Initialization done.")
def scanTheDatabase():
"""
This is the main loop in the program :
It :
- scans the database
- checks website's status
- removes old users and notify them
- notifies the ones who have their website up
"""
print("[i] Main loop engaged.")
os.chdir(os.path.dirname(os.path.abspath(__file__)))
while True:
conn = sqlite3.connect("API.db")
cursor = conn.cursor()
cursor.execute("""SELECT * FROM emwiu""")
rows = cursor.fetchall()
conn.close()
for row in rows:
checkResults = checkWebsite(row[1])
if checkResults != False:
sendMail(row, checkResults)
deleteFromDatabase(row[0])
else:
if tooOldRequest(row[4]):
sendMail(row, "old")
deleteFromDatabase(row[0])
time.sleep(updateDelay)
def sendMail(row, checkResults):
"""
Notifies the user about something important.
"""
print("[i] Sending the email.")
date = str(datetime.datetime.now())
login = api_credentials.creds["gmail"]["user"]
password = api_credentials.creds["gmail"]["password"]
mail = smtplib.SMTP('smtp.gmail.com', 587)
mail.ehlo()
mail.starttls()
subject = "EMWIU - "
content = "Bonjour !\n\n"
if (checkResults != "old"):
subject += "Le site est en ligne !"
content += "Le site " + \
row[1] + " que vous nous avez demande de surveiller est visiblement en ligne !\n"
content += "Sa reponse a ete le code : " + str(checkResults) + " !"
else:
subject += "Ce n'est qu'un au revoir..."
content += "Nous contactons pour vous annoncer une mauvaise nouvelle...\n"
content += "Cela fait maintenant 100 jours que vous avez demande a avoir des nouvelles du site " + \
row[1] + ", et toujours pas de nouvelles aujourd'hui...\n"
content += "Nous devons faire un nettoyage regulier de notre Base de Donnee pour s'assurer que l'API ne souffre d'aucun ralentissement.\n"
content += "C'est donc pour cette raison que vous en avez ete retire automatiquement. Vous pouvez tout de meme vous reinscrire !"
content += "\n\nCordialement,\nL'API EMWIU (Email Me When It's Up!) du site https://louis-vallat.xyz."
content += "\nMail genere le : " + date
message = 'Subject: {}\n\n{}'.format(subject, content)
mail.login(login, password)
mail.sendmail(login, row[2], message)
mail.quit()
print("[i] E-mail sent.")
def deleteFromDatabase(rowId):
"""
Delete a row from the database based on its id.
"""
print("[i] Deleting a row from database.")
conn = sqlite3.connect("API.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM emwiu WHERE id =?", (rowId, ))
conn.commit()
conn.close()
print("[i] Row deleted.")
def checkWebsite(url):
"""
Checks if a website is up based on its URL.
Return False if the website is down, the request code if it's up.
"""
try:
r = requests.get(str(url))
return r.status_code
except requests.exceptions.ConnectionError:
return False
def dropTabe():
"""
Drop the table.
"""
print("[i] Dropping table.")
conn = sqlite3.connect("API.db")
cursor = conn.cursor()
cursor.execute("DROP TABLE emwiu")
conn.commit()
conn.close()
print("[i] Table dropped.")
def tooOldRequest(requestDate):
"""
Check if the age of a request
"""
todaysDate = datetime.datetime.strptime(
str(datetime.date.today()), "%Y-%m-%d")
requestDate = datetime.datetime.strptime(str(requestDate), "%Y-%m-%d")
return (abs((todaysDate - requestDate).days) >= maxDaysOldRequest)
init()
scanTheDatabase()