2025-11-04

v10.31.0

Summary
  • Execution pipeline improvements with breaking changes to post-authentication timing and new final-* pipeline variants. See Execution Pipelines

  • File path resolution now relative to config file location instead of working directory (breaking change)

  • Improved signal handling - Shutdown attempted only once even if multiple signals are received, Handle SIGINT (Ctrl-C), Second SIGINT signal forces immediate exit

  • Timeout configuration values now support human-readable unit suffixes (s, m, h, etc.). See Duration Units

  • HTTP Management requests can now be authenticated with policies for flexible access control. See Management API Privileges

  • Documentation is now bundled with the Radiator Server UI

  • Add Instance and Cluster Identifiers support for HA and fleet operations naming. See High Availability Identifiers

  • Fix scroll behavior for long-content views in UI

  • Improve Counters page performance with 24-hour sparklines and automatic down-sampling

  • Format counter values with SI notation and time units for better readability

  • New aaa.errors context variable for capturing and logging pipeline errors during AAA processing

  • Add error sampling system to prevent log flooding with intelligent rate-limiting by error category

  • Allow using filters with any expressions. Ex. vars.username = user.username | uppercase;

  • Per-user Management UI settings stored as individual JSON files (<config_dir>/ui-settings/<sanitized-username>.json)

  • New json, jsonpath, regex, recover, join and type filters. See Filters

  • Add "else if" support to if conditionals. See if action

  • Add configuration zip import & export for backups and easy migration between instances

  • Add jsonfile backend

  • Dot (.) in regexes now matches newlines

  • Add env.* accessor for reading environment variables in expressions. See Execution Context

  • Allow referencing enviroment variables in config strings using the format string syntax. Ex. "%{ENV_VAR_NAME}". See Data Types

  • radiator-client can now send attributes using dictionaries with the new --attr flag. See radiator-client --help for details.

  • Rename template action and configuration block to invoke and pipeline respectively for clarity - template action is now a deprecated alias for invoke and template block is now a deprecated alias for pipeline block

  • Show operation progress in shutdown and restart buttons in UI

  • Remove target and id log fields from API as they are being deprecated

  • Setting export RADIATOR_LOG_LEVEL=trace will now log http request/responses details in http backend.

  • LDAP - Allow referencing the entry DN using entry::dn

  • JSON log file time stamps are now RFC3339. See Logging

  • Management UI sessions now automatically refresh every 5 minutes to prevent logout during active use

  • Counter values now use SI notation (K, M, G, T) for >= 1000 and time units (µs, ms, s, min) for TimeSpent counters

  • Add build metadata - build_kind, build_timestamp, cpu_target, git_branch, and git_commit (available in logs, API, Prometheus, and UI)

  • Add configuration file upload - Select and upload local files directly to Configuration page

  • Add configuration ZIP import/export for backups and migration between instances

  • Improve trace logging - detailed policy logging, handler matching logs, reduced dictionary noise

  • Service now closes connections immediately when configuration is broken (TCP closes after accept, UDP no response)

Execution pipeline improvements

🚨 BREAKING CHANGE

Fix the post-authentication execution position to run strictly after the authentication pipeline (not after authorization).

Add final-* pipeline variants (final-authorization, final-authentication, final-accounting) that always execute at the very end regardless of outcome.

See the Execution Pipelines article for complete details.

File path resolution changes

🚨 BREAKING CHANGE

All file and directory references are now relative to the config file location. They used to be relative to the current working directory.

For example, with this config file structure when the current working directory is /var/lib/radiator:

/var/lib/radiator/conf.d/certificates.conf
/var/lib/radiator/certs/server.pem

certificates.conf references the certificate file relative to its own location:

certificates {
    x509 "EAP_SERVER_CERT" {
        filename "../certs/server.pem";
    }
}

E.g., when migrating from the old version, you must change the path in the config file from certs/server.pem to ../certs/server.pem.

File relation helpers

It is now possible to reference files and config includes to the config root with the <root> prefix:

include "<root>/conf.d/certificates.conf";
certificates {
    x509 "EAP_SERVER_CERT" {
        filename "<root>/certs/server.pem";
    }
}

The root is defined as the directory passsed to -c. If it is a file the root is the file's parent directory.

If you really need the legacy behaviour, you can use the <cwd> prefix:

certificates {
    x509 "EAP_SERVER_CERT" {
        filename "<cwd>/certs/server.pem";
    }
}

AAA Error Context Variable

Add aaa.errors context variable to capture pipeline errors during AAA processing. Errors previously written to aaa.reason are now in aaa.errors to avoid exposing internal details to clients.

Recommended: Add aaa.errors logging to all log configurations.

Usage:

  • String format: %{aaa.errors} (semicolon-separated errors)
  • JSON format: aaa.errors (structured array)

Example log output:

{
    "errors": "main pipeline Authentication: Radius dictionary attribute 'erx-egress-policy-name' not found",
    "errors_json": [
        {
            "context": "main pipeline Authentication",
            "message": "Radius dictionary attribute 'erx-egress-policy-name' not found"
        }
    ]
}