diff --git a/cmd/syncthing/connections.go b/cmd/syncthing/connections.go index d881729da..2ad8e86c8 100644 --- a/cmd/syncthing/connections.go +++ b/cmd/syncthing/connections.go @@ -45,8 +45,9 @@ type connectionSvc struct { lastRelayCheck map[protocol.DeviceID]time.Time - mut sync.RWMutex - connType map[protocol.DeviceID]model.ConnectionType + mut sync.RWMutex + connType map[protocol.DeviceID]model.ConnectionType + relaysEnabled bool } func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Model, tlsCfg *tls.Config) *connectionSvc { @@ -59,6 +60,7 @@ func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Mo conns: make(chan model.IntermediateConnection), connType: make(map[protocol.DeviceID]model.ConnectionType), + relaysEnabled: cfg.Options().RelaysEnabled, lastRelayCheck: make(map[protocol.DeviceID]time.Time), } cfg.Subscribe(svc) @@ -239,6 +241,7 @@ func (s *connectionSvc) connect() { s.mut.RLock() ct, ok := s.connType[deviceID] + relaysEnabled := s.relaysEnabled s.mut.RUnlock() if connected && ok && ct.IsDirect() { continue @@ -296,7 +299,8 @@ func (s *connectionSvc) connect() { // Also, do not set lastRelayCheck time if we have no relays, // as otherwise when we do discover relays, we might have to // wait up to RelayReconnectIntervalM to connect again. - if connected || len(relays) == 0 { + // Also, do not try relays if we are explicitly told not to. + if connected || len(relays) == 0 || !relaysEnabled { continue nextDevice } @@ -394,6 +398,10 @@ func (s *connectionSvc) VerifyConfiguration(from, to config.Configuration) error } func (s *connectionSvc) CommitConfiguration(from, to config.Configuration) bool { + s.mut.Lock() + s.relaysEnabled = to.Options.RelaysEnabled + s.mut.Unlock() + // We require a restart if a device as been removed. newDevices := make(map[protocol.DeviceID]bool, len(to.Devices)) diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 6409c9da1..bc18cdaf7 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -676,7 +676,7 @@ func syncthingMain() { connectionSvc := newConnectionSvc(cfg, myID, m, tlsCfg) mainSvc.Add(connectionSvc) - if opts.GlobalAnnEnabled || opts.RelayWithoutGlobalAnn { + if opts.RelaysEnabled && (opts.GlobalAnnEnabled || opts.RelayWithoutGlobalAnn) { relaySvc = relay.NewSvc(cfg, tlsCfg, connectionSvc.conns) connectionSvc.Add(relaySvc) } diff --git a/lib/config/config.go b/lib/config/config.go index 289ba1569..40ebdf655 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -223,6 +223,7 @@ type OptionsConfiguration struct { MaxSendKbps int `xml:"maxSendKbps" json:"maxSendKbps"` MaxRecvKbps int `xml:"maxRecvKbps" json:"maxRecvKbps"` ReconnectIntervalS int `xml:"reconnectionIntervalS" json:"reconnectionIntervalS" default:"60"` + RelaysEnabled bool `xml:"relaysEnabled" json:"relaysEnabled" default:"true"` RelayReconnectIntervalM int `xml:"relayReconnectIntervalM" json:"relayReconnectIntervalM" default:"10"` RelayWithoutGlobalAnn bool `xml:"relayWithoutGlobalAnn" json:"relayWithoutGlobalAnn" default:"false"` StartBrowser bool `xml:"startBrowser" json:"startBrowser" default:"true"` diff --git a/lib/config/config_test.go b/lib/config/config_test.go index ac741e518..06fbe9f3a 100644 --- a/lib/config/config_test.go +++ b/lib/config/config_test.go @@ -41,6 +41,7 @@ func TestDefaultValues(t *testing.T) { MaxSendKbps: 0, MaxRecvKbps: 0, ReconnectIntervalS: 60, + RelaysEnabled: true, RelayReconnectIntervalM: 10, RelayWithoutGlobalAnn: false, StartBrowser: true, @@ -155,6 +156,7 @@ func TestOverriddenValues(t *testing.T) { MaxSendKbps: 1234, MaxRecvKbps: 2341, ReconnectIntervalS: 6000, + RelaysEnabled: false, RelayReconnectIntervalM: 20, RelayWithoutGlobalAnn: true, StartBrowser: false, diff --git a/lib/config/testdata/overridenvalues.xml b/lib/config/testdata/overridenvalues.xml index c9e06e530..41a08154c 100755 --- a/lib/config/testdata/overridenvalues.xml +++ b/lib/config/testdata/overridenvalues.xml @@ -13,6 +13,7 @@ 1234 2341 6000 + false 20 true false