funkcje
This commit is contained in:
96
app.py
96
app.py
@@ -46,17 +46,19 @@ class User(UserMixin, db.Model):
|
||||
|
||||
class Device(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(120)) # Nazwa urządzenia (opcjonalnie)
|
||||
name = db.Column(db.String(120))
|
||||
ip = db.Column(db.String(120), nullable=False)
|
||||
port = db.Column(db.Integer, default=8728)
|
||||
device_username = db.Column(db.String(120), nullable=False)
|
||||
device_password = db.Column(db.String(120), nullable=False)
|
||||
branch = db.Column(db.String(20), default="stable") # Wybór gałęzi aktualizacji
|
||||
update_required = db.Column(db.Boolean, default=False) # True, gdy dostępna jest aktualizacja
|
||||
branch = db.Column(db.String(20), default="stable")
|
||||
update_required = db.Column(db.Boolean, default=False)
|
||||
last_check = db.Column(db.DateTime)
|
||||
last_log = db.Column(db.Text)
|
||||
current_version = db.Column(db.String(50)) # Nowa kolumna – aktualna wersja systemu
|
||||
current_firmware = db.Column(db.String(50)) # Nowa kolumna – aktualna wersja firmware
|
||||
current_version = db.Column(db.String(50))
|
||||
current_firmware = db.Column(db.String(50))
|
||||
use_ssl = db.Column(db.Boolean, default=False) # Czy używać SSL?
|
||||
ssl_insecure = db.Column(db.Boolean, default=False) # Jeśli True – nie weryfikować certyfikatu SSL
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
|
||||
|
||||
class Settings(db.Model):
|
||||
@@ -129,38 +131,50 @@ def check_device_update(device):
|
||||
current_version = None
|
||||
current_firmware = None
|
||||
try:
|
||||
app.logger.debug(f"Connecting to device {device.ip}:{device.port} using SSL: {device.use_ssl}, ssl_verify: {not device.ssl_insecure}")
|
||||
api = librouteros.connect(
|
||||
host=device.ip,
|
||||
username=device.device_username,
|
||||
password=device.device_password,
|
||||
port=device.port,
|
||||
timeout=15
|
||||
timeout=15,
|
||||
ssl=device.use_ssl,
|
||||
ssl_verify=not device.ssl_insecure
|
||||
)
|
||||
# Pobranie podstawowych informacji
|
||||
app.logger.debug(f"Connection established to {device.ip}")
|
||||
|
||||
# Pobranie informacji o tożsamości urządzenia
|
||||
identity_resp = list(api('/system/identity/print'))
|
||||
app.logger.debug(f"Identity response: {identity_resp}")
|
||||
if identity_resp:
|
||||
identity = identity_resp[0].get('name', '')
|
||||
log_entries.append(f"Identity: {identity}")
|
||||
|
||||
# Pobranie wersji systemu
|
||||
resource_resp = list(api('/system/resource/print'))
|
||||
app.logger.debug(f"Resource response: {resource_resp}")
|
||||
if resource_resp:
|
||||
version = resource_resp[0].get('version', '')
|
||||
current_version = version
|
||||
log_entries.append(f"System Version: {version}")
|
||||
# Pobranie informacji o urządzeniu, w tym firmware
|
||||
|
||||
# Pobranie informacji o routerboard (firmware)
|
||||
board_resp = list(api('/system/routerboard/print'))
|
||||
app.logger.debug(f"Routerboard response: {board_resp}")
|
||||
if board_resp:
|
||||
board_info = board_resp[0]
|
||||
# Próba odczytania firmware z kilku możliwych kluczy
|
||||
firmware = board_info.get('firmware', board_info.get('firmware-version', board_info.get('upgrade-firmware', 'N/A')))
|
||||
current_firmware = firmware
|
||||
log_entries.append(f"Firmware: {firmware}")
|
||||
|
||||
# Sprawdzenie dostępnych aktualizacji
|
||||
log_entries.append("Checking for updates...")
|
||||
list(api('/system/package/update/check-for-updates'))
|
||||
# Czekamy aż operacja się zakończy
|
||||
for _ in range(10):
|
||||
time.sleep(1)
|
||||
status_resp = list(api('/system/package/update/print'))
|
||||
app.logger.debug(f"Update status response: {status_resp}")
|
||||
if status_resp:
|
||||
status = status_resp[0].get('status', '').lower()
|
||||
if 'checking' not in status:
|
||||
@@ -168,6 +182,7 @@ def check_device_update(device):
|
||||
break
|
||||
|
||||
update_resp = list(api('/system/package/update/print'))
|
||||
app.logger.debug(f"Update response: {update_resp}")
|
||||
if update_resp:
|
||||
for res in update_resp:
|
||||
installed = res.get('installed-version', '')
|
||||
@@ -179,9 +194,11 @@ def check_device_update(device):
|
||||
log_entries.append("No updates available.")
|
||||
return "\n".join(log_entries), update_available, current_version, current_firmware
|
||||
except Exception as e:
|
||||
app.logger.error(f"Error connecting to device {device.ip}: {e}", exc_info=True)
|
||||
return f"Error: {str(e)}", False, None, None
|
||||
|
||||
|
||||
|
||||
def check_all_devices():
|
||||
with app.app_context():
|
||||
devices = Device.query.all()
|
||||
@@ -229,7 +246,26 @@ def clean_old_logs():
|
||||
|
||||
# Harmonogram sprawdzania aktualizacji – wykorzystujemy APScheduler
|
||||
scheduler = BackgroundScheduler()
|
||||
scheduler.add_job(func=check_all_devices, trigger="interval", seconds=60) # co 60 sekund; można zmienić na podstawie ustawień użytkownika
|
||||
|
||||
# Inicjalizacja bazy i scheduler’a
|
||||
with app.app_context():
|
||||
db.create_all() # lub już wcześniej utworzona baza
|
||||
# Pobranie globalnych ustawień – zakładamy, że Settings.query.first() zwróci ustawienia globalne
|
||||
global_settings = Settings.query.first()
|
||||
if global_settings and global_settings.check_interval:
|
||||
interval = global_settings.check_interval
|
||||
else:
|
||||
interval = 60
|
||||
|
||||
scheduler.add_job(
|
||||
func=check_all_devices,
|
||||
trigger="interval",
|
||||
seconds=interval,
|
||||
id="check_all_devices",
|
||||
max_instances=1
|
||||
)
|
||||
app.logger.debug(f"Scheduler initialized with interval: {interval} seconds")
|
||||
|
||||
scheduler.start()
|
||||
|
||||
# ROUTY APLIKACJI
|
||||
@@ -301,14 +337,25 @@ def add_device():
|
||||
port = int(request.form.get('port', 8728))
|
||||
device_username = request.form['device_username']
|
||||
device_password = request.form['device_password']
|
||||
new_device = Device(name=name, ip=ip, port=port, device_username=device_username,
|
||||
device_password=device_password, user_id=current_user.id)
|
||||
use_ssl = bool(request.form.get('use_ssl'))
|
||||
ssl_insecure = bool(request.form.get('ssl_insecure'))
|
||||
new_device = Device(
|
||||
name=name,
|
||||
ip=ip,
|
||||
port=port,
|
||||
device_username=device_username,
|
||||
device_password=device_password,
|
||||
use_ssl=use_ssl,
|
||||
ssl_insecure=ssl_insecure,
|
||||
user_id=current_user.id
|
||||
)
|
||||
db.session.add(new_device)
|
||||
db.session.commit()
|
||||
flash("Urządzenie dodane.")
|
||||
return redirect(url_for('devices'))
|
||||
return render_template('add_device.html')
|
||||
|
||||
|
||||
# Szczegóły urządzenia
|
||||
@app.route('/device/<int:device_id>')
|
||||
@login_required
|
||||
@@ -371,12 +418,22 @@ def settings():
|
||||
# Aktualizacja retencji logów
|
||||
retention = request.form.get('log_retention_days')
|
||||
user_settings.log_retention_days = int(retention) if retention else 30
|
||||
|
||||
db.session.commit()
|
||||
|
||||
# Aktualizacja interwału zadania scheduler'a
|
||||
try:
|
||||
scheduler.reschedule_job("check_all_devices", trigger="interval", seconds=user_settings.check_interval)
|
||||
app.logger.debug(f"Scheduler rescheduled with new interval: {user_settings.check_interval} seconds")
|
||||
except Exception as e:
|
||||
app.logger.error(f"Error rescheduling job: {e}")
|
||||
|
||||
flash("Ustawienia zapisane.")
|
||||
return redirect(url_for('settings'))
|
||||
return render_template('settings.html', settings=user_settings)
|
||||
|
||||
|
||||
|
||||
@app.route('/device/<int:device_id>/edit', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
def edit_device(device_id):
|
||||
@@ -385,18 +442,20 @@ def edit_device(device_id):
|
||||
flash("Brak dostępu.")
|
||||
return redirect(url_for('devices'))
|
||||
if request.method == 'POST':
|
||||
# Używamy get() z wartością domyślną, aby nie wymuszać przesłania wszystkich pól
|
||||
device.name = request.form.get('name', device.name)
|
||||
device.ip = request.form.get('ip', device.ip)
|
||||
device.port = int(request.form.get('port', device.port or 8728))
|
||||
device.device_username = request.form.get('device_username', device.device_username)
|
||||
device.device_password = request.form.get('device_password', device.device_password)
|
||||
device.branch = request.form.get('branch', device.branch or 'stable')
|
||||
device.use_ssl = bool(request.form.get('use_ssl'))
|
||||
device.ssl_insecure = bool(request.form.get('ssl_insecure'))
|
||||
db.session.commit()
|
||||
flash("Urządzenie zaktualizowane.")
|
||||
return redirect(url_for('devices'))
|
||||
return render_template('edit_device.html', device=device)
|
||||
|
||||
|
||||
@app.route('/device/<int:device_id>/force_check')
|
||||
@login_required
|
||||
def force_check(device_id):
|
||||
@@ -414,7 +473,6 @@ def force_check(device_id):
|
||||
flash("Sprawdzenie urządzenia zakończone.")
|
||||
return redirect(url_for('devices'))
|
||||
|
||||
|
||||
@app.route('/device/<int:device_id>/update', methods=['POST'])
|
||||
@login_required
|
||||
def update_device(device_id):
|
||||
@@ -423,14 +481,17 @@ def update_device(device_id):
|
||||
flash("Brak dostępu.")
|
||||
return redirect(url_for('devices'))
|
||||
try:
|
||||
app.logger.debug(f"Initiating system update for device {device.ip}")
|
||||
api = librouteros.connect(
|
||||
host=device.ip,
|
||||
username=device.device_username,
|
||||
password=device.device_password,
|
||||
port=device.port,
|
||||
timeout=15
|
||||
timeout=15,
|
||||
ssl=device.use_ssl,
|
||||
ssl_verify=not device.ssl_insecure
|
||||
)
|
||||
# Przykładowo: wybór komendy w zależności od wybranego branch
|
||||
app.logger.debug("Connection established, starting update command")
|
||||
if device.branch == 'stable':
|
||||
list(api('/system/package/update/install'))
|
||||
elif device.branch == 'dev':
|
||||
@@ -440,11 +501,14 @@ def update_device(device_id):
|
||||
else:
|
||||
list(api('/system/package/update/install'))
|
||||
flash("Aktualizacja systemu została rozpoczęta.")
|
||||
app.logger.debug("System update command executed successfully")
|
||||
except Exception as e:
|
||||
app.logger.error(f"Błąd podczas aktualizacji urządzenia {device.ip}: {e}", exc_info=True)
|
||||
flash(f"Błąd podczas aktualizacji: {e}")
|
||||
return redirect(url_for('device_detail', device_id=device.id))
|
||||
|
||||
|
||||
|
||||
@app.route('/device/<int:device_id>/update_firmware', methods=['POST'])
|
||||
@login_required
|
||||
def update_firmware(device_id):
|
||||
|
Reference in New Issue
Block a user