@extends('layouts.app') @section('title', 'RADIUS / AAA') @section('content')

RADIUS & AAA

FreeRADIUS SQL backend, live sessions and disconnect management.

@csrf
@csrf
@include('components.kpi', ['label' => 'Online now', 'value' => number_format($counts['online']), 'variant' => 'good', 'href' => route('radius.sessions', ['online' => 1])]) @include('components.kpi', ['label' => 'RADIUS users', 'value' => number_format($counts['users']), 'variant' => 'info', 'href' => '#users']) @include('components.kpi', ['label' => 'Auth today', 'value' => number_format($counts['auths_today']), 'delta' => $counts['rejects_today'].' rejected', 'href' => route('radius.auth-log')]) @include('components.kpi', ['label' => 'Success rate', 'value' => percent($counts['success_rate']), 'variant' => 'good', 'href' => '#']) @include('components.kpi', ['label' => 'Data today', 'value' => human_bytes($counts['bytes_today']), 'variant' => 'info', 'href' => route('radius.usage')]) @include('components.kpi', ['label' => 'NAS devices', 'value' => $counts['nas'], 'href' => '#nas'])

Concurrent sessions — 24h

@include('components.chart', [ 'series' => collect($sessionTrend)->map(fn ($p) => [ 'label' => \Carbon\Carbon::parse($p['hour'])->format('H:00'), 'value' => $p['sessions'], ])->all(), 'type' => 'line', 'format' => 'number', 'height' => 200, ])

Authentication attempts — 24h

@include('components.chart', [ 'series' => collect($authTrend)->map(fn ($p) => [ 'label' => \Carbon\Carbon::parse($p['hour'])->format('H:00'), 'value' => $p['total'], ])->all(), 'type' => 'bar', 'format' => 'number', 'height' => 200, ])

Live sessions

@forelse ($sessions as $session) @empty @endforelse
SubscriberServiceFramed IPNAS UptimeDownUp
{{ $session->username }} @if ($session->service) {{ $session->service->service_number }}
{{ $session->service->customer->display_name }}
@else — @endif
{{ $session->framed_ip ?: '—' }} {{ $session->nas_ip }} {{ $session->duration_label }} {{ human_bytes($session->input_octets) }} {{ human_bytes($session->output_octets) }}
@csrf
@include('components.empty-state', ['icon' => '🔌', 'title' => 'No live sessions', 'message' => 'Sessions appear once the NAS sends RADIUS accounting packets.'])

NAS clients

FreeRADIUS nas table
@forelse ($nasList as $nas) @empty @endforelse
Short nameIPTypePortDescription
{{ $nas->shortname }} {{ $nas->nasname }} {{ $nas->type }} {{ $nas->ports ?? '—' }} {{ $nas->description }}
@include('components.empty-state', ['icon' => '📡', 'title' => 'No NAS clients registered'])

RADIUS users

Sync state to FreeRADIUS
@forelse ($users as $user) @empty @endforelse
UsernameGroupStatusLast sync
{{ $user->username }} @if ($user->service)
{{ $user->service->service_number }}
@endif
{{ $user->groupname ?: '—' }} {{ $user->status }} {{ $user->last_sync_status }}
{{ $user->last_synced_at?->diffForHumans() ?? 'never' }}
@include('components.empty-state', ['icon' => '🔒', 'title' => 'No RADIUS users'])
@endsection