feat(radius): add RADIUS server with MAC authentication (MAB), VLAN assignment, accounting and OpsServer API handlers
This commit is contained in:
329
ts_interfaces/requests/radius.ts
Normal file
329
ts_interfaces/requests/radius.ts
Normal file
@@ -0,0 +1,329 @@
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as authInterfaces from '../data/auth.js';
|
||||
|
||||
// ============================================================================
|
||||
// RADIUS Client Management
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Get all RADIUS clients (NAS devices)
|
||||
*/
|
||||
export interface IReq_GetRadiusClients extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_GetRadiusClients
|
||||
> {
|
||||
method: 'getRadiusClients';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
};
|
||||
response: {
|
||||
clients: Array<{
|
||||
name: string;
|
||||
ipRange: string;
|
||||
description?: string;
|
||||
enabled: boolean;
|
||||
}>;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Add or update a RADIUS client
|
||||
*/
|
||||
export interface IReq_SetRadiusClient extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_SetRadiusClient
|
||||
> {
|
||||
method: 'setRadiusClient';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
client: {
|
||||
name: string;
|
||||
ipRange: string;
|
||||
secret: string;
|
||||
description?: string;
|
||||
enabled: boolean;
|
||||
};
|
||||
};
|
||||
response: {
|
||||
success: boolean;
|
||||
message?: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a RADIUS client
|
||||
*/
|
||||
export interface IReq_RemoveRadiusClient extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_RemoveRadiusClient
|
||||
> {
|
||||
method: 'removeRadiusClient';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
name: string;
|
||||
};
|
||||
response: {
|
||||
success: boolean;
|
||||
message?: string;
|
||||
};
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// VLAN Mapping Management
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Get all MAC-to-VLAN mappings
|
||||
*/
|
||||
export interface IReq_GetVlanMappings extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_GetVlanMappings
|
||||
> {
|
||||
method: 'getVlanMappings';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
};
|
||||
response: {
|
||||
mappings: Array<{
|
||||
mac: string;
|
||||
vlan: number;
|
||||
description?: string;
|
||||
enabled: boolean;
|
||||
createdAt: number;
|
||||
updatedAt: number;
|
||||
}>;
|
||||
config: {
|
||||
defaultVlan: number;
|
||||
allowUnknownMacs: boolean;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Add or update a VLAN mapping
|
||||
*/
|
||||
export interface IReq_SetVlanMapping extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_SetVlanMapping
|
||||
> {
|
||||
method: 'setVlanMapping';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
mapping: {
|
||||
mac: string;
|
||||
vlan: number;
|
||||
description?: string;
|
||||
enabled: boolean;
|
||||
};
|
||||
};
|
||||
response: {
|
||||
success: boolean;
|
||||
mapping?: {
|
||||
mac: string;
|
||||
vlan: number;
|
||||
description?: string;
|
||||
enabled: boolean;
|
||||
createdAt: number;
|
||||
updatedAt: number;
|
||||
};
|
||||
message?: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a VLAN mapping
|
||||
*/
|
||||
export interface IReq_RemoveVlanMapping extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_RemoveVlanMapping
|
||||
> {
|
||||
method: 'removeVlanMapping';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
mac: string;
|
||||
};
|
||||
response: {
|
||||
success: boolean;
|
||||
message?: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Update VLAN configuration
|
||||
*/
|
||||
export interface IReq_UpdateVlanConfig extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_UpdateVlanConfig
|
||||
> {
|
||||
method: 'updateVlanConfig';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
defaultVlan?: number;
|
||||
allowUnknownMacs?: boolean;
|
||||
};
|
||||
response: {
|
||||
success: boolean;
|
||||
config: {
|
||||
defaultVlan: number;
|
||||
allowUnknownMacs: boolean;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Test VLAN assignment for a MAC address
|
||||
*/
|
||||
export interface IReq_TestVlanAssignment extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_TestVlanAssignment
|
||||
> {
|
||||
method: 'testVlanAssignment';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
mac: string;
|
||||
};
|
||||
response: {
|
||||
assigned: boolean;
|
||||
vlan: number;
|
||||
isDefault: boolean;
|
||||
matchedRule?: {
|
||||
mac: string;
|
||||
vlan: number;
|
||||
description?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Accounting / Session Management
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Get active RADIUS sessions
|
||||
*/
|
||||
export interface IReq_GetRadiusSessions extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_GetRadiusSessions
|
||||
> {
|
||||
method: 'getRadiusSessions';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
filter?: {
|
||||
username?: string;
|
||||
nasIpAddress?: string;
|
||||
vlanId?: number;
|
||||
};
|
||||
};
|
||||
response: {
|
||||
sessions: Array<{
|
||||
sessionId: string;
|
||||
username: string;
|
||||
macAddress?: string;
|
||||
nasIpAddress: string;
|
||||
nasIdentifier?: string;
|
||||
vlanId?: number;
|
||||
framedIpAddress?: string;
|
||||
startTime: number;
|
||||
lastUpdateTime: number;
|
||||
status: 'active' | 'stopped' | 'terminated';
|
||||
inputOctets: number;
|
||||
outputOctets: number;
|
||||
sessionTime: number;
|
||||
}>;
|
||||
totalCount: number;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect a RADIUS session
|
||||
*/
|
||||
export interface IReq_DisconnectRadiusSession extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_DisconnectRadiusSession
|
||||
> {
|
||||
method: 'disconnectRadiusSession';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
sessionId: string;
|
||||
reason?: string;
|
||||
};
|
||||
response: {
|
||||
success: boolean;
|
||||
message?: string;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get accounting summary/report
|
||||
*/
|
||||
export interface IReq_GetRadiusAccountingSummary extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_GetRadiusAccountingSummary
|
||||
> {
|
||||
method: 'getRadiusAccountingSummary';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
startTime: number;
|
||||
endTime: number;
|
||||
};
|
||||
response: {
|
||||
summary: {
|
||||
periodStart: number;
|
||||
periodEnd: number;
|
||||
totalSessions: number;
|
||||
activeSessions: number;
|
||||
totalInputBytes: number;
|
||||
totalOutputBytes: number;
|
||||
totalSessionTime: number;
|
||||
averageSessionDuration: number;
|
||||
uniqueUsers: number;
|
||||
sessionsByVlan: Record<number, number>;
|
||||
topUsersByTraffic: Array<{ username: string; totalBytes: number }>;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Statistics
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Get RADIUS server statistics
|
||||
*/
|
||||
export interface IReq_GetRadiusStatistics extends plugins.typedrequestInterfaces.implementsTR<
|
||||
plugins.typedrequestInterfaces.ITypedRequest,
|
||||
IReq_GetRadiusStatistics
|
||||
> {
|
||||
method: 'getRadiusStatistics';
|
||||
request: {
|
||||
identity?: authInterfaces.IIdentity;
|
||||
};
|
||||
response: {
|
||||
stats: {
|
||||
running: boolean;
|
||||
uptime: number;
|
||||
authRequests: number;
|
||||
authAccepts: number;
|
||||
authRejects: number;
|
||||
accountingRequests: number;
|
||||
activeSessions: number;
|
||||
vlanMappings: number;
|
||||
clients: number;
|
||||
};
|
||||
vlanStats: {
|
||||
totalMappings: number;
|
||||
enabledMappings: number;
|
||||
exactMatches: number;
|
||||
ouiPatterns: number;
|
||||
wildcardPatterns: number;
|
||||
};
|
||||
accountingStats: {
|
||||
activeSessions: number;
|
||||
totalSessionsStarted: number;
|
||||
totalSessionsStopped: number;
|
||||
totalInputBytes: number;
|
||||
totalOutputBytes: number;
|
||||
interimUpdatesReceived: number;
|
||||
};
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user