updated to allow config of the new server
This commit is contained in:
@@ -217,10 +217,13 @@ def _register_context_processors(app):
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
pending_wmt_count = session.query(WMTUpdateRequest).filter_by(status='pending').count()
|
||||
unconfigured_count = session.query(WMTUpdateRequest).filter_by(status='to_be_configured').count()
|
||||
except Exception:
|
||||
pending_wmt_count = 0
|
||||
unconfigured_count = 0
|
||||
return {
|
||||
'app_name': 'Enhanced Server Monitoring',
|
||||
'app_version': '2.0.0',
|
||||
'pending_wmt_count': pending_wmt_count,
|
||||
'unconfigured_count': unconfigured_count,
|
||||
}
|
||||
+66
-3
@@ -8,10 +8,12 @@ import hashlib
|
||||
from datetime import datetime
|
||||
from app.services.log_service import LogCompressionService
|
||||
from app.services.file_service import FileUploadService
|
||||
from app.models import Device, LogEntry, FileUpload
|
||||
from app.models import Device, LogEntry, FileUpload, WMTUpdateRequest
|
||||
from config.database_config import get_db
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Create blueprint
|
||||
logs_bp = Blueprint('logs', __name__, url_prefix='/api/logs')
|
||||
|
||||
@@ -68,6 +70,14 @@ def submit_log():
|
||||
'mac_address': data.get('mac_address') or (data.get('metadata') or {}).get('mac_address'),
|
||||
}
|
||||
|
||||
# ── Unconfigured device interception ──────────────────────────────────
|
||||
# A device with work_place=notconfig must NOT be added to the devices
|
||||
# table. Instead, create/refresh a "to_be_configured" update request so
|
||||
# it appears in the dedicated section on the Update Requests page.
|
||||
if data['nume_masa'].strip().lower() == 'notconfig':
|
||||
return _handle_notconfig_device(device_info, data.get('log_message', ''))
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
# Process log with compression
|
||||
result = log_service.process_log_message(
|
||||
device_info=device_info,
|
||||
@@ -204,14 +214,67 @@ def upload_log_file():
|
||||
'success': False
|
||||
}), 500
|
||||
|
||||
def _handle_notconfig_device(device_info: dict, log_message: str):
|
||||
"""
|
||||
A device reporting work_place='notconfig' is awaiting admin configuration.
|
||||
We must NOT create a Device record for it. Instead we create / refresh a
|
||||
WMTUpdateRequest with status='to_be_configured' so it surfaces under the
|
||||
dedicated tab on the Update Requests page.
|
||||
"""
|
||||
mac = (device_info.get('mac_address') or '').strip().lower()
|
||||
hostname = device_info.get('hostname', '')
|
||||
ip = device_info.get('device_ip', '')
|
||||
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
existing = (
|
||||
session.query(WMTUpdateRequest)
|
||||
.filter_by(mac_address=mac, status='to_be_configured')
|
||||
.order_by(WMTUpdateRequest.submitted_at.desc())
|
||||
.first()
|
||||
) if mac else None
|
||||
|
||||
if existing:
|
||||
# Refresh the timestamp and any identity fields that may have changed
|
||||
existing.submitted_at = datetime.utcnow()
|
||||
existing.proposed_hostname = hostname or existing.proposed_hostname
|
||||
existing.proposed_device_ip = ip or existing.proposed_device_ip
|
||||
if log_message:
|
||||
existing.admin_notes = f"Last log: {log_message[:200]}"
|
||||
logger.debug(f'notconfig heartbeat refreshed for {mac or hostname}')
|
||||
else:
|
||||
req = WMTUpdateRequest(
|
||||
mac_address=mac or None,
|
||||
device_id=None,
|
||||
proposed_device_name=None,
|
||||
proposed_hostname=hostname or None,
|
||||
proposed_device_ip=ip or None,
|
||||
client_config_mtime=datetime.utcnow().isoformat(),
|
||||
submitted_at=datetime.utcnow(),
|
||||
status='to_be_configured',
|
||||
admin_notes=f"Last log: {log_message[:200]}" if log_message else None,
|
||||
)
|
||||
session.add(req)
|
||||
logger.info(f'New unconfigured device queued: {hostname} / {mac or "no-mac"}')
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'status': 'to_be_configured',
|
||||
'message': 'Device is not configured. Awaiting admin assignment.',
|
||||
}), 202
|
||||
except Exception as e:
|
||||
logger.error(f'Error handling notconfig device: {e}')
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
|
||||
@logs_bp.route('/query', methods=['GET'])
|
||||
def query_logs():
|
||||
"""
|
||||
Query logs with filters and pagination
|
||||
|
||||
|
||||
Query parameters:
|
||||
- device_id: Filter by device ID
|
||||
- hostname: Filter by hostname
|
||||
- hostname: Filter by hostname
|
||||
- severity: Filter by severity level
|
||||
- start_time: Start time (ISO format)
|
||||
- end_time: End time (ISO format)
|
||||
|
||||
@@ -197,6 +197,38 @@ def submit_update_request():
|
||||
|
||||
# ── Outcome 3: unknown device ─────────────────────────────
|
||||
if not device:
|
||||
# Devices with work_place=notconfig are unconfigured and must not
|
||||
# be registered. Route them to their own "to_be_configured" bucket.
|
||||
if not proposed_name or proposed_name.lower() == 'notconfig':
|
||||
existing_tbc = (
|
||||
session.query(WMTUpdateRequest)
|
||||
.filter_by(mac_address=mac, status='to_be_configured')
|
||||
.order_by(WMTUpdateRequest.submitted_at.desc())
|
||||
.first()
|
||||
)
|
||||
if existing_tbc:
|
||||
existing_tbc.submitted_at = datetime.utcnow()
|
||||
existing_tbc.proposed_hostname = proposed_hostname or existing_tbc.proposed_hostname
|
||||
existing_tbc.proposed_device_ip = proposed_ip or existing_tbc.proposed_device_ip
|
||||
logger.debug(f'WMT notconfig heartbeat refreshed for {mac}')
|
||||
else:
|
||||
req = WMTUpdateRequest(
|
||||
mac_address=mac,
|
||||
device_id=None,
|
||||
proposed_device_name=None,
|
||||
proposed_hostname=proposed_hostname or None,
|
||||
proposed_device_ip=proposed_ip or None,
|
||||
client_config_mtime=data.get('client_config_mtime'),
|
||||
submitted_at=datetime.utcnow(),
|
||||
status='to_be_configured',
|
||||
)
|
||||
session.add(req)
|
||||
logger.info(f'WMT unconfigured device queued: {proposed_hostname} / {mac}')
|
||||
return jsonify({
|
||||
'status': 'to_be_configured',
|
||||
'message': 'Device has no work_place set. Awaiting admin assignment.',
|
||||
}), 202
|
||||
|
||||
# Check if a pending request with the same data already exists
|
||||
existing = (
|
||||
session.query(WMTUpdateRequest)
|
||||
|
||||
@@ -454,6 +454,8 @@ def device_edit(device_id):
|
||||
device.device_type = request.form.get('device_type', '').strip() or 'unknown'
|
||||
device.description = request.form.get('description', '').strip() or None
|
||||
device.os_version = request.form.get('os_version', '').strip() or None
|
||||
custom_url = request.form.get('custom_chrome_url', '').strip()
|
||||
device.custom_chrome_url = custom_url if custom_url else None
|
||||
device.config_updated_at = datetime.utcnow()
|
||||
device.info_reviewed_at = datetime.utcnow()
|
||||
flash('Device updated.', 'success')
|
||||
|
||||
+11
-34
@@ -37,31 +37,8 @@ def _get_or_create_global_config(session):
|
||||
|
||||
@wmt_web_bp.route('/')
|
||||
def index():
|
||||
"""WMT management dashboard."""
|
||||
try:
|
||||
with get_db().get_session() as session:
|
||||
global_cfg = _get_or_create_global_config(session)
|
||||
devices = session.query(Device).filter(Device.mac_address.isnot(None)).order_by(Device.nume_masa).all()
|
||||
pending_count = session.query(WMTUpdateRequest).filter_by(status='pending').count()
|
||||
recent_requests = (
|
||||
session.query(WMTUpdateRequest)
|
||||
.order_by(WMTUpdateRequest.submitted_at.desc())
|
||||
.limit(5)
|
||||
.all()
|
||||
)
|
||||
return render_template(
|
||||
'wmt/index.html',
|
||||
global_cfg=global_cfg,
|
||||
devices=devices,
|
||||
pending_count=pending_count,
|
||||
recent_requests=recent_requests,
|
||||
breadcrumbs=[{'url': url_for('wmt_web.index'), 'title': 'WMT Management'}],
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f'WMT dashboard error: {e}')
|
||||
flash(f'Error loading dashboard: {e}', 'error')
|
||||
return render_template('wmt/index.html', global_cfg=None, devices=[],
|
||||
pending_count=0, recent_requests=[])
|
||||
"""Retired: the WMT dashboard is merged into the unified Devices page."""
|
||||
return redirect(url_for('main.devices'))
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -94,14 +71,14 @@ def settings():
|
||||
'wmt/settings.html',
|
||||
cfg=cfg,
|
||||
breadcrumbs=[
|
||||
{'url': url_for('wmt_web.index'), 'title': 'WMT Management'},
|
||||
{'url': url_for('wmt_web.settings'), 'title': 'Global Settings'},
|
||||
{'url': url_for('main.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('wmt_web.settings'), 'title': 'WMT Settings'},
|
||||
],
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f'WMT settings error: {e}')
|
||||
flash(f'Error: {e}', 'error')
|
||||
return redirect(url_for('wmt_web.index'))
|
||||
return redirect(url_for('main.devices'))
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -119,21 +96,23 @@ def update_requests():
|
||||
query = query.filter_by(status=status_filter)
|
||||
req_list = query.order_by(WMTUpdateRequest.submitted_at.desc()).all()
|
||||
pending_count = session.query(WMTUpdateRequest).filter_by(status='pending').count()
|
||||
unconfigured_count = session.query(WMTUpdateRequest).filter_by(status='to_be_configured').count()
|
||||
|
||||
return render_template(
|
||||
'wmt/requests.html',
|
||||
requests=req_list,
|
||||
status_filter=status_filter,
|
||||
pending_count=pending_count,
|
||||
unconfigured_count=unconfigured_count,
|
||||
breadcrumbs=[
|
||||
{'url': url_for('wmt_web.index'), 'title': 'WMT Management'},
|
||||
{'url': url_for('main.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('wmt_web.update_requests'), 'title': 'Update Requests'},
|
||||
],
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f'WMT requests list error: {e}')
|
||||
flash(f'Error: {e}', 'error')
|
||||
return redirect(url_for('wmt_web.index'))
|
||||
return redirect(url_for('main.devices'))
|
||||
|
||||
|
||||
@wmt_web_bp.route('/requests/<int:req_id>/accept', methods=['POST'])
|
||||
@@ -256,8 +235,7 @@ def device_new():
|
||||
'wmt/device_form.html',
|
||||
device=None,
|
||||
breadcrumbs=[
|
||||
{'url': url_for('wmt_web.index'), 'title': 'WMT Management'},
|
||||
{'url': url_for('wmt_web.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('main.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('wmt_web.device_new'), 'title': 'New Device'},
|
||||
],
|
||||
)
|
||||
@@ -291,8 +269,7 @@ def device_edit(device_id):
|
||||
'wmt/device_form.html',
|
||||
device=device,
|
||||
breadcrumbs=[
|
||||
{'url': url_for('wmt_web.index'), 'title': 'WMT Management'},
|
||||
{'url': url_for('wmt_web.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('main.devices'), 'title': 'Devices'},
|
||||
{'url': url_for('wmt_web.device_edit', device_id=device_id), 'title': 'Edit'},
|
||||
],
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user