@serve.zone/dcrouter 11.14.0 → 11.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_serve/bundle.js +5 -9
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
- package/dist_ts/cache/classes.cache.cleaner.js +130 -0
- package/dist_ts/cache/classes.cached.document.d.ts +76 -0
- package/dist_ts/cache/classes.cached.document.js +100 -0
- package/dist_ts/cache/classes.cachedb.d.ts +60 -0
- package/dist_ts/cache/classes.cachedb.js +126 -0
- package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
- package/dist_ts/cache/documents/classes.cached.email.js +337 -0
- package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
- package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
- package/dist_ts/cache/documents/index.d.ts +2 -0
- package/dist_ts/cache/documents/index.js +3 -0
- package/dist_ts/cache/index.d.ts +4 -0
- package/dist_ts/cache/index.js +7 -0
- package/dist_ts/classes.cert-provision-scheduler.d.ts +54 -0
- package/dist_ts/classes.cert-provision-scheduler.js +118 -0
- package/dist_ts/classes.dcrouter.d.ts +399 -0
- package/dist_ts/classes.dcrouter.js +1697 -0
- package/dist_ts/classes.storage-cert-manager.d.ts +18 -0
- package/dist_ts/classes.storage-cert-manager.js +43 -0
- package/dist_ts/config/classes.api-token-manager.d.ts +46 -0
- package/dist_ts/config/classes.api-token-manager.js +150 -0
- package/dist_ts/config/classes.route-config-manager.d.ts +38 -0
- package/dist_ts/config/classes.route-config-manager.js +257 -0
- package/dist_ts/config/index.d.ts +3 -0
- package/dist_ts/config/index.js +5 -0
- package/dist_ts/config/validator.d.ts +104 -0
- package/dist_ts/config/validator.js +152 -0
- package/dist_ts/errors/base.errors.d.ts +224 -0
- package/dist_ts/errors/base.errors.js +320 -0
- package/dist_ts/errors/error-handler.d.ts +98 -0
- package/dist_ts/errors/error-handler.js +282 -0
- package/dist_ts/errors/error.codes.d.ts +115 -0
- package/dist_ts/errors/error.codes.js +136 -0
- package/dist_ts/errors/index.d.ts +54 -0
- package/dist_ts/errors/index.js +136 -0
- package/dist_ts/errors/reputation.errors.d.ts +183 -0
- package/dist_ts/errors/reputation.errors.js +292 -0
- package/dist_ts/http3/http3-route-augmentation.d.ts +50 -0
- package/dist_ts/http3/http3-route-augmentation.js +98 -0
- package/dist_ts/http3/index.d.ts +1 -0
- package/dist_ts/http3/index.js +2 -0
- package/dist_ts/index.d.ts +8 -0
- package/dist_ts/index.js +29 -0
- package/dist_ts/logger.d.ts +21 -0
- package/dist_ts/logger.js +81 -0
- package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
- package/dist_ts/monitoring/classes.metricscache.js +63 -0
- package/dist_ts/monitoring/classes.metricsmanager.d.ts +184 -0
- package/dist_ts/monitoring/classes.metricsmanager.js +744 -0
- package/dist_ts/monitoring/index.d.ts +1 -0
- package/dist_ts/monitoring/index.js +2 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +38 -0
- package/dist_ts/opsserver/classes.opsserver.js +87 -0
- package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
- package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
- package/dist_ts/opsserver/handlers/api-token.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/api-token.handler.js +62 -0
- package/dist_ts/opsserver/handlers/certificate.handler.d.ts +32 -0
- package/dist_ts/opsserver/handlers/certificate.handler.js +421 -0
- package/dist_ts/opsserver/handlers/config.handler.d.ts +7 -0
- package/dist_ts/opsserver/handlers/config.handler.js +192 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +30 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.js +227 -0
- package/dist_ts/opsserver/handlers/index.d.ts +12 -0
- package/dist_ts/opsserver/handlers/index.js +13 -0
- package/dist_ts/opsserver/handlers/logs.handler.d.ts +25 -0
- package/dist_ts/opsserver/handlers/logs.handler.js +256 -0
- package/dist_ts/opsserver/handlers/radius.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/radius.handler.js +295 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.js +156 -0
- package/dist_ts/opsserver/handlers/route-management.handler.d.ts +14 -0
- package/dist_ts/opsserver/handlers/route-management.handler.js +117 -0
- package/dist_ts/opsserver/handlers/security.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/security.handler.js +233 -0
- package/dist_ts/opsserver/handlers/stats.handler.d.ts +11 -0
- package/dist_ts/opsserver/handlers/stats.handler.js +403 -0
- package/dist_ts/opsserver/handlers/vpn.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/vpn.handler.js +197 -0
- package/dist_ts/opsserver/helpers/guards.d.ts +27 -0
- package/dist_ts/opsserver/helpers/guards.js +43 -0
- package/dist_ts/opsserver/index.d.ts +1 -0
- package/dist_ts/opsserver/index.js +2 -0
- package/dist_ts/paths.d.ts +26 -0
- package/dist_ts/paths.js +45 -0
- package/dist_ts/plugins.d.ts +81 -0
- package/dist_ts/plugins.js +115 -0
- package/dist_ts/radius/classes.accounting.manager.d.ts +231 -0
- package/dist_ts/radius/classes.accounting.manager.js +462 -0
- package/dist_ts/radius/classes.radius.server.d.ts +171 -0
- package/dist_ts/radius/classes.radius.server.js +386 -0
- package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
- package/dist_ts/radius/classes.vlan.manager.js +279 -0
- package/dist_ts/radius/index.d.ts +13 -0
- package/dist_ts/radius/index.js +14 -0
- package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +94 -0
- package/dist_ts/remoteingress/classes.remoteingress-manager.js +271 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +59 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.js +165 -0
- package/dist_ts/remoteingress/index.d.ts +2 -0
- package/dist_ts/remoteingress/index.js +3 -0
- package/dist_ts/security/classes.contentscanner.d.ts +164 -0
- package/dist_ts/security/classes.contentscanner.js +642 -0
- package/dist_ts/security/classes.ipreputationchecker.d.ts +160 -0
- package/dist_ts/security/classes.ipreputationchecker.js +537 -0
- package/dist_ts/security/classes.securitylogger.d.ts +144 -0
- package/dist_ts/security/classes.securitylogger.js +235 -0
- package/dist_ts/security/index.d.ts +3 -0
- package/dist_ts/security/index.js +4 -0
- package/dist_ts/sms/classes.smsservice.d.ts +15 -0
- package/dist_ts/sms/classes.smsservice.js +72 -0
- package/dist_ts/sms/config/sms.config.d.ts +93 -0
- package/dist_ts/sms/config/sms.config.js +2 -0
- package/dist_ts/sms/config/sms.schema.d.ts +5 -0
- package/dist_ts/sms/config/sms.schema.js +121 -0
- package/dist_ts/sms/index.d.ts +1 -0
- package/dist_ts/sms/index.js +2 -0
- package/dist_ts/storage/classes.storagemanager.d.ts +83 -0
- package/dist_ts/storage/classes.storagemanager.js +348 -0
- package/dist_ts/storage/index.d.ts +1 -0
- package/dist_ts/storage/index.js +3 -0
- package/dist_ts/vpn/classes.vpn-manager.d.ts +129 -0
- package/dist_ts/vpn/classes.vpn-manager.js +329 -0
- package/dist_ts/vpn/index.d.ts +1 -0
- package/dist_ts/vpn/index.js +2 -0
- package/dist_ts_apiclient/classes.apitoken.d.ts +41 -0
- package/dist_ts_apiclient/classes.apitoken.js +115 -0
- package/dist_ts_apiclient/classes.certificate.d.ts +57 -0
- package/dist_ts_apiclient/classes.certificate.js +69 -0
- package/dist_ts_apiclient/classes.config.d.ts +7 -0
- package/dist_ts_apiclient/classes.config.js +11 -0
- package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +41 -0
- package/dist_ts_apiclient/classes.dcrouterapiclient.js +81 -0
- package/dist_ts_apiclient/classes.email.d.ts +30 -0
- package/dist_ts_apiclient/classes.email.js +52 -0
- package/dist_ts_apiclient/classes.logs.d.ts +21 -0
- package/dist_ts_apiclient/classes.logs.js +14 -0
- package/dist_ts_apiclient/classes.radius.d.ts +59 -0
- package/dist_ts_apiclient/classes.radius.js +95 -0
- package/dist_ts_apiclient/classes.remoteingress.d.ts +54 -0
- package/dist_ts_apiclient/classes.remoteingress.js +136 -0
- package/dist_ts_apiclient/classes.route.d.ts +42 -0
- package/dist_ts_apiclient/classes.route.js +154 -0
- package/dist_ts_apiclient/classes.stats.d.ts +47 -0
- package/dist_ts_apiclient/classes.stats.js +38 -0
- package/dist_ts_apiclient/index.d.ts +10 -0
- package/dist_ts_apiclient/index.js +14 -0
- package/dist_ts_apiclient/plugins.d.ts +3 -0
- package/dist_ts_apiclient/plugins.js +5 -0
- package/dist_ts_interfaces/data/remoteingress.d.ts +2 -0
- package/dist_ts_interfaces/data/vpn.d.ts +1 -2
- package/dist_ts_interfaces/requests/vpn.d.ts +1 -1
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/appstate.d.ts +238 -0
- package/dist_ts_web/appstate.js +1174 -0
- package/dist_ts_web/elements/index.d.ts +13 -0
- package/dist_ts_web/elements/index.js +14 -0
- package/dist_ts_web/elements/ops-dashboard.d.ts +23 -0
- package/dist_ts_web/elements/ops-dashboard.js +323 -0
- package/dist_ts_web/elements/ops-view-apitokens.d.ts +13 -0
- package/dist_ts_web/elements/ops-view-apitokens.js +371 -0
- package/dist_ts_web/elements/ops-view-certificates.d.ts +22 -0
- package/dist_ts_web/elements/ops-view-certificates.js +528 -0
- package/dist_ts_web/elements/ops-view-config.d.ts +19 -0
- package/dist_ts_web/elements/ops-view-config.js +339 -0
- package/dist_ts_web/elements/ops-view-emails.d.ts +21 -0
- package/dist_ts_web/elements/ops-view-emails.js +165 -0
- package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
- package/dist_ts_web/elements/ops-view-logs.js +159 -0
- package/dist_ts_web/elements/ops-view-network.d.ts +71 -0
- package/dist_ts_web/elements/ops-view-network.js +764 -0
- package/dist_ts_web/elements/ops-view-overview.d.ts +22 -0
- package/dist_ts_web/elements/ops-view-overview.js +456 -0
- package/dist_ts_web/elements/ops-view-remoteingress.d.ts +20 -0
- package/dist_ts_web/elements/ops-view-remoteingress.js +494 -0
- package/dist_ts_web/elements/ops-view-routes.d.ts +12 -0
- package/dist_ts_web/elements/ops-view-routes.js +404 -0
- package/dist_ts_web/elements/ops-view-security.d.ts +21 -0
- package/dist_ts_web/elements/ops-view-security.js +574 -0
- package/dist_ts_web/elements/ops-view-vpn.d.ts +14 -0
- package/dist_ts_web/elements/ops-view-vpn.js +365 -0
- package/dist_ts_web/elements/shared/css.d.ts +1 -0
- package/dist_ts_web/elements/shared/css.js +10 -0
- package/dist_ts_web/elements/shared/index.d.ts +2 -0
- package/dist_ts_web/elements/shared/index.js +3 -0
- package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +5 -0
- package/dist_ts_web/elements/shared/ops-sectionheading.js +82 -0
- package/dist_ts_web/index.d.ts +1 -0
- package/dist_ts_web/index.js +10 -0
- package/dist_ts_web/plugins.d.ts +6 -0
- package/dist_ts_web/plugins.js +11 -0
- package/dist_ts_web/router.d.ts +19 -0
- package/dist_ts_web/router.js +91 -0
- package/package.json +2 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +51 -20
- package/ts/config/classes.route-config-manager.ts +7 -6
- package/ts/opsserver/handlers/vpn.handler.ts +3 -5
- package/ts/vpn/classes.vpn-manager.ts +68 -19
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +2 -2
- package/ts_web/elements/ops-view-vpn.ts +5 -9
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages MAC address to VLAN mappings with support for:
|
|
5
|
+
* - Exact MAC address matching
|
|
6
|
+
* - OUI (vendor prefix) pattern matching
|
|
7
|
+
* - Wildcard patterns
|
|
8
|
+
* - Default VLAN for unknown devices
|
|
9
|
+
*/
|
|
10
|
+
export class VlanManager {
|
|
11
|
+
mappings = new Map();
|
|
12
|
+
config;
|
|
13
|
+
storageManager;
|
|
14
|
+
// Cache for normalized MAC lookups
|
|
15
|
+
normalizedMacCache = new Map();
|
|
16
|
+
constructor(config, storageManager) {
|
|
17
|
+
this.config = {
|
|
18
|
+
defaultVlan: config?.defaultVlan ?? 1,
|
|
19
|
+
allowUnknownMacs: config?.allowUnknownMacs ?? true,
|
|
20
|
+
storagePrefix: config?.storagePrefix ?? '/radius/vlan-mappings',
|
|
21
|
+
};
|
|
22
|
+
this.storageManager = storageManager;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Initialize the VLAN manager and load persisted mappings
|
|
26
|
+
*/
|
|
27
|
+
async initialize() {
|
|
28
|
+
if (this.storageManager) {
|
|
29
|
+
await this.loadMappings();
|
|
30
|
+
}
|
|
31
|
+
logger.log('info', `VlanManager initialized with ${this.mappings.size} mappings, default VLAN: ${this.config.defaultVlan}`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Normalize a MAC address to lowercase with colons
|
|
35
|
+
* Accepts formats: 00:11:22:33:44:55, 00-11-22-33-44-55, 001122334455
|
|
36
|
+
*/
|
|
37
|
+
normalizeMac(mac) {
|
|
38
|
+
// Check cache first
|
|
39
|
+
const cached = this.normalizedMacCache.get(mac);
|
|
40
|
+
if (cached) {
|
|
41
|
+
return cached;
|
|
42
|
+
}
|
|
43
|
+
// Remove all separators and convert to lowercase
|
|
44
|
+
const cleaned = mac.toLowerCase().replace(/[-:]/g, '');
|
|
45
|
+
// Format with colons
|
|
46
|
+
const normalized = cleaned.match(/.{1,2}/g)?.join(':') || mac.toLowerCase();
|
|
47
|
+
// Cache the result
|
|
48
|
+
this.normalizedMacCache.set(mac, normalized);
|
|
49
|
+
// Prevent unbounded cache growth
|
|
50
|
+
if (this.normalizedMacCache.size > 10000) {
|
|
51
|
+
const iterator = this.normalizedMacCache.keys();
|
|
52
|
+
for (let i = 0; i < 1000; i++) {
|
|
53
|
+
this.normalizedMacCache.delete(iterator.next().value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return normalized;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a MAC address matches a pattern
|
|
60
|
+
* Supports:
|
|
61
|
+
* - Exact match: "00:11:22:33:44:55"
|
|
62
|
+
* - OUI match: "00:11:22" (matches any device with this vendor prefix)
|
|
63
|
+
* - Wildcard: "*" (matches all)
|
|
64
|
+
*/
|
|
65
|
+
macMatchesPattern(mac, pattern) {
|
|
66
|
+
const normalizedMac = this.normalizeMac(mac);
|
|
67
|
+
const normalizedPattern = this.normalizeMac(pattern);
|
|
68
|
+
// Wildcard matches all
|
|
69
|
+
if (pattern === '*') {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// Exact match
|
|
73
|
+
if (normalizedMac === normalizedPattern) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// OUI/prefix match (pattern is shorter than full MAC)
|
|
77
|
+
if (normalizedPattern.length < 17 && normalizedMac.startsWith(normalizedPattern)) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Add or update a MAC to VLAN mapping
|
|
84
|
+
*/
|
|
85
|
+
async addMapping(mapping) {
|
|
86
|
+
const normalizedMac = this.normalizeMac(mapping.mac);
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
const existingMapping = this.mappings.get(normalizedMac);
|
|
89
|
+
const fullMapping = {
|
|
90
|
+
...mapping,
|
|
91
|
+
mac: normalizedMac,
|
|
92
|
+
createdAt: existingMapping?.createdAt || now,
|
|
93
|
+
updatedAt: now,
|
|
94
|
+
};
|
|
95
|
+
this.mappings.set(normalizedMac, fullMapping);
|
|
96
|
+
// Persist to storage
|
|
97
|
+
if (this.storageManager) {
|
|
98
|
+
await this.saveMappings();
|
|
99
|
+
}
|
|
100
|
+
logger.log('info', `VLAN mapping ${existingMapping ? 'updated' : 'added'}: ${normalizedMac} -> VLAN ${mapping.vlan}`);
|
|
101
|
+
return fullMapping;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Remove a MAC to VLAN mapping
|
|
105
|
+
*/
|
|
106
|
+
async removeMapping(mac) {
|
|
107
|
+
const normalizedMac = this.normalizeMac(mac);
|
|
108
|
+
const removed = this.mappings.delete(normalizedMac);
|
|
109
|
+
if (removed && this.storageManager) {
|
|
110
|
+
await this.saveMappings();
|
|
111
|
+
logger.log('info', `VLAN mapping removed: ${normalizedMac}`);
|
|
112
|
+
}
|
|
113
|
+
return removed;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get a specific mapping by MAC
|
|
117
|
+
*/
|
|
118
|
+
getMapping(mac) {
|
|
119
|
+
return this.mappings.get(this.normalizeMac(mac));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get all mappings
|
|
123
|
+
*/
|
|
124
|
+
getAllMappings() {
|
|
125
|
+
return Array.from(this.mappings.values());
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Determine VLAN assignment for a MAC address
|
|
129
|
+
* Returns the most specific matching rule (exact > OUI > wildcard > default)
|
|
130
|
+
*/
|
|
131
|
+
assignVlan(mac) {
|
|
132
|
+
const normalizedMac = this.normalizeMac(mac);
|
|
133
|
+
// First, try exact match
|
|
134
|
+
const exactMatch = this.mappings.get(normalizedMac);
|
|
135
|
+
if (exactMatch && exactMatch.enabled) {
|
|
136
|
+
return {
|
|
137
|
+
assigned: true,
|
|
138
|
+
vlan: exactMatch.vlan,
|
|
139
|
+
matchedRule: exactMatch,
|
|
140
|
+
isDefault: false,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// Try OUI/prefix matches (sorted by specificity - longer patterns first)
|
|
144
|
+
const patternMatches = [];
|
|
145
|
+
for (const mapping of this.mappings.values()) {
|
|
146
|
+
if (mapping.enabled && mapping.mac !== normalizedMac && this.macMatchesPattern(normalizedMac, mapping.mac)) {
|
|
147
|
+
patternMatches.push(mapping);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Sort by pattern length (most specific first)
|
|
151
|
+
patternMatches.sort((a, b) => b.mac.length - a.mac.length);
|
|
152
|
+
if (patternMatches.length > 0) {
|
|
153
|
+
const bestMatch = patternMatches[0];
|
|
154
|
+
return {
|
|
155
|
+
assigned: true,
|
|
156
|
+
vlan: bestMatch.vlan,
|
|
157
|
+
matchedRule: bestMatch,
|
|
158
|
+
isDefault: false,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// No match - use default VLAN if allowed
|
|
162
|
+
if (this.config.allowUnknownMacs) {
|
|
163
|
+
return {
|
|
164
|
+
assigned: true,
|
|
165
|
+
vlan: this.config.defaultVlan,
|
|
166
|
+
isDefault: true,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// Unknown MAC and not allowed
|
|
170
|
+
return {
|
|
171
|
+
assigned: false,
|
|
172
|
+
vlan: 0,
|
|
173
|
+
isDefault: false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Bulk import mappings
|
|
178
|
+
*/
|
|
179
|
+
async importMappings(mappings) {
|
|
180
|
+
let imported = 0;
|
|
181
|
+
for (const mapping of mappings) {
|
|
182
|
+
await this.addMapping(mapping);
|
|
183
|
+
imported++;
|
|
184
|
+
}
|
|
185
|
+
logger.log('info', `Imported ${imported} VLAN mappings`);
|
|
186
|
+
return imported;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Export all mappings
|
|
190
|
+
*/
|
|
191
|
+
exportMappings() {
|
|
192
|
+
return this.getAllMappings();
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Update configuration
|
|
196
|
+
*/
|
|
197
|
+
updateConfig(config) {
|
|
198
|
+
if (config.defaultVlan !== undefined) {
|
|
199
|
+
this.config.defaultVlan = config.defaultVlan;
|
|
200
|
+
}
|
|
201
|
+
if (config.allowUnknownMacs !== undefined) {
|
|
202
|
+
this.config.allowUnknownMacs = config.allowUnknownMacs;
|
|
203
|
+
}
|
|
204
|
+
logger.log('info', `VlanManager config updated: defaultVlan=${this.config.defaultVlan}, allowUnknown=${this.config.allowUnknownMacs}`);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get current configuration
|
|
208
|
+
*/
|
|
209
|
+
getConfig() {
|
|
210
|
+
return { ...this.config };
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get statistics
|
|
214
|
+
*/
|
|
215
|
+
getStats() {
|
|
216
|
+
let exactMatches = 0;
|
|
217
|
+
let ouiPatterns = 0;
|
|
218
|
+
let wildcardPatterns = 0;
|
|
219
|
+
let enabledMappings = 0;
|
|
220
|
+
for (const mapping of this.mappings.values()) {
|
|
221
|
+
if (mapping.enabled) {
|
|
222
|
+
enabledMappings++;
|
|
223
|
+
}
|
|
224
|
+
if (mapping.mac === '*') {
|
|
225
|
+
wildcardPatterns++;
|
|
226
|
+
}
|
|
227
|
+
else if (mapping.mac.length < 17) {
|
|
228
|
+
// OUI patterns are shorter than full MAC (17 chars with colons)
|
|
229
|
+
ouiPatterns++;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
exactMatches++;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
totalMappings: this.mappings.size,
|
|
237
|
+
enabledMappings,
|
|
238
|
+
exactMatches,
|
|
239
|
+
ouiPatterns,
|
|
240
|
+
wildcardPatterns,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Load mappings from storage
|
|
245
|
+
*/
|
|
246
|
+
async loadMappings() {
|
|
247
|
+
if (!this.storageManager) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
const data = await this.storageManager.getJSON(this.config.storagePrefix);
|
|
252
|
+
if (data && Array.isArray(data)) {
|
|
253
|
+
for (const mapping of data) {
|
|
254
|
+
this.mappings.set(this.normalizeMac(mapping.mac), mapping);
|
|
255
|
+
}
|
|
256
|
+
logger.log('info', `Loaded ${data.length} VLAN mappings from storage`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
logger.log('warn', `Failed to load VLAN mappings from storage: ${error.message}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Save mappings to storage
|
|
265
|
+
*/
|
|
266
|
+
async saveMappings() {
|
|
267
|
+
if (!this.storageManager) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
const mappings = Array.from(this.mappings.values());
|
|
272
|
+
await this.storageManager.setJSON(this.config.storagePrefix, mappings);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
logger.log('error', `Failed to save VLAN mappings to storage: ${error.message}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52bGFuLm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yYWRpdXMvY2xhc3Nlcy52bGFuLm1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQStDdEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDZCxRQUFRLEdBQWlDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkQsTUFBTSxDQUErQjtJQUNyQyxjQUFjLENBQWtCO0lBRXhDLG1DQUFtQztJQUMzQixrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUU1RCxZQUFZLE1BQTJCLEVBQUUsY0FBK0I7UUFDdEUsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUM7WUFDckMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixJQUFJLElBQUk7WUFDbEQsYUFBYSxFQUFFLE1BQU0sRUFBRSxhQUFhLElBQUksdUJBQXVCO1NBQ2hFLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxnQ0FBZ0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLDRCQUE0QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDOUgsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxHQUFXO1FBQ3RCLG9CQUFvQjtR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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RADIUS module for DcRouter
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - MAC Authentication Bypass (MAB) for network device authentication
|
|
6
|
+
* - VLAN assignment based on MAC addresses
|
|
7
|
+
* - OUI (vendor prefix) pattern matching for device categorization
|
|
8
|
+
* - RADIUS accounting for session tracking and billing
|
|
9
|
+
* - Integration with StorageManager for persistence
|
|
10
|
+
*/
|
|
11
|
+
export * from './classes.radius.server.js';
|
|
12
|
+
export * from './classes.vlan.manager.js';
|
|
13
|
+
export * from './classes.accounting.manager.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RADIUS module for DcRouter
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - MAC Authentication Bypass (MAB) for network device authentication
|
|
6
|
+
* - VLAN assignment based on MAC addresses
|
|
7
|
+
* - OUI (vendor prefix) pattern matching for device categorization
|
|
8
|
+
* - RADIUS accounting for session tracking and billing
|
|
9
|
+
* - Integration with StorageManager for persistence
|
|
10
|
+
*/
|
|
11
|
+
export * from './classes.radius.server.js';
|
|
12
|
+
export * from './classes.vlan.manager.js';
|
|
13
|
+
export * from './classes.accounting.manager.js';
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yYWRpdXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsaUNBQWlDLENBQUMifQ==
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { StorageManager } from '../storage/classes.storagemanager.js';
|
|
2
|
+
import type { IRemoteIngress, IDcRouterRouteConfig } from '../../dist_ts_interfaces/data/remoteingress.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages CRUD for remote ingress edge registrations.
|
|
5
|
+
* Persists edge configs via StorageManager and provides
|
|
6
|
+
* the allowed edges list for the Rust hub.
|
|
7
|
+
*/
|
|
8
|
+
export declare class RemoteIngressManager {
|
|
9
|
+
private storageManager;
|
|
10
|
+
private edges;
|
|
11
|
+
private routes;
|
|
12
|
+
constructor(storageManager: StorageManager);
|
|
13
|
+
/**
|
|
14
|
+
* Load all edge registrations from storage into memory.
|
|
15
|
+
*/
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Store the current route configs for port derivation.
|
|
19
|
+
*/
|
|
20
|
+
setRoutes(routes: IDcRouterRouteConfig[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Derive listen ports for an edge from routes tagged with remoteIngress.enabled.
|
|
23
|
+
* When a route specifies edgeFilter, only edges whose id or tags match get that route's ports.
|
|
24
|
+
* When edgeFilter is absent, the route applies to all edges.
|
|
25
|
+
*/
|
|
26
|
+
derivePortsForEdge(edgeId: string, edgeTags?: string[]): number[];
|
|
27
|
+
/**
|
|
28
|
+
* Derive UDP listen ports for an edge from routes with transport 'udp' or 'all'.
|
|
29
|
+
* These ports need UDP listeners on the edge (e.g. for QUIC/HTTP3).
|
|
30
|
+
*/
|
|
31
|
+
deriveUdpPortsForEdge(edgeId: string, edgeTags?: string[]): number[];
|
|
32
|
+
/**
|
|
33
|
+
* Get the effective listen ports for an edge.
|
|
34
|
+
* Manual ports are always included. Auto-derived ports are added (union) when autoDerivePorts is true.
|
|
35
|
+
*/
|
|
36
|
+
getEffectiveListenPorts(edge: IRemoteIngress): number[];
|
|
37
|
+
/**
|
|
38
|
+
* Get the effective UDP listen ports for an edge.
|
|
39
|
+
* Manual UDP ports are always included. Auto-derived UDP ports are added when autoDerivePorts is true.
|
|
40
|
+
*/
|
|
41
|
+
getEffectiveListenPortsUdp(edge: IRemoteIngress): number[];
|
|
42
|
+
/**
|
|
43
|
+
* Get manual and derived port breakdown for an edge (used in API responses).
|
|
44
|
+
* Derived ports exclude any ports already present in the manual list.
|
|
45
|
+
*/
|
|
46
|
+
getPortBreakdown(edge: IRemoteIngress): {
|
|
47
|
+
manual: number[];
|
|
48
|
+
derived: number[];
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Create a new edge registration.
|
|
52
|
+
*/
|
|
53
|
+
createEdge(name: string, listenPorts?: number[], tags?: string[], autoDerivePorts?: boolean): Promise<IRemoteIngress>;
|
|
54
|
+
/**
|
|
55
|
+
* Get an edge by ID.
|
|
56
|
+
*/
|
|
57
|
+
getEdge(id: string): IRemoteIngress | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Get all edge registrations.
|
|
60
|
+
*/
|
|
61
|
+
getAllEdges(): IRemoteIngress[];
|
|
62
|
+
/**
|
|
63
|
+
* Update an edge registration.
|
|
64
|
+
*/
|
|
65
|
+
updateEdge(id: string, updates: {
|
|
66
|
+
name?: string;
|
|
67
|
+
listenPorts?: number[];
|
|
68
|
+
autoDerivePorts?: boolean;
|
|
69
|
+
enabled?: boolean;
|
|
70
|
+
tags?: string[];
|
|
71
|
+
}): Promise<IRemoteIngress | null>;
|
|
72
|
+
/**
|
|
73
|
+
* Delete an edge registration.
|
|
74
|
+
*/
|
|
75
|
+
deleteEdge(id: string): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Regenerate the secret for an edge.
|
|
78
|
+
*/
|
|
79
|
+
regenerateSecret(id: string): Promise<string | null>;
|
|
80
|
+
/**
|
|
81
|
+
* Verify an edge's secret using constant-time comparison.
|
|
82
|
+
*/
|
|
83
|
+
verifySecret(id: string, secret: string): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Get the list of allowed edges (enabled only) for the Rust hub.
|
|
86
|
+
* Includes listenPortsUdp when routes with transport 'udp' or 'all' are present.
|
|
87
|
+
*/
|
|
88
|
+
getAllowedEdges(): Array<{
|
|
89
|
+
id: string;
|
|
90
|
+
secret: string;
|
|
91
|
+
listenPorts: number[];
|
|
92
|
+
listenPortsUdp?: number[];
|
|
93
|
+
}>;
|
|
94
|
+
}
|