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()