Просмотр исходного кода

支持网络就绪后迁移Dashboard监听

samien 2 месяцев назад
Родитель
Сommit
84f0469ec8
2 измененных файлов с 33 добавлено и 5 удалено
  1. 7 4
      src/server/dashboardSupervisor.ts
  2. 26 1
      tests/server/dashboardSupervisor.test.ts

+ 7 - 4
src/server/dashboardSupervisor.ts

@@ -22,6 +22,7 @@ export interface DashboardSupervisorOptions {
   launch?: Launch
   probe?: Probe
   lanProbeHost?: string
+  resolveLanProbeHost?: () => string | undefined
   log?: (message: string) => void
   credentials?: { username: string; password: string }
 }
@@ -81,7 +82,7 @@ export class DashboardSupervisor {
   private readonly launch: Launch
   private readonly probe: Probe
   private readonly allowLan: boolean
-  private readonly lanProbeHost: string | undefined
+  private readonly resolveLanProbeHost: () => string | undefined
   private readonly log: (message: string) => void
   private readonly intervalMs: number
   private readonly credentials: { username: string; password: string }
@@ -95,7 +96,8 @@ export class DashboardSupervisor {
     this.run = options.run ?? defaultRun(this.command)
     this.launch = options.launch ?? defaultLaunch(this.command)
     this.probe = options.probe ?? portIsListening
-    this.lanProbeHost = options.lanProbeHost ?? privateLanAddress()
+    this.resolveLanProbeHost = options.resolveLanProbeHost
+      ?? (() => options.lanProbeHost ?? privateLanAddress())
     this.log = options.log ?? console.info
     this.intervalMs = options.intervalMs ?? SUPERVISION_INTERVAL_MS
     this.credentials = options.credentials ?? {
@@ -153,8 +155,9 @@ export class DashboardSupervisor {
   }
 
   private async bindingMatches(): Promise<boolean> {
-    if (!this.lanProbeHost) return true
-    const listeningOnLan = await this.probe(this.lanProbeHost, DASHBOARD_PORT)
+    const lanProbeHost = this.resolveLanProbeHost()
+    if (!lanProbeHost) return true
+    const listeningOnLan = await this.probe(lanProbeHost, DASHBOARD_PORT)
     return this.allowLan ? listeningOnLan : !listeningOnLan
   }
 

+ 26 - 1
tests/server/dashboardSupervisor.test.ts

@@ -9,6 +9,7 @@ function supervisor(overrides: {
   running?: boolean
   runningHost?: '127.0.0.1' | '0.0.0.0'
   allowLan?: boolean
+  resolveLanProbeHost?: () => string | undefined
 } = {}) {
   const values = { ...overrides.values }
   let running = overrides.running ?? false
@@ -18,7 +19,8 @@ function supervisor(overrides: {
   const launches: string[][] = []
   const instance = new DashboardSupervisor({
     allowLan: overrides.allowLan ?? false,
-    lanProbeHost,
+    lanProbeHost: overrides.resolveLanProbeHost ? undefined : lanProbeHost,
+    resolveLanProbeHost: overrides.resolveLanProbeHost,
     run(args) {
       calls.push([...args])
       if (args[0] === 'config' && args[1] === 'get') return values[args[2]] ?? ''
@@ -114,6 +116,29 @@ describe('DashboardSupervisor', () => {
     expect(value.launches).toEqual([['dashboard', '--host', '127.0.0.1', '--no-open']])
   })
 
+  it('rechecks LAN binding after the network interface becomes available', async () => {
+    let networkReady = false
+    const value = supervisor({
+      running: true,
+      runningHost: '127.0.0.1',
+      allowLan: true,
+      resolveLanProbeHost: () => networkReady ? '192.168.1.20' : undefined,
+      values: {
+        'dashboard.basic_auth.username': 'operator',
+        'dashboard.basic_auth.password_hash': 'scrypt$existing',
+        'dashboard.basic_auth.secret': 'configured-secret',
+      },
+    })
+
+    await value.instance.checkNow()
+    expect(value.launches).toEqual([])
+
+    networkReady = true
+    await value.instance.checkNow()
+    expect(value.calls).toContainEqual(['dashboard', '--stop'])
+    expect(value.launches).toEqual([['dashboard', '--host', '0.0.0.0', '--no-open']])
+  })
+
   it('explicitly restarts a healthy dashboard and waits for 9119 to return', async () => {
     const value = supervisor({
       running: true,