mirror of
https://github.com/henrygd/beszel.git
synced 2026-09-29 21:07:54 +02:00
fix(hub): preserve custom DNS resolvers when syncing monitors (#2448)
This commit is contained in:
@@ -100,9 +100,23 @@ func TestSSHNetworkMonitorReconnectSync(t *testing.T) {
|
||||
}()
|
||||
collection, err := app.FindCachedCollectionByNameOrId("network_monitors")
|
||||
require.NoError(t, err)
|
||||
probe := core.NewRecord(collection)
|
||||
probe.Load(map[string]any{"system": sys.Id, "target": "localhost", "protocol": "tcp", "port": 80, "interval": 60, "enabled": true})
|
||||
require.NoError(t, app.SaveNoValidate(probe))
|
||||
configs := []monitor.Config{
|
||||
{Target: "localhost", Protocol: "tcp", Port: 80, Interval: 60},
|
||||
{Target: "localhost", Protocol: "dns", Interval: 60},
|
||||
{Target: "localhost", Protocol: "dns", Server: "127.0.0.1:5353", Interval: 60},
|
||||
}
|
||||
var probes []*core.Record
|
||||
for i := range configs {
|
||||
cfg := &configs[i]
|
||||
probe := core.NewRecord(collection)
|
||||
probe.Load(map[string]any{
|
||||
"system": sys.Id, "target": cfg.Target, "protocol": cfg.Protocol,
|
||||
"port": cfg.Port, "server": cfg.Server, "interval": cfg.Interval, "enabled": true,
|
||||
})
|
||||
require.NoError(t, app.SaveNoValidate(probe))
|
||||
cfg.ID = probe.Id
|
||||
probes = append(probes, probe)
|
||||
}
|
||||
fetch := func() {
|
||||
t.Helper()
|
||||
_, err := sys.fetchDataFromAgent(common.DataRequestOptions{})
|
||||
@@ -120,7 +134,7 @@ func TestSSHNetworkMonitorReconnectSync(t *testing.T) {
|
||||
}
|
||||
}
|
||||
fetch()
|
||||
require.Equal(t, probe.Id, receive().Configs[0].ID)
|
||||
require.ElementsMatch(t, configs, receive().Configs)
|
||||
require.False(t, sys.monitorsNeedSync.Load())
|
||||
fetch()
|
||||
require.Empty(t, requests, "steady-state fetch must not resync")
|
||||
@@ -128,22 +142,24 @@ func TestSSHNetworkMonitorReconnectSync(t *testing.T) {
|
||||
// Simulate loss of the agent process/connection and its in-memory monitors.
|
||||
require.NoError(t, sys.client.Load().Close())
|
||||
fetch()
|
||||
require.Equal(t, probe.Id, receive().Configs[0].ID)
|
||||
require.ElementsMatch(t, configs, receive().Configs)
|
||||
require.False(t, sys.monitorsNeedSync.Load())
|
||||
|
||||
// Failed replacements are retried on the next successful stats fetch.
|
||||
require.NoError(t, sys.client.Load().Close())
|
||||
failSync.Store(true)
|
||||
fetch()
|
||||
receive()
|
||||
require.ElementsMatch(t, configs, receive().Configs)
|
||||
require.True(t, sys.monitorsNeedSync.Load())
|
||||
failSync.Store(false)
|
||||
fetch()
|
||||
receive()
|
||||
require.ElementsMatch(t, configs, receive().Configs)
|
||||
require.False(t, sys.monitorsNeedSync.Load())
|
||||
|
||||
probe.Set("enabled", false)
|
||||
require.NoError(t, app.SaveNoValidate(probe))
|
||||
for _, probe := range probes {
|
||||
probe.Set("enabled", false)
|
||||
require.NoError(t, app.SaveNoValidate(probe))
|
||||
}
|
||||
require.NoError(t, sys.client.Load().Close())
|
||||
fetch()
|
||||
require.Empty(t, receive().Configs, "empty replacement must clear stale monitors")
|
||||
|
||||
@@ -380,7 +380,7 @@ func (sm *SystemManager) resetFailedSmartFetchState(systemID string) {
|
||||
func (sm *SystemManager) GetMonitorConfigsForSystem(systemID string) ([]monitor.Config, error) {
|
||||
var configs []monitor.Config
|
||||
err := sm.hub.DB().
|
||||
NewQuery("SELECT id, target, protocol, port, interval FROM network_monitors WHERE system = {:system} AND enabled = true").
|
||||
NewQuery("SELECT id, target, protocol, port, interval, server FROM network_monitors WHERE system = {:system} AND enabled = true").
|
||||
Bind(dbx.Params{"system": systemID}).
|
||||
All(&configs)
|
||||
return configs, err
|
||||
|
||||
Reference in New Issue
Block a user