master
greglebreton 2 years ago
commit fcfe78c2c1
  1. 74
      README.md
  2. 2
      destinataires.csv
  3. 5
      env.py
  4. 81
      logs-sender.py
  5. 77
      python-alert.py
  6. 3
      requirements.txt
  7. 9
      url.csv

@ -0,0 +1,74 @@
# PYTHON ALERT FOR DOWNED SITES
## PRE-REQUIS
- Python3
- time, requests, csv
```bash
python3 -m pip install -r requirements
```
## INSTALLATION
```bash
sudo mkdir /workspace
sudo chown "$(whoami)":"$(whoami)" /workspace && cd /workspace
git clone https://gitlab.com/GregLebreton/python-alert-stack.git
cd python-alert-stack
mkdir logs
```
## CONFIGURATION
### WITH CRON (A)
- Tâche CRON éxécutant les script toutes les 5 minutes:
```bash
crontab -e
*/5 * * * * /usr/bin/python3 /workspace/python-alert-stack/python-alert.py >> /workspace/python-alert-stack/logs/python-alert.log
```
### WITH PYTHON TIME FUNCTION (B)
```bash
sudo nano /etc/systemd/system/python-alert-downsite.service
[Unit]
Description=Python Alert For Down Sites
[Service]
# Note: setting PYTHONUNBUFFERED is necessary to see the output of this service in the jo>
# See https://docs.python.org/2/using/cmdline.html#envvar-PYTHONUNBUFFERED
Environment=PYTHONUNBUFFERED=true
ExecStart=/usr/bin/python3 /workspace/python-alert-stack/python-alert.py
Type=oneshot
#WatchdogSec=30
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
```
> Note: Modifier la fin du python-alert.py script comme ceci:
```bash
# MAIN (A)
#urls = import_url()
#send_mail(urls)
# PYTHON TIME (B)
while True:
urls = import_url()
send_mail(urls)
# temps d'attente entre chaque éxécutions du check (en secondes)
time.sleep(300)
```
### LOGS SENDER
- Tâche CRON éxécutant le script une fois par semaine (Lundi à 10h00):
```bash
crontab -e
00 10 * * mon /usr/bin/python3 /workspace/python-alert-stack/logs-sender.py
```

@ -0,0 +1,2 @@
mail1@mail.com
mail2@mail.com
1 mail1 mail.com
2 mail2 mail.com

@ -0,0 +1,5 @@
serveurSmtp = ""
serveurPort = 465
serveurAdrresseMail= ""
serveurMailPassword = ""
mailReception= ""

@ -0,0 +1,81 @@
import smtplib, ssl, sys, requests, csv, time, zipfile, os, env
sys.path.append("./env.py")
from env import serveurMailPassword, serveurPort, serveurSmtp, serveurAdrresseMail, mailReception
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# FONCTION ZIP
def zip_it():
zip = zipfile.ZipFile('./logs/stack-alert-logs.zip', mode='w')
zip.write('./logs/python-alert.log')
zip.close()
# FONCTION IMPORT URL FROM CSV + TEST REQUEST
def import_mails():
print(time.ctime())
mails = []
with open('./autres-destinataires.csv', newline='') as file:
reader = csv.reader(file)
for row in reader:
# NETTOYAGE
addr = str(row)
mailraw = addr.strip('[]\'')
mails.append(mailraw)
return mails
# FONCTION CLEAN OLD LOGS
def clean_logs():
if os.path.exists('./logs/python-alert.log'):
os.remove('/./logs/python-alert.log')
if os.path.exists('/./logs/stack-alert-logs.zip'):
os.remove('./logs/stack-alert-logs.zip')
# FONCTION SEND MAIL
def send_mail(mails):
# EN-TETE EMAIL
message = MIMEMultipart('mixed')
message['From'] = serveurAdrresseMail
message['To'] = mailReception
message['CC'] = ",".join(mails)
message['Subject'] = 'Rapport hebdo sites HS'
# CONTENU (TEXT)
contenu = '<h4>Bonjour, voici logs des sites HS de la semaine <br></h4>\n'
body = MIMEText(contenu, 'html')
message.attach(body)
# AJOUT PIECE JOINTE
attachmentPath = "/workspace/python-alert-stack/logs/stack-alert-logs.zip"
try:
with open(attachmentPath, "rb") as attachment:
p = MIMEApplication(attachment.read(),_subtype="zip")
p.add_header('Content-Disposition', "attachment; filename= %s" % attachmentPath.split("\\")[-1])
message.attach(p)
except Exception as e:
print(str(e))
# CONVERSION EN CHAINE DE CARACTERES
mail_str = message.as_string()
context = ssl.create_default_context()
# ENVOIE DU MAIL
with smtplib.SMTP_SSL(serveurSmtp, serveurPort, context=context) as server:
server.login(serveurAdrresseMail, serveurMailPassword)
server.sendmail(serveurAdrresseMail,
mails,
mail_str)
server.quit()
# MAIN
mails = import_mails()
zip_it()
send_mail(mails)
clean_logs()

@ -0,0 +1,77 @@
# IMPORTS
import smtplib, ssl, sys, requests, csv, time
sys.path.append("./env.py")
from env import serveurMailPassword, serveurPort, serveurSmtp, serveurAdrresseMail, mailReception
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# FONCTION IMPORT URL FROM CSV + TEST REQUEST
def import_url():
print(time.ctime())
urls_hs = []
with open('./url.csv', newline='') as file:
reader = csv.reader(file)
for row in reader:
addr = str(row)
url = addr.strip('[]')
try:
response = requests.get(url.strip('"\''))
if response.status_code != 200:
urls_hs.append(url)
print(url + ' est hors service')
else:
print(url + ' / ' + str(response.status_code))
except Exception as e:
print(str(e))
#except:
#print('l\'url: ' + url + ' est invalide')
return urls_hs
# FONCTION SEND MAIL
def send_mail(urls_hs):
# EN-TETE EMAIL
message = MIMEMultipart('mixed')
message['From'] = serveurAdrresseMail
message['To'] = mailReception
message['CC'] = ''
message['Subject'] = 'Attention, un ou plusieurs site(s) semble(nt) hors service'
# CONTENU (TEXT)
if urls_hs:
for url in urls_hs:
mail = " ".join(urls_hs)
contenu = '<h4>Bonjour, voici la liste des sites HS: {mail} <br></h4>\n'.format(mail=mail)
body = MIMEText(contenu, 'html')
message.attach(body)
# CONVERSION EN CHAINE DE CARACTERES
mail_str = message.as_string()
context = ssl.create_default_context()
# ENVOIE DU MAIL
with smtplib.SMTP_SSL(serveurSmtp, serveurPort, context=context) as server:
server.login(serveurAdrresseMail, serveurMailPassword)
server.sendmail(serveurAdrresseMail,
mailReception,
mail_str)
server.quit()
else:
print('Tout est OK ;)')
# MAIN (A)
urls = import_url()
send_mail(urls)
# PYTHON TIME (B)
# while True:
# urls = import_url()
# send_mail(urls)
# time.sleep(300)

@ -0,0 +1,3 @@
requests
csv>=0.1
time>=0.1

@ -0,0 +1,9 @@
https://www.gregandev.fr
https://www.wordpress.gregandev.fr
https://medias.gregandev.fr
https://grego.gregandev.fr
https://retroarch.gregandev.fr
https://hugo.gregandev.fr
https://gregstation.gregandev.fr
https://psychologue-ecouen.fr
https://www.terminal-cv.gregandev.fr
1 https://www.gregandev.fr
2 https://www.wordpress.gregandev.fr
3 https://medias.gregandev.fr
4 https://grego.gregandev.fr
5 https://retroarch.gregandev.fr
6 https://hugo.gregandev.fr
7 https://gregstation.gregandev.fr
8 https://psychologue-ecouen.fr
9 https://www.terminal-cv.gregandev.fr
Loading…
Cancel
Save