Compare commits

...

2 Commits

Author SHA1 Message Date
Mateusz Gruszczyński
8023794451 poprawki w zadaniach zaplanowanych 2025-03-04 14:00:40 +01:00
Mateusz Gruszczyński
982a5049d7 poprawki w zadaniach zaplanowanych 2025-03-04 14:00:31 +01:00
3 changed files with 25 additions and 8 deletions

29
app.py
View File

@ -7,6 +7,7 @@ from datetime import datetime, timezone, timedelta
from io import StringIO from io import StringIO
import socket import socket
import ipaddress import ipaddress
import pytz
from werkzeug.serving import WSGIRequestHandler from werkzeug.serving import WSGIRequestHandler
WSGIRequestHandler.server_version = "" WSGIRequestHandler.server_version = ""
@ -64,6 +65,7 @@ class UserSettings(db.Model):
auto_deploy_enabled = db.Column(db.Boolean, default=False) auto_deploy_enabled = db.Column(db.Boolean, default=False)
deploy_interval = db.Column(db.Integer, default=60) # interwał wdrożeń (minuty) deploy_interval = db.Column(db.Integer, default=60) # interwał wdrożeń (minuty)
backup_interval = db.Column(db.Integer, default=60) # interwał backupów (minuty) backup_interval = db.Column(db.Integer, default=60) # interwał backupów (minuty)
auto_backup_enabled = db.Column(db.Boolean, default=False)
last_deploy_time = db.Column(db.DateTime, nullable=True) last_deploy_time = db.Column(db.DateTime, nullable=True)
regex_deploy_enabled = db.Column(db.Boolean, default=True) regex_deploy_enabled = db.Column(db.Boolean, default=True)
backup_retention_days = db.Column(db.Integer, default=0) backup_retention_days = db.Column(db.Integer, default=0)
@ -174,22 +176,35 @@ def automated_backup_for_host(host):
def automated_backups(): def automated_backups():
with app.app_context(): with app.app_context():
logger.debug("Rozpoczynam funkcję automated_backups")
hosts = Host.query.all() hosts = Host.query.all()
now = datetime.now(timezone.utc) now = datetime.now(timezone.utc)
for host in hosts: for host in hosts:
settings = UserSettings.query.filter_by(user_id=host.user_id).first() settings = UserSettings.query.filter_by(user_id=host.user_id).first()
backup_interval = settings.backup_interval if settings and settings.backup_interval else 60 if not settings or not settings.auto_backup_enabled:
logger.debug(f"Pomijam host {host.hostname} - auto_backup nie włączone")
last_backup = Backup.query.filter_by(user_id=host.user_id, host_id=host.id).order_by(Backup.created_at.desc()).first() continue
backup_interval = settings.backup_interval if settings.backup_interval else 60
logger.debug(f"Backup interval dla hosta {host.hostname}: {backup_interval} minut")
last_backup = Backup.query.filter_by(user_id=host.user_id, host_id=host.id)\
.order_by(Backup.created_at.desc()).first()
if last_backup: if last_backup:
last_backup_time = last_backup.created_at last_backup_time = last_backup.created_at
if last_backup_time.tzinfo is None: if last_backup_time.tzinfo is None:
# Zakładamy, że zapisany czas jest już w UTC
last_backup_time = last_backup_time.replace(tzinfo=timezone.utc) last_backup_time = last_backup_time.replace(tzinfo=timezone.utc)
diff = (now - last_backup_time).total_seconds()
logger.debug(f"Różnica czasu dla hosta {host.hostname}: {diff} sekund")
else: else:
last_backup_time = None last_backup_time = None
logger.debug(f"Brak poprzedniego backupu dla hosta {host.hostname}")
if (last_backup_time is None) or ((now - last_backup_time).total_seconds() >= backup_interval * 60): if (last_backup_time is None) or ((now - last_backup_time).total_seconds() >= backup_interval * 60):
logger.debug(f"Wykonuję backup dla hosta {host.hostname}")
automated_backup_for_host(host) automated_backup_for_host(host)
db.session.commit()
db.session.expire_all()
else:
logger.debug(f"Backup dla hosta {host.hostname} nie jest jeszcze potrzebny")
def wrap_content_with_comments(content): def wrap_content_with_comments(content):
@ -825,11 +840,12 @@ def settings():
auto_deploy = request.form.get('auto_deploy') auto_deploy = request.form.get('auto_deploy')
deploy_interval = request.form.get('deploy_interval') deploy_interval = request.form.get('deploy_interval')
backup_interval = request.form.get('backup_interval') backup_interval = request.form.get('backup_interval')
auto_backup = request.form.get('auto_backup')
enable_regex_entries = request.form.get('enable_regex_entries') enable_regex_entries = request.form.get('enable_regex_entries')
retention_val = request.form.get('backup_retention_days', '0') retention_val = request.form.get('backup_retention_days', '0')
user_settings.auto_deploy_enabled = bool(auto_deploy) user_settings.auto_deploy_enabled = bool(auto_deploy)
user_settings.auto_backup_enabled = bool(auto_backup)
try: try:
user_settings.deploy_interval = int(deploy_interval) user_settings.deploy_interval = int(deploy_interval)
except ValueError: except ValueError:
@ -839,7 +855,6 @@ def settings():
except ValueError: except ValueError:
user_settings.backup_interval = 60 user_settings.backup_interval = 60
user_settings.regex_deploy_enabled = bool(enable_regex_entries) user_settings.regex_deploy_enabled = bool(enable_regex_entries)
try: try:
user_settings.backup_retention_days = int(retention_val) user_settings.backup_retention_days = int(retention_val)
except ValueError: except ValueError:
@ -851,6 +866,7 @@ def settings():
return render_template('settings.html', settings=user_settings) return render_template('settings.html', settings=user_settings)
@app.route('/delete-backup/<int:backup_id>', methods=['POST']) @app.route('/delete-backup/<int:backup_id>', methods=['POST'])
def delete_backup(backup_id): def delete_backup(backup_id):
if 'user_id' not in session: if 'user_id' not in session:
@ -1133,7 +1149,6 @@ scheduler.add_job(func=scheduled_deployments, trigger="interval", minutes=1, nex
scheduler.add_job(func=automated_backups, trigger="interval", minutes=1, next_run_time=datetime.now()) scheduler.add_job(func=automated_backups, trigger="interval", minutes=1, next_run_time=datetime.now())
scheduler.add_job(func=cleanup_old_backups, trigger="interval", hours=24, next_run_time=datetime.now()) scheduler.add_job(func=cleanup_old_backups, trigger="interval", hours=24, next_run_time=datetime.now())
if __name__ == '__main__': if __name__ == '__main__':
with app.app_context(): with app.app_context():
db.create_all() db.create_all()

View File

@ -4,4 +4,5 @@ Flask-SQLAlchemy
paramiko paramiko
apscheduler apscheduler
gunicorn gunicorn
waitress waitress
pytz

View File

@ -7,6 +7,7 @@ if __name__ == "__main__":
db.create_all() db.create_all()
for job in scheduler.get_jobs(): for job in scheduler.get_jobs():
job.modify(next_run_time=datetime.now()) job.modify(next_run_time=datetime.now())
print(job)
if not scheduler.running: if not scheduler.running:
scheduler.start() scheduler.start()
serve(app, listen="*:5580", threads=4, ident="") serve(app, listen="*:5580", threads=4, ident="")