feat: installer fetched from the direct address sets it as the agent's own with the main one as fallback (and downloads from it); agents fall back to whichever address is not theirs; (direct) beside the connection status

This commit is contained in:
redtea committed 2026-10-15 11:34:58 +03:00
1 parent 021da93229
commit 79828e3f8a
11 files changed
+72 -25

No files matched your search

+2 -2
View File
@@ -319,7 +319,7 @@ func (a *Agent) pollOnce(ctx, reqCtx context.Context) error {
return err
}
a.applyTunnelHeader(ctx, resp.Header)
a.learnFallback(resp.Header.Get(proto.FallbackHeader))
a.learnAddrs(resp.Header.Get(proto.MainHeader), resp.Header.Get(proto.FallbackHeader))
a.applyTransport(resp.Header.Get(proto.TransportHeader))
a.dispatch(ctx, msg)
return nil
@@ -355,7 +355,7 @@ func (a *Agent) fetchConfig(ctx context.Context) bool {
}
defer resp.Body.Close()
a.applyTransport(resp.Header.Get(proto.TransportHeader))
a.learnFallback(resp.Header.Get(proto.FallbackHeader))
a.learnAddrs(resp.Header.Get(proto.MainHeader), resp.Header.Get(proto.FallbackHeader))
return a.applyTunnelHeader(ctx, resp.Header)
}
+12 -6
View File
@@ -54,10 +54,16 @@ func (a *Agent) fallback() string {
return a.state.Fallback
}
// learnFallback keeps the direct address the server tells.
func (a *Agent) learnFallback(v string) {
v = strings.TrimRight(strings.TrimSpace(v), "/")
if v == "" || a.cfg.Fallback != "" {
// learnAddrs keeps the server's other address from the two it tells: the
// direct one, or the main one when the agent was set to the direct one.
func (a *Agent) learnAddrs(main, direct string) {
main = strings.TrimRight(strings.TrimSpace(main), "/")
direct = strings.TrimRight(strings.TrimSpace(direct), "/")
v := direct
if direct != "" && strings.EqualFold(direct, a.cfg.Host) {
v = main
}
if v == "" || strings.EqualFold(v, a.cfg.Host) || a.cfg.Fallback != "" {
return
}
a.stateMu.Lock()
@@ -67,7 +73,7 @@ func (a *Agent) learnFallback(v string) {
}
a.stateMu.Unlock()
if !same {
log.Printf("direct address: %s", v)
log.Printf("fallback address: %s", v)
_ = a.saveState()
}
}
@@ -163,7 +169,7 @@ func (a *Agent) reachableAt(ctx context.Context, base string) bool {
}
resp.Body.Close()
if resp.StatusCode < 300 {
a.learnFallback(resp.Header.Get(proto.FallbackHeader))
a.learnAddrs(resp.Header.Get(proto.MainHeader), resp.Header.Get(proto.FallbackHeader))
return true
}
return false
+1 -1
View File
@@ -165,7 +165,7 @@ func (a *Agent) runWS(ctx context.Context) error {
}
case "cfg":
a.applyTunnelAddr(ctx, m.Tunnel)
a.learnFallback(m.Fallback)
a.learnAddrs(m.Main, m.Fallback)
a.applyTransport(m.Transport)
if a.mode() == proto.TransportLP {
return errors.New("set to long polling")