|
2 | 2 | from threading import Timer
|
3 | 3 | from flask import render_template, request, redirect, url_for, blueprints, flash
|
4 | 4 | from src.config import app, db
|
5 |
| -from src.models.ping import Website |
| 5 | +from src.models.monitored_website import MonitoredWebsite |
| 6 | +from flask_login import login_required |
6 | 7 | import requests
|
7 | 8 |
|
8 | 9 | ping_bp = blueprints.Blueprint('ping', __name__)
|
9 | 10 |
|
10 | 11 | # Route to view and add websites
|
11 |
| -@app.route('/ping') |
12 |
| -def ping_website(): |
13 |
| - websites = Website.query.all() |
| 12 | +@app.route('/monitor_websites') |
| 13 | +@login_required |
| 14 | +def monitor_websites(): |
| 15 | + websites = MonitoredWebsite.query.all() |
14 | 16 | return render_template('ping/ping.html', websites=websites)
|
15 | 17 |
|
16 | 18 | # Route to add a website
|
17 |
| -@app.route('/add_website', methods=['POST']) |
| 19 | +@app.route('/add_monitored_website', methods=['POST']) |
| 20 | +@login_required |
18 | 21 | def add_website():
|
19 | 22 | name = request.form['name']
|
20 |
| - ping_period = int(request.form['ping_period']) |
21 |
| - website = Website(name=name, ping_period=ping_period, is_ping=True) |
| 23 | + ping_interval = int(request.form['ping_interval']) |
| 24 | + email_alerts_enabled = request.form.get('email_alerts_enabled') == 'on' |
| 25 | + website = MonitoredWebsite(name=name, ping_interval=ping_interval, is_ping_active=True, email_alerts_enabled=email_alerts_enabled) |
22 | 26 | db.session.add(website)
|
23 | 27 | db.session.commit()
|
24 |
| - return redirect(url_for('ping_website')) |
| 28 | + return redirect(url_for('monitor_websites')) |
25 | 29 |
|
26 |
| -@app.route('/remove_website/<int:website_id>', methods=['POST']) |
| 30 | +@app.route('/delete_monitored_website/<int:website_id>', methods=['POST']) |
| 31 | +@login_required |
27 | 32 | def remove_website(website_id):
|
28 |
| - website = Website.query.get_or_404(website_id) |
| 33 | + website = MonitoredWebsite.query.get_or_404(website_id) |
29 | 34 | db.session.delete(website)
|
30 | 35 | db.session.commit()
|
31 | 36 | flash('Website removed successfully!', 'danger')
|
32 |
| - return redirect(url_for('ping_website')) |
| 37 | + return redirect(url_for('monitor_websites')) |
33 | 38 |
|
34 |
| -@app.route('/edit_website/<int:website_id>', methods=['GET', 'POST']) |
| 39 | +@app.route('/edit_monitored_website/<int:website_id>', methods=['GET', 'POST']) |
35 | 40 | def edit_website(website_id):
|
36 |
| - website = Website.query.get_or_404(website_id) |
| 41 | + website = MonitoredWebsite.query.get_or_404(website_id) |
37 | 42 | if request.method == 'POST':
|
38 | 43 | website.name = request.form['name']
|
39 |
| - website.ping_period = int(request.form['ping_period']) |
| 44 | + website.ping_interval = int(request.form['ping_interval']) |
40 | 45 | db.session.commit()
|
41 | 46 | flash('Website updated successfully!', 'success')
|
42 |
| - return redirect(url_for('ping_website')) |
| 47 | + return redirect(url_for('monitor_websites')) |
43 | 48 | return render_template('ping/edit_website.html', website=website)
|
44 | 49 |
|
45 | 50 | # Route to toggle pinging status
|
46 |
| -@app.route('/toggle_ping/<int:website_id>') |
| 51 | +@app.route('/toggle_ping_status/<int:website_id>') |
| 52 | +@login_required |
47 | 53 | def toggle_ping(website_id):
|
48 |
| - website = Website.query.get_or_404(website_id) |
49 |
| - website.is_ping = not website.is_ping |
| 54 | + website = MonitoredWebsite.query.get_or_404(website_id) |
| 55 | + website.is_ping_active = not website.is_ping_active |
50 | 56 | db.session.commit()
|
51 |
| - return redirect(url_for('ping_website')) |
| 57 | + return redirect(url_for('monitor_websites')) |
| 58 | + |
| 59 | +@app.route('/toggle_email_alerts/<int:website_id>') |
| 60 | +@login_required |
| 61 | +def toggle_emaail_alerts(website_id): |
| 62 | + website = MonitoredWebsite.query.get_or_404(website_id) |
| 63 | + website.email_alerts_enabled = not website.email_alerts_enabled |
| 64 | + db.session.commit() |
| 65 | + return redirect(url_for('monitor_websites')) |
52 | 66 |
|
53 | 67 | # Function to ping websites periodically
|
54 |
| -def ping_websites(): |
| 68 | +def start_website_monitoring(): |
55 | 69 | with app.app_context():
|
56 |
| - websites = Website.query.filter_by(is_ping=True).all() |
| 70 | + websites = MonitoredWebsite.query.filter_by(is_ping_active=True).all() |
57 | 71 | for website in websites:
|
58 | 72 | print(f'Pinging {website.name}...')
|
59 | 73 | try:
|
60 | 74 | response = requests.get(website.name, timeout=10)
|
61 |
| - website.last_ping_timestamp = datetime.datetime.now() |
| 75 | + website.last_ping_time = datetime.datetime.now() |
| 76 | + website.ping_status_code = response.status_code |
62 | 77 | if response.status_code == 200:
|
63 |
| - website.last_status = 'UP' |
| 78 | + website.ping_status = 'UP' |
64 | 79 | else:
|
65 |
| - website.last_status = 'DOWN' |
| 80 | + website.ping_status = 'DOWN' |
66 | 81 | except requests.RequestException:
|
67 |
| - website.last_status = 'Something went wrong' |
| 82 | + website.ping_status = 'Something went wrong' |
68 | 83 |
|
69 | 84 | db.session.commit()
|
70 | 85 |
|
71 | 86 | # Schedule next ping after the minimum interval period
|
72 |
| - min_interval = min([w.ping_period for w in websites]) if websites else 60 |
73 |
| - Timer(min_interval, ping_websites).start() |
| 87 | + min_interval = min([w.ping_interval for w in websites]) if websites else 60 |
| 88 | + Timer(min_interval, monitor_websites).start() |
74 | 89 |
|
75 | 90 | # Start pinging periodically after server starts
|
76 |
| -ping_websites() |
| 91 | +start_website_monitoring() |
0 commit comments