@serve.zone/dcrouter 8.0.0 → 9.1.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.
Files changed (88) hide show
  1. package/dist_serve/bundle.js +2420 -1227
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.d.ts +9 -0
  4. package/dist_ts/classes.dcrouter.js +27 -1
  5. package/dist_ts/config/classes.api-token-manager.d.ts +38 -0
  6. package/dist_ts/config/classes.api-token-manager.js +134 -0
  7. package/dist_ts/config/classes.route-config-manager.d.ts +35 -0
  8. package/dist_ts/config/classes.route-config-manager.js +231 -0
  9. package/dist_ts/config/index.d.ts +2 -0
  10. package/dist_ts/config/index.js +3 -1
  11. package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
  12. package/dist_ts/opsserver/classes.opsserver.js +5 -1
  13. package/dist_ts/opsserver/handlers/{config.handler.d.ts → api-token.handler.d.ts} +5 -2
  14. package/dist_ts/opsserver/handlers/api-token.handler.js +66 -0
  15. package/dist_ts/opsserver/handlers/index.d.ts +2 -0
  16. package/dist_ts/opsserver/handlers/index.js +3 -1
  17. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +13 -0
  18. package/dist_ts/opsserver/handlers/route-management.handler.js +117 -0
  19. package/dist_ts_interfaces/data/index.d.ts +1 -0
  20. package/dist_ts_interfaces/data/index.js +2 -1
  21. package/dist_ts_interfaces/data/route-management.d.ts +68 -0
  22. package/dist_ts_interfaces/data/route-management.js +2 -0
  23. package/dist_ts_interfaces/requests/api-tokens.d.ts +63 -0
  24. package/dist_ts_interfaces/requests/api-tokens.js +2 -0
  25. package/dist_ts_interfaces/requests/config.d.ts +77 -1
  26. package/dist_ts_interfaces/requests/index.d.ts +2 -0
  27. package/dist_ts_interfaces/requests/index.js +3 -1
  28. package/dist_ts_interfaces/requests/route-management.d.ts +114 -0
  29. package/dist_ts_interfaces/requests/route-management.js +2 -0
  30. package/dist_ts_web/00_commitinfo_data.js +1 -1
  31. package/dist_ts_web/appstate.d.ts +37 -1
  32. package/dist_ts_web/appstate.js +220 -2
  33. package/dist_ts_web/elements/index.d.ts +2 -0
  34. package/dist_ts_web/elements/index.js +3 -1
  35. package/dist_ts_web/elements/ops-dashboard.js +23 -3
  36. package/dist_ts_web/elements/ops-view-apitokens.d.ts +12 -0
  37. package/dist_ts_web/elements/ops-view-apitokens.js +310 -0
  38. package/dist_ts_web/elements/ops-view-config.d.ts +10 -8
  39. package/dist_ts_web/elements/ops-view-config.js +215 -297
  40. package/dist_ts_web/elements/ops-view-routes.d.ts +12 -0
  41. package/dist_ts_web/elements/ops-view-routes.js +404 -0
  42. package/dist_ts_web/router.d.ts +1 -1
  43. package/dist_ts_web/router.js +2 -2
  44. package/package.json +2 -2
  45. package/ts/00_commitinfo_data.ts +1 -1
  46. package/ts/classes.dcrouter.ts +37 -1
  47. package/ts/config/classes.api-token-manager.ts +155 -0
  48. package/ts/config/classes.route-config-manager.ts +271 -0
  49. package/ts/config/index.ts +3 -1
  50. package/ts/opsserver/classes.opsserver.ts +4 -0
  51. package/ts/opsserver/handlers/api-token.handler.ts +96 -0
  52. package/ts/opsserver/handlers/config.handler.ts +154 -72
  53. package/ts/opsserver/handlers/index.ts +3 -1
  54. package/ts/opsserver/handlers/route-management.handler.ts +163 -0
  55. package/ts_web/00_commitinfo_data.ts +1 -1
  56. package/ts_web/appstate.ts +309 -2
  57. package/ts_web/elements/index.ts +2 -0
  58. package/ts_web/elements/ops-dashboard.ts +22 -2
  59. package/ts_web/elements/ops-view-apitokens.ts +285 -0
  60. package/ts_web/elements/ops-view-config.ts +237 -299
  61. package/ts_web/elements/ops-view-routes.ts +389 -0
  62. package/ts_web/router.ts +1 -1
  63. package/dist_ts/cache/classes.cache.cleaner.d.ts +0 -47
  64. package/dist_ts/cache/classes.cache.cleaner.js +0 -130
  65. package/dist_ts/cache/classes.cached.document.d.ts +0 -76
  66. package/dist_ts/cache/classes.cached.document.js +0 -100
  67. package/dist_ts/cache/classes.cachedb.d.ts +0 -60
  68. package/dist_ts/cache/classes.cachedb.js +0 -126
  69. package/dist_ts/cache/documents/classes.cached.email.d.ts +0 -125
  70. package/dist_ts/cache/documents/classes.cached.email.js +0 -337
  71. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +0 -119
  72. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +0 -323
  73. package/dist_ts/cache/documents/index.d.ts +0 -2
  74. package/dist_ts/cache/documents/index.js +0 -3
  75. package/dist_ts/cache/index.d.ts +0 -4
  76. package/dist_ts/cache/index.js +0 -7
  77. package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
  78. package/dist_ts/monitoring/classes.metricscache.js +0 -63
  79. package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -31
  80. package/dist_ts/opsserver/handlers/admin.handler.js +0 -180
  81. package/dist_ts/opsserver/handlers/config.handler.js +0 -67
  82. package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -17
  83. package/dist_ts/opsserver/handlers/logs.handler.js +0 -215
  84. package/dist_ts/security/classes.securitylogger.js +0 -235
  85. package/dist_ts/storage/classes.storagemanager.d.ts +0 -82
  86. package/dist_ts/storage/classes.storagemanager.js +0 -344
  87. package/dist_ts/storage/index.d.ts +0 -1
  88. package/dist_ts/storage/index.js +0 -3
@@ -35,6 +35,7 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
35
35
  import * as plugins from '../plugins.js';
36
36
  import * as shared from './shared/index.js';
37
37
  import * as appstate from '../appstate.js';
38
+ import { appRouter } from '../router.js';
38
39
  import { DeesElement, customElement, html, state, css, cssManager, } from '@design.estate/dees-element';
39
40
  let OpsViewConfig = (() => {
40
41
  let _classDecorators = [customElement('ops-view-config')];
@@ -76,165 +77,19 @@ let OpsViewConfig = (() => {
76
77
  cssManager.defaultStyles,
77
78
  shared.viewHostCss,
78
79
  css `
79
- .configSection {
80
- background: ${cssManager.bdTheme('#fff', '#222')};
81
- border: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
82
- border-radius: 8px;
83
- margin-bottom: 24px;
84
- overflow: hidden;
85
- }
86
-
87
- .sectionHeader {
88
- background: ${cssManager.bdTheme('#f8f9fa', '#1a1a1a')};
89
- padding: 16px 24px;
90
- border-bottom: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
91
- display: flex;
92
- justify-content: space-between;
93
- align-items: center;
94
- }
95
-
96
- .sectionTitle {
97
- font-size: 18px;
98
- font-weight: 600;
99
- color: ${cssManager.bdTheme('#333', '#ccc')};
100
- display: flex;
101
- align-items: center;
102
- gap: 12px;
103
- }
104
-
105
- .sectionTitle dees-icon {
106
- font-size: 20px;
107
- color: ${cssManager.bdTheme('#666', '#888')};
108
- }
109
-
110
- .sectionContent {
111
- padding: 24px;
112
- }
113
-
114
- .configField {
115
- margin-bottom: 20px;
116
- }
117
-
118
- .configField:last-child {
119
- margin-bottom: 0;
120
- }
121
-
122
- .fieldLabel {
123
- font-size: 13px;
124
- font-weight: 600;
125
- color: ${cssManager.bdTheme('#666', '#999')};
126
- margin-bottom: 8px;
127
- display: block;
128
- text-transform: uppercase;
129
- letter-spacing: 0.5px;
130
- }
131
-
132
- .fieldValue {
133
- font-family: 'Consolas', 'Monaco', monospace;
134
- font-size: 14px;
135
- color: ${cssManager.bdTheme('#333', '#ccc')};
136
- background: ${cssManager.bdTheme('#f8f9fa', '#1a1a1a')};
137
- padding: 10px 14px;
138
- border-radius: 6px;
139
- border: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
140
- }
141
-
142
- .fieldValue.empty {
143
- color: ${cssManager.bdTheme('#999', '#666')};
144
- font-style: italic;
145
- }
146
-
147
- .nestedFields {
148
- margin-left: 16px;
149
- padding-left: 16px;
150
- border-left: 2px solid ${cssManager.bdTheme('#e9ecef', '#333')};
151
- }
152
-
153
- /* Status badge styles */
154
- .statusBadge {
155
- display: inline-flex;
156
- align-items: center;
157
- gap: 6px;
158
- padding: 4px 12px;
159
- border-radius: 20px;
160
- font-size: 13px;
161
- font-weight: 600;
162
- }
163
-
164
- .statusBadge.enabled {
165
- background: ${cssManager.bdTheme('#d4edda', '#1a3d1a')};
166
- color: ${cssManager.bdTheme('#155724', '#66cc66')};
167
- }
168
-
169
- .statusBadge.disabled {
170
- background: ${cssManager.bdTheme('#f8d7da', '#3d1a1a')};
171
- color: ${cssManager.bdTheme('#721c24', '#cc6666')};
172
- }
173
-
174
- .statusBadge dees-icon {
175
- font-size: 14px;
176
- }
177
-
178
- /* Array/list display */
179
- .arrayItems {
180
- display: flex;
181
- flex-wrap: wrap;
182
- gap: 8px;
183
- }
184
-
185
- .arrayItem {
186
- display: inline-flex;
187
- align-items: center;
188
- background: ${cssManager.bdTheme('#e7f3ff', '#1a2a3d')};
189
- color: ${cssManager.bdTheme('#0066cc', '#66aaff')};
190
- padding: 4px 12px;
191
- border-radius: 16px;
192
- font-size: 13px;
193
- font-family: 'Consolas', 'Monaco', monospace;
194
- }
195
-
196
- .arrayCount {
197
- font-size: 12px;
198
- color: ${cssManager.bdTheme('#999', '#666')};
199
- margin-bottom: 8px;
200
- }
201
-
202
- /* Numeric value formatting */
203
- .numericValue {
204
- font-weight: 600;
205
- color: ${cssManager.bdTheme('#0066cc', '#66aaff')};
206
- }
207
-
208
- .errorMessage {
209
- background: ${cssManager.bdTheme('#fee', '#4a1f1f')};
210
- border: 1px solid ${cssManager.bdTheme('#fcc', '#6a2f2f')};
211
- border-radius: 4px;
212
- padding: 16px;
213
- color: ${cssManager.bdTheme('#c00', '#ff6666')};
214
- margin: 16px 0;
215
- }
216
-
217
80
  .loadingMessage {
218
81
  text-align: center;
219
82
  padding: 40px;
220
- color: ${cssManager.bdTheme('#666', '#999')};
83
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
221
84
  }
222
85
 
223
- .infoNote {
224
- background: ${cssManager.bdTheme('#e7f3ff', '#1a2a3d')};
225
- border: 1px solid ${cssManager.bdTheme('#b3d7ff', '#2a4a6d')};
86
+ .errorMessage {
87
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239,68,68,0.1)')};
88
+ border: 1px solid ${cssManager.bdTheme('#fecaca', 'rgba(239,68,68,0.3)')};
226
89
  border-radius: 8px;
227
90
  padding: 16px;
228
- margin-bottom: 24px;
229
- color: ${cssManager.bdTheme('#004085', '#88ccff')};
230
- display: flex;
231
- align-items: center;
232
- gap: 12px;
233
- }
234
-
235
- .infoNote dees-icon {
236
- font-size: 20px;
237
- flex-shrink: 0;
91
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
92
+ margin: 16px 0;
238
93
  }
239
94
  `,
240
95
  ];
@@ -242,167 +97,230 @@ let OpsViewConfig = (() => {
242
97
  return html `
243
98
  <ops-sectionheading>Configuration</ops-sectionheading>
244
99
 
245
- ${this.configState.isLoading ? html `
246
- <div class="loadingMessage">
247
- <dees-spinner></dees-spinner>
248
- <p>Loading configuration...</p>
249
- </div>
250
- ` : this.configState.error ? html `
251
- <div class="errorMessage">
252
- Error loading configuration: ${this.configState.error}
253
- </div>
254
- ` : this.configState.config ? html `
255
- <div class="infoNote">
256
- <dees-icon icon="lucide:info"></dees-icon>
257
- <span>This view displays the current running configuration. DcRouter is configured through code or remote management.</span>
258
- </div>
259
-
260
- ${this.renderConfigSection('email', 'Email', 'lucide:mail', this.configState.config?.email)}
261
- ${this.renderConfigSection('dns', 'DNS', 'lucide:globe', this.configState.config?.dns)}
262
- ${this.renderConfigSection('proxy', 'Proxy', 'lucide:network', this.configState.config?.proxy)}
263
- ${this.renderConfigSection('security', 'Security', 'lucide:shield', this.configState.config?.security)}
264
- ` : html `
265
- <div class="errorMessage">No configuration loaded</div>
266
- `}
100
+ ${this.configState.isLoading
101
+ ? html `
102
+ <div class="loadingMessage">
103
+ <dees-spinner></dees-spinner>
104
+ <p>Loading configuration...</p>
105
+ </div>
106
+ `
107
+ : this.configState.error
108
+ ? html `
109
+ <div class="errorMessage">
110
+ Error loading configuration: ${this.configState.error}
111
+ </div>
112
+ `
113
+ : this.configState.config
114
+ ? this.renderConfig()
115
+ : html `<div class="errorMessage">No configuration loaded</div>`}
267
116
  `;
268
117
  }
269
- renderConfigSection(key, title, icon, config) {
270
- const isEnabled = config?.enabled ?? false;
118
+ renderConfig() {
119
+ const cfg = this.configState.config;
271
120
  return html `
272
- <div class="configSection">
273
- <div class="sectionHeader">
274
- <h3 class="sectionTitle">
275
- <dees-icon icon="${icon}"></dees-icon>
276
- ${title}
277
- </h3>
278
- ${this.renderStatusBadge(isEnabled)}
279
- </div>
280
- <div class="sectionContent">
281
- ${config ? this.renderConfigFields(config) : html `
282
- <div class="fieldValue empty">Not configured</div>
283
- `}
284
- </div>
285
- </div>
121
+ <sz-config-overview
122
+ infoText="This view displays the current running configuration. DcRouter is configured through code or remote management."
123
+ @navigate=${(e) => {
124
+ if (e.detail?.view) {
125
+ appRouter.navigateToView(e.detail.view);
126
+ }
127
+ }}
128
+ >
129
+ ${this.renderSystemSection(cfg.system)}
130
+ ${this.renderSmartProxySection(cfg.smartProxy)}
131
+ ${this.renderEmailSection(cfg.email)}
132
+ ${this.renderDnsSection(cfg.dns)}
133
+ ${this.renderTlsSection(cfg.tls)}
134
+ ${this.renderCacheSection(cfg.cache)}
135
+ ${this.renderRadiusSection(cfg.radius)}
136
+ ${this.renderRemoteIngressSection(cfg.remoteIngress)}
137
+ </sz-config-overview>
286
138
  `;
287
139
  }
288
- renderStatusBadge(enabled) {
289
- return enabled
290
- ? html `<span class="statusBadge enabled"><dees-icon icon="lucide:check"></dees-icon>Enabled</span>`
291
- : html `<span class="statusBadge disabled"><dees-icon icon="lucide:x"></dees-icon>Disabled</span>`;
140
+ renderSystemSection(sys) {
141
+ const fields = [
142
+ { key: 'Base Directory', value: sys.baseDir },
143
+ { key: 'Data Directory', value: sys.dataDir },
144
+ { key: 'Public IP', value: sys.publicIp },
145
+ { key: 'Proxy IPs', value: sys.proxyIps.length > 0 ? sys.proxyIps : null, type: 'pills' },
146
+ { key: 'Uptime', value: this.formatUptime(sys.uptime) },
147
+ { key: 'Storage Backend', value: sys.storageBackend, type: 'badge' },
148
+ { key: 'Storage Path', value: sys.storagePath },
149
+ ];
150
+ return html `
151
+ <sz-config-section
152
+ title="System"
153
+ subtitle="Base paths and infrastructure"
154
+ icon="lucide:server"
155
+ status="enabled"
156
+ .fields=${fields}
157
+ ></sz-config-section>
158
+ `;
292
159
  }
293
- renderConfigFields(config, prefix = '') {
294
- if (!config || typeof config !== 'object') {
295
- return html `<div class="fieldValue">${this.formatValue(config)}</div>`;
160
+ renderSmartProxySection(proxy) {
161
+ const fields = [
162
+ { key: 'Route Count', value: proxy.routeCount },
163
+ ];
164
+ if (proxy.acme) {
165
+ fields.push({ key: 'ACME Enabled', value: proxy.acme.enabled, type: 'boolean' }, { key: 'Account Email', value: proxy.acme.accountEmail || null }, { key: 'Use Production', value: proxy.acme.useProduction, type: 'boolean' }, { key: 'Auto Renew', value: proxy.acme.autoRenew, type: 'boolean' }, { key: 'Renew Threshold', value: `${proxy.acme.renewThresholdDays} days` });
296
166
  }
297
- return Object.entries(config).map(([key, value]) => {
298
- const fieldName = prefix ? `${prefix}.${key}` : key;
299
- const displayName = this.formatFieldName(key);
300
- // Handle boolean values with badges
301
- if (typeof value === 'boolean') {
302
- return html `
303
- <div class="configField">
304
- <label class="fieldLabel">${displayName}</label>
305
- ${this.renderStatusBadge(value)}
306
- </div>
307
- `;
308
- }
309
- // Handle arrays
310
- if (Array.isArray(value)) {
311
- return html `
312
- <div class="configField">
313
- <label class="fieldLabel">${displayName}</label>
314
- ${this.renderArrayValue(value, key)}
315
- </div>
316
- `;
317
- }
318
- // Handle nested objects
319
- if (typeof value === 'object' && value !== null) {
320
- return html `
321
- <div class="configField">
322
- <label class="fieldLabel">${displayName}</label>
323
- <div class="nestedFields">
324
- ${this.renderConfigFields(value, fieldName)}
325
- </div>
326
- </div>
327
- `;
328
- }
329
- // Handle primitive values
330
- return html `
331
- <div class="configField">
332
- <label class="fieldLabel">${displayName}</label>
333
- <div class="fieldValue">${this.formatValue(value, key)}</div>
334
- </div>
335
- `;
336
- });
167
+ const actions = [
168
+ { label: 'View Routes', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'routes' } },
169
+ ];
170
+ return html `
171
+ <sz-config-section
172
+ title="SmartProxy"
173
+ subtitle="HTTP/HTTPS and TCP/SNI reverse proxy"
174
+ icon="lucide:network"
175
+ .status=${proxy.enabled ? 'enabled' : 'disabled'}
176
+ .fields=${fields}
177
+ .actions=${actions}
178
+ ></sz-config-section>
179
+ `;
337
180
  }
338
- renderArrayValue(arr, fieldKey) {
339
- if (arr.length === 0) {
340
- return html `<div class="fieldValue empty">None configured</div>`;
341
- }
342
- // Determine if we should show as pills/tags
343
- const showAsPills = arr.every(item => typeof item === 'string' || typeof item === 'number');
344
- if (showAsPills) {
345
- const itemLabel = this.getArrayItemLabel(fieldKey, arr.length);
346
- return html `
347
- <div class="arrayCount">${arr.length} ${itemLabel}</div>
348
- <div class="arrayItems">
349
- ${arr.map(item => html `<span class="arrayItem">${item}</span>`)}
350
- </div>
351
- `;
181
+ renderEmailSection(email) {
182
+ const fields = [
183
+ { key: 'Ports', value: email.ports.length > 0 ? email.ports.map(String) : null, type: 'pills' },
184
+ { key: 'Hostname', value: email.hostname },
185
+ { key: 'Domains', value: email.domains.length > 0 ? email.domains : null, type: 'pills' },
186
+ { key: 'Email Routes', value: email.emailRouteCount },
187
+ { key: 'Received Emails Path', value: email.receivedEmailsPath },
188
+ ];
189
+ if (email.portMapping) {
190
+ const mappingStr = Object.entries(email.portMapping)
191
+ .map(([ext, int]) => `${ext} → ${int}`)
192
+ .join(', ');
193
+ fields.splice(1, 0, { key: 'Port Mapping', value: mappingStr, type: 'code' });
352
194
  }
353
- // For complex arrays, show as JSON
195
+ const actions = [
196
+ { label: 'View Emails', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'emails' } },
197
+ ];
354
198
  return html `
355
- <div class="fieldValue">
356
- ${arr.length} items configured
357
- </div>
199
+ <sz-config-section
200
+ title="Email Server"
201
+ subtitle="SMTP email handling with smartmta"
202
+ icon="lucide:mail"
203
+ .status=${email.enabled ? 'enabled' : 'disabled'}
204
+ .fields=${fields}
205
+ .actions=${actions}
206
+ ></sz-config-section>
358
207
  `;
359
208
  }
360
- getArrayItemLabel(fieldKey, count) {
361
- const labels = {
362
- ports: ['port', 'ports'],
363
- domains: ['domain', 'domains'],
364
- nameservers: ['nameserver', 'nameservers'],
365
- blockList: ['IP', 'IPs'],
366
- };
367
- const label = labels[fieldKey] || ['item', 'items'];
368
- return count === 1 ? label[0] : label[1];
209
+ renderDnsSection(dns) {
210
+ const fields = [
211
+ { key: 'Port', value: dns.port },
212
+ { key: 'NS Domains', value: dns.nsDomains.length > 0 ? dns.nsDomains : null, type: 'pills' },
213
+ { key: 'Scopes', value: dns.scopes.length > 0 ? dns.scopes : null, type: 'pills' },
214
+ { key: 'Record Count', value: dns.recordCount },
215
+ { key: 'DNS Challenge', value: dns.dnsChallenge, type: 'boolean' },
216
+ ];
217
+ return html `
218
+ <sz-config-section
219
+ title="DNS Server"
220
+ subtitle="Authoritative DNS with smartdns"
221
+ icon="lucide:globe"
222
+ .status=${dns.enabled ? 'enabled' : 'disabled'}
223
+ .fields=${fields}
224
+ ></sz-config-section>
225
+ `;
369
226
  }
370
- formatFieldName(key) {
371
- // Convert camelCase to readable format
372
- return key
373
- .replace(/([A-Z])/g, ' $1')
374
- .replace(/^./, str => str.toUpperCase())
375
- .trim();
227
+ renderTlsSection(tls) {
228
+ const fields = [
229
+ { key: 'Contact Email', value: tls.contactEmail },
230
+ { key: 'Domain', value: tls.domain },
231
+ { key: 'Source', value: tls.source, type: 'badge' },
232
+ { key: 'Certificate Path', value: tls.certPath },
233
+ { key: 'Key Path', value: tls.keyPath },
234
+ ];
235
+ const status = tls.source === 'none' ? 'not-configured' : 'enabled';
236
+ const actions = [
237
+ { label: 'View Certificates', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'certificates' } },
238
+ ];
239
+ return html `
240
+ <sz-config-section
241
+ title="TLS / Certificates"
242
+ subtitle="Certificate management and ACME"
243
+ icon="lucide:shield-check"
244
+ .status=${status}
245
+ .fields=${fields}
246
+ .actions=${actions}
247
+ ></sz-config-section>
248
+ `;
376
249
  }
377
- formatValue(value, fieldKey) {
378
- if (value === null || value === undefined) {
379
- return html `<span class="empty">Not set</span>`;
380
- }
381
- if (typeof value === 'number') {
382
- // Format bytes
383
- if (fieldKey?.toLowerCase().includes('size') || fieldKey?.toLowerCase().includes('bytes')) {
384
- return html `<span class="numericValue">${this.formatBytes(value)}</span>`;
385
- }
386
- // Format time values
387
- if (fieldKey?.toLowerCase().includes('ttl') || fieldKey?.toLowerCase().includes('timeout')) {
388
- return html `<span class="numericValue">${value} seconds</span>`;
389
- }
390
- // Format port numbers
391
- if (fieldKey?.toLowerCase().includes('port')) {
392
- return html `<span class="numericValue">${value}</span>`;
250
+ renderCacheSection(cache) {
251
+ const fields = [
252
+ { key: 'Storage Path', value: cache.storagePath },
253
+ { key: 'DB Name', value: cache.dbName },
254
+ { key: 'Default TTL', value: `${cache.defaultTTLDays} days` },
255
+ { key: 'Cleanup Interval', value: `${cache.cleanupIntervalHours} hours` },
256
+ ];
257
+ if (cache.ttlConfig && Object.keys(cache.ttlConfig).length > 0) {
258
+ for (const [key, val] of Object.entries(cache.ttlConfig)) {
259
+ fields.push({ key: `TTL: ${key}`, value: `${val} days` });
393
260
  }
394
- // Format counts with separators
395
- return html `<span class="numericValue">${value.toLocaleString()}</span>`;
396
261
  }
397
- return String(value);
262
+ return html `
263
+ <sz-config-section
264
+ title="Cache Database"
265
+ subtitle="Persistent caching with smartdata"
266
+ icon="lucide:database"
267
+ .status=${cache.enabled ? 'enabled' : 'disabled'}
268
+ .fields=${fields}
269
+ ></sz-config-section>
270
+ `;
271
+ }
272
+ renderRadiusSection(radius) {
273
+ const fields = [
274
+ { key: 'Auth Port', value: radius.authPort },
275
+ { key: 'Accounting Port', value: radius.acctPort },
276
+ { key: 'Bind Address', value: radius.bindAddress },
277
+ { key: 'Client Count', value: radius.clientCount },
278
+ ];
279
+ if (radius.vlanDefaultVlan !== null) {
280
+ fields.push({ key: 'Default VLAN', value: radius.vlanDefaultVlan }, { key: 'Allow Unknown MACs', value: radius.vlanAllowUnknownMacs, type: 'boolean' }, { key: 'VLAN Mappings', value: radius.vlanMappingCount });
281
+ }
282
+ const status = radius.enabled ? 'enabled' : 'not-configured';
283
+ return html `
284
+ <sz-config-section
285
+ title="RADIUS Server"
286
+ subtitle="Network authentication and VLAN assignment"
287
+ icon="lucide:wifi"
288
+ .status=${status}
289
+ .fields=${fields}
290
+ ></sz-config-section>
291
+ `;
292
+ }
293
+ renderRemoteIngressSection(ri) {
294
+ const fields = [
295
+ { key: 'Tunnel Port', value: ri.tunnelPort },
296
+ { key: 'Hub Domain', value: ri.hubDomain },
297
+ { key: 'TLS Configured', value: ri.tlsConfigured, type: 'boolean' },
298
+ ];
299
+ const actions = [
300
+ { label: 'View Remote Ingress', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'remoteingress' } },
301
+ ];
302
+ return html `
303
+ <sz-config-section
304
+ title="Remote Ingress"
305
+ subtitle="Edge tunnel nodes"
306
+ icon="lucide:cloud"
307
+ .status=${ri.enabled ? 'enabled' : 'disabled'}
308
+ .fields=${fields}
309
+ .actions=${actions}
310
+ ></sz-config-section>
311
+ `;
398
312
  }
399
- formatBytes(bytes) {
400
- if (bytes === 0)
401
- return '0 B';
402
- const k = 1024;
403
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
404
- const i = Math.floor(Math.log(bytes) / Math.log(k));
405
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
313
+ formatUptime(seconds) {
314
+ const days = Math.floor(seconds / 86400);
315
+ const hours = Math.floor((seconds % 86400) / 3600);
316
+ const mins = Math.floor((seconds % 3600) / 60);
317
+ const parts = [];
318
+ if (days > 0)
319
+ parts.push(`${days}d`);
320
+ if (hours > 0)
321
+ parts.push(`${hours}h`);
322
+ parts.push(`${mins}m`);
323
+ return parts.join(' ');
406
324
  }
407
325
  static {
408
326
  __runInitializers(_classThis, _classExtraInitializers);
@@ -411,4 +329,4 @@ let OpsViewConfig = (() => {
411
329
  return OpsViewConfig = _classThis;
412
330
  })();
413
331
  export { OpsViewConfig };
414
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL29wcy12aWV3LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsR0FFWCxNQUFNLDZCQUE2QixDQUFDO0lBR3hCLGFBQWE7NEJBRHpCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7OzZCQUFuQixTQUFRLFdBQVc7Ozs7dUNBQzNDLEtBQUssRUFBRTtZQUNSLHNMQUFTLFdBQVcsNkJBQVgsV0FBVyxpR0FJbEI7WUFOSiw2S0FrWEM7Ozs7UUFoWEMsbUZBQThDO1lBQzVDLE1BQU0sRUFBRSxJQUFJO1lBQ1osU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFFLElBQUk7U0FDWixFQUFDO1FBSkYsSUFBUyxXQUFXLGlEQUlsQjtRQUpGLElBQVMsV0FBVyx1REFJbEI7UUFFRjtZQUNFLEtBQUssRUFBRSxDQUFDOztZQUNSLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlO2lCQUMxQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENB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
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL29wcy12aWV3LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsT0FBTyxFQUNMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsSUFBSSxFQUNKLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxHQUVYLE1BQU0sNkJBQTZCLENBQUM7SUFLeEIsYUFBYTs0QkFEekIsYUFBYSxDQUFDLGlCQUFpQixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7NkJBQW5CLFNBQVEsV0FBVzs7Ozt1Q0FDM0MsS0FBSyxFQUFFO1lBQ1Isc0xBQVMsV0FBVyw2QkFBWCxXQUFXLGlHQUlsQjtZQU5KLDZLQWlUQzs7OztRQS9TQyxtRkFBOEM7WUFDNUMsTUFBTSxFQUFFLElBQUk7WUFDWixTQUFTLEVBQUUsS0FBSztZQUNoQixLQUFLLEVBQUUsSUFBSTtTQUNaLEVBQUM7UUFKRixJQUFTLFdBQVcsaURBSWxCO1FBSkYsSUFBUyxXQUFXLHVEQUlsQjtRQUVGO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGVBQWU7aUJBQzFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDO2lCQUM5QixTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7WUFDTCxJ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
@@ -0,0 +1,12 @@
1
+ import * as appstate from '../appstate.js';
2
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
3
+ export declare class OpsViewRoutes extends DeesElement {
4
+ accessor routeState: appstate.IRouteManagementState;
5
+ constructor();
6
+ static styles: import("@design.estate/dees-element").CSSResult[];
7
+ render(): TemplateResult;
8
+ private handleRouteClick;
9
+ private showCreateRouteDialog;
10
+ private refreshData;
11
+ firstUpdated(): Promise<void>;
12
+ }