main commit

This commit is contained in:
Louis Vallat 2018-12-25 00:58:46 +01:00 committed by GitHub
parent 08b003650e
commit 49d1a2add1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 243 additions and 0 deletions

62
add_isitdown.py Normal file
View File

@ -0,0 +1,62 @@
import sqlite3, sys, datetime, api_credentials, smtplib, os
# Usage :
# python3 add_isitdown.py -u <url> -e <email> -i <ip>
os.chdir(os.path.dirname(os.path.abspath(__file__)))
items = {"url": "", "email": "", "ip": "", "starttime": ""}
def sendMail(url, email, code):
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 (code == "new"):
subject += "Confirmation de votre inscription"
content += "Nous vous confirmons, de par ce mail, votre inscription a notre service. Nous surveillons des maintenant l'URL " + str(url) + " !\n"
elif (code == "old"):
subject += "Vous etes deja inscrit..."
content += "Nous avons trouve dans notre base de donnee que vous avez deja demande a surveiller l'URL " + url + " !\n"
content += "Vous ne pouvez pas vous inscrire deux fois pour la meme URL. Desole !"
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, email, message)
mail.quit()
for i in range(len(sys.argv)):
if (sys.argv[i] == "-u" and items["url"] == ""):
items["url"] = sys.argv[i+1]
if (sys.argv[i] == "-e" and items["email"] == ""):
items["email"] = sys.argv[i+1]
if (sys.argv[i] == "-i" and items["ip"] == ""):
items["ip"] = sys.argv[i+1]
if (items["url"] != "" and items["email"] != "" and items["ip"] != ""):
items["starttime"] = str(datetime.date.today())
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)"
)
conn.commit()
cursor.execute("""SELECT * FROM emwiu WHERE url = :url AND email = :email""", items)
rows = cursor.fetchall()
conn.close()
if (len(rows) > 0):
sendMail(items["url"], items["email"], "old")
else:
conn = sqlite3.connect("API.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO emwiu(url, email, ip, starttime) VALUES(:url, :email, :ip, :starttime)", items)
conn.commit()
conn.close()
sendMail(items["url"], items["email"], "new")
else:
print("Not enough arguments.")

View File

@ -0,0 +1,21 @@
import sqlite3
import os
import sys
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)"
)
conn.commit()
cursor.execute("""SELECT * FROM emwiu""")
rows = cursor.fetchall()
conn.close()
conn = sqlite3.connect("API.db")
cursor = conn.cursor()
for row in rows:
cursor.execute("DELETE FROM emwiu WHERE id =?", (row[0], ))
conn.commit()
conn.close()

143
isitdown.py Normal file
View File

@ -0,0 +1,143 @@
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()

17
read_isitdown_database.py Normal file
View File

@ -0,0 +1,17 @@
import sqlite3
import os
import sys
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)"
)
conn.commit()
cursor.execute("""SELECT * FROM emwiu""")
rows = cursor.fetchall()
conn.close()
for row in rows:
print(row)