90 lines
3.2 KiB
Python
90 lines
3.2 KiB
Python
import os
|
|
from pathlib import Path
|
|
from flask import Blueprint, request, redirect, flash, session
|
|
from auth import require_level
|
|
from config_utils import (flush_pending_to_queue, get_dashboard_pending,
|
|
revert_snapshot_to_config, queued_msg,
|
|
SNAPSHOTS_DIR, DASHBOARD_PENDING)
|
|
|
|
_PAGE = Path(__file__).parent.name
|
|
|
|
bp = Blueprint(_PAGE, __name__)
|
|
|
|
@bp.route('/action/actions/pending_save', methods=['POST'])
|
|
@require_level('administrator')
|
|
def pending_save():
|
|
session['apply_changes_immediately'] = 'apply_changes_immediately' in request.form
|
|
flash('Preference saved.', 'success')
|
|
return redirect(f'/{_PAGE}')
|
|
|
|
|
|
@bp.route('/action/actions/pending_apply', methods=['POST'])
|
|
@require_level('administrator')
|
|
def pending_apply():
|
|
pending = get_dashboard_pending()
|
|
if not pending:
|
|
flash('No pending changes to apply.', 'info')
|
|
return redirect(f'/{_PAGE}')
|
|
flush_pending_to_queue()
|
|
if any(cmd != 'fix problems' for _, _, cmd, _ in pending):
|
|
flash('Changes queued.', 'success')
|
|
return redirect(f'/{_PAGE}')
|
|
|
|
|
|
@bp.route('/action/actions/history_revert', methods=['POST'])
|
|
@require_level('administrator')
|
|
def history_revert():
|
|
selected_uuids = request.form.getlist('selected_uuids')
|
|
if not selected_uuids:
|
|
flash('No items selected.', 'info')
|
|
return redirect(f'/{_PAGE}')
|
|
succeeded, failed = 0, 0
|
|
for uuid in selected_uuids:
|
|
msg, ok = revert_snapshot_to_config(uuid)
|
|
if ok:
|
|
succeeded += 1
|
|
else:
|
|
flash(msg, 'error')
|
|
failed += 1
|
|
if succeeded:
|
|
plural = 's' if succeeded != 1 else ''
|
|
flash(f'{succeeded} change{plural} reverted.', 'success')
|
|
return redirect(f'/{_PAGE}')
|
|
|
|
|
|
@bp.route('/action/actions/history_clear', methods=['POST'])
|
|
@require_level('manager')
|
|
def history_clear():
|
|
selected_uuids = request.form.getlist('selected_uuids')
|
|
if not selected_uuids:
|
|
flash('No items selected.', 'info')
|
|
return redirect(f'/{_PAGE}')
|
|
count = 0
|
|
for fname in os.listdir(SNAPSHOTS_DIR):
|
|
if not fname.endswith('.json'):
|
|
continue
|
|
if any(fname.endswith(f'-{uuid}.json') for uuid in selected_uuids):
|
|
fpath = os.path.join(SNAPSHOTS_DIR, fname)
|
|
if os.path.isfile(fpath):
|
|
os.remove(fpath)
|
|
count += 1
|
|
plural = 's' if count != 1 else ''
|
|
flash(f'{count} history record{plural} cleared.', 'success')
|
|
return redirect(f'/{_PAGE}')
|
|
|
|
|
|
@bp.route('/action/actions/pending_dismiss', methods=['POST'])
|
|
@require_level('manager')
|
|
def pending_dismiss():
|
|
pending = get_dashboard_pending()
|
|
dismissible = [(u, t, c, usr) for u, t, c, usr in pending if c != 'fix problems']
|
|
if not dismissible:
|
|
flash('No pending changes to dismiss.', 'info')
|
|
return redirect(f'/{_PAGE}')
|
|
keep = [(u, t, c, usr) for u, t, c, usr in pending if c == 'fix problems']
|
|
with open(DASHBOARD_PENDING, 'w') as f:
|
|
for u, t, c, usr in keep:
|
|
f.write(f'{u} {t} [{c}] ({usr})\n')
|
|
plural = 's' if len(dismissible) != 1 else ''
|
|
flash(f'{len(dismissible)} pending change{plural} dismissed.', 'success')
|
|
return redirect(f'/{_PAGE}')
|