diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 3b64df6f..ccece35a 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -620,6 +620,10 @@ nextFolder: go standbyMonitor() } + if cfg.Options.AutoUpgradeIntervalH > 0 { + go autoUpgrade() + } + events.Default.Log(events.StartupComplete, nil) go generateEvents() @@ -1172,3 +1176,36 @@ func standbyMonitor() { now = time.Now() } } + +func autoUpgrade() { + var skipped bool + interval := time.Duration(cfg.Options.AutoUpgradeIntervalH) * time.Hour + for { + if skipped { + time.Sleep(interval) + } else { + skipped = true + } + + rel, err := upgrade.LatestRelease(strings.Contains(Version, "-beta")) + if err != nil { + l.Warnln("Automatic upgrade:", err) + continue + } + + if upgrade.CompareVersions(rel.Tag, Version) <= 0 { + continue + } + + l.Infof("Automatic upgrade (current %q < latest %q)", Version, rel.Tag) + err = upgrade.UpgradeTo(rel, GoArchExtra) + if err != nil { + l.Warnln("Automatic upgrade:", err) + continue + } + l.Warnf("Automatically upgraded to version %q. Restarting in 1 minute.", rel.Tag) + time.Sleep(time.Minute) + stop <- exitUpgrading + return + } +} diff --git a/internal/config/config.go b/internal/config/config.go index 783aafc2..bb831c03 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -118,21 +118,22 @@ type FolderDeviceConfiguration struct { } type OptionsConfiguration struct { - ListenAddress []string `xml:"listenAddress" default:"0.0.0.0:22000"` - GlobalAnnServer string `xml:"globalAnnounceServer" default:"announce.syncthing.net:22026"` - GlobalAnnEnabled bool `xml:"globalAnnounceEnabled" default:"true"` - LocalAnnEnabled bool `xml:"localAnnounceEnabled" default:"true"` - LocalAnnPort int `xml:"localAnnouncePort" default:"21025"` - LocalAnnMCAddr string `xml:"localAnnounceMCAddr" default:"[ff32::5222]:21026"` - MaxSendKbps int `xml:"maxSendKbps"` - MaxRecvKbps int `xml:"maxRecvKbps"` - ReconnectIntervalS int `xml:"reconnectionIntervalS" default:"60"` - StartBrowser bool `xml:"startBrowser" default:"true"` - UPnPEnabled bool `xml:"upnpEnabled" default:"true"` - UPnPLease int `xml:"upnpLeaseMinutes" default:"0"` - UPnPRenewal int `xml:"upnpRenewalMinutes" default:"30"` - URAccepted int `xml:"urAccepted"` // Accepted usage reporting version; 0 for off (undecided), -1 for off (permanently) - RestartOnWakeup bool `xml:"restartOnWakeup" default:"true"` + ListenAddress []string `xml:"listenAddress" default:"0.0.0.0:22000"` + GlobalAnnServer string `xml:"globalAnnounceServer" default:"announce.syncthing.net:22026"` + GlobalAnnEnabled bool `xml:"globalAnnounceEnabled" default:"true"` + LocalAnnEnabled bool `xml:"localAnnounceEnabled" default:"true"` + LocalAnnPort int `xml:"localAnnouncePort" default:"21025"` + LocalAnnMCAddr string `xml:"localAnnounceMCAddr" default:"[ff32::5222]:21026"` + MaxSendKbps int `xml:"maxSendKbps"` + MaxRecvKbps int `xml:"maxRecvKbps"` + ReconnectIntervalS int `xml:"reconnectionIntervalS" default:"60"` + StartBrowser bool `xml:"startBrowser" default:"true"` + UPnPEnabled bool `xml:"upnpEnabled" default:"true"` + UPnPLease int `xml:"upnpLeaseMinutes" default:"0"` + UPnPRenewal int `xml:"upnpRenewalMinutes" default:"30"` + URAccepted int `xml:"urAccepted"` // Accepted usage reporting version; 0 for off (undecided), -1 for off (permanently) + RestartOnWakeup bool `xml:"restartOnWakeup" default:"true"` + AutoUpgradeIntervalH int `xml:"autoUpgradeIntervalH" default:"12"` // 0 for off Deprecated_RescanIntervalS int `xml:"rescanIntervalS,omitempty" json:"-"` Deprecated_UREnabled bool `xml:"urEnabled,omitempty" json:"-"`