163 lines
5.3 KiB
Python
163 lines
5.3 KiB
Python
import requests
|
|
import time
|
|
import smtplib
|
|
from email.mime.text import MIMEText
|
|
import sqlite3
|
|
from datetime import datetime, timedelta
|
|
import json
|
|
import os
|
|
|
|
def read_credentials(file_path):
|
|
with open(file_path, 'r') as file:
|
|
lines = file.readlines()
|
|
email = lines[0].strip()
|
|
password = lines[1].strip()
|
|
return email, password
|
|
|
|
def check_website(url, timeout=5):
|
|
try:
|
|
response = requests.get(url, timeout=timeout)
|
|
return response.status_code == 200
|
|
except requests.RequestException:
|
|
return False
|
|
|
|
def send_email(subject, body, to_email, from_email, from_password, smtp_server, smtp_port):
|
|
msg = MIMEText(body)
|
|
msg['Subject'] = subject
|
|
msg['From'] = from_email
|
|
msg['To'] = to_email
|
|
|
|
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
|
|
server.login(from_email, from_password)
|
|
server.sendmail(from_email, to_email, msg.as_string())
|
|
|
|
def create_database(db_path):
|
|
conn = sqlite3.connect(db_path)
|
|
cursor = conn.cursor()
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS website_status (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
timestamp DATETIME NOT NULL,
|
|
current_status INTEGER NOT NULL,
|
|
previous_status INTEGER
|
|
)
|
|
''')
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
def log_website_status(db_path, current_status, previous_status):
|
|
conn = sqlite3.connect(db_path)
|
|
cursor = conn.cursor()
|
|
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
cursor.execute('''
|
|
INSERT INTO website_status (timestamp, current_status, previous_status)
|
|
VALUES (?, ?, ?)
|
|
''', (timestamp, 1 if current_status else 0, previous_status))
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
def get_last_status(db_path):
|
|
conn = sqlite3.connect(db_path)
|
|
cursor = conn.cursor()
|
|
cursor.execute('''
|
|
SELECT current_status FROM website_status
|
|
ORDER BY id DESC LIMIT 1
|
|
''')
|
|
result = cursor.fetchone()
|
|
conn.close()
|
|
return result[0] if result else None
|
|
|
|
def print_email_sent(status_str, timestamp):
|
|
print(f"[{timestamp}] Email sent: Website is now {status_str}")
|
|
|
|
def cleanup_old_logs(db_path, days_to_keep=10):
|
|
cutoff_date = (datetime.now() - timedelta(days=days_to_keep)).strftime('%Y-%m-%d %H:%M:%S')
|
|
conn = sqlite3.connect(db_path)
|
|
cursor = conn.cursor()
|
|
|
|
# Delete rows where current_status equals previous_status and timestamp is older than 10 days
|
|
cursor.execute('''
|
|
DELETE FROM website_status
|
|
WHERE timestamp < ? AND current_status = previous_status
|
|
''', (cutoff_date,))
|
|
|
|
deleted_rows = cursor.rowcount
|
|
conn.commit()
|
|
conn.close()
|
|
return deleted_rows
|
|
|
|
def print_config_example():
|
|
example_config = {
|
|
"website": {
|
|
"url": "http://petrovv.com",
|
|
"check_interval_seconds": 600,
|
|
"timeout_seconds": 5
|
|
},
|
|
"email": {
|
|
"smtp_server": "mail.petrovv.com",
|
|
"smtp_port": 465,
|
|
"from_email": "monitor@petrovv.com",
|
|
"to_email": "nikola@petrovv.com",
|
|
"credentials_file": "credentials.txt"
|
|
},
|
|
"database": {
|
|
"path": "website_status.db",
|
|
"log_retention_days": 10
|
|
}
|
|
}
|
|
print("Example config.json:")
|
|
print(json.dumps(example_config, indent=2))
|
|
|
|
def main():
|
|
# Check if config.json exists
|
|
if not os.path.exists("config.json"):
|
|
print("Error: config.json not found.")
|
|
print_config_example()
|
|
return
|
|
|
|
# Load configuration
|
|
with open("config.json", "r") as f:
|
|
config = json.load(f)
|
|
|
|
url = config["website"]["url"]
|
|
to_email = config["email"]["to_email"]
|
|
check_interval = config["website"]["check_interval_seconds"]
|
|
credentials_file = config["email"]["credentials_file"]
|
|
db_path = config["database"]["path"]
|
|
smtp_server = config["email"]["smtp_server"]
|
|
smtp_port = config["email"]["smtp_port"]
|
|
log_retention_days = config["database"]["log_retention_days"]
|
|
|
|
create_database(db_path)
|
|
from_email, from_password = read_credentials(credentials_file)
|
|
|
|
last_status = get_last_status(db_path)
|
|
last_cleanup = datetime.now()
|
|
|
|
while True:
|
|
current_time = datetime.now()
|
|
current_status = check_website(url)
|
|
log_website_status(db_path, current_status, last_status)
|
|
|
|
if last_status is None or current_status != (last_status == 1):
|
|
status_str = "up" if current_status else "down"
|
|
subject = f"Website Status Change: {status_str}"
|
|
body = f"The website {url} is now {status_str} at {current_time.strftime('%Y-%m-%d %H:%M:%S')}."
|
|
send_email(subject, body, to_email, from_email, from_password, smtp_server, smtp_port)
|
|
print_email_sent(status_str, current_time.strftime('%Y-%m-%d %H:%M:%S'))
|
|
last_status = 1 if current_status else 0
|
|
|
|
# Perform cleanup once per day
|
|
if (current_time - last_cleanup).days >= 1:
|
|
deleted = cleanup_old_logs(db_path, log_retention_days)
|
|
if deleted > 0:
|
|
print(f"[{current_time.strftime('%Y-%m-%d %H:%M:%S')}] Cleanup: Deleted {deleted} logs older than {log_retention_days} days (keeping status changes)")
|
|
last_cleanup = current_time
|
|
|
|
time.sleep(check_interval)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|
|
|