From d54c366150d10dc36ad38c23dbc1055a457500c7 Mon Sep 17 00:00:00 2001 From: Lode Hoste Date: Thu, 30 Apr 2015 21:33:32 +0200 Subject: [PATCH] Upgrade running Syncthing instances (fixes #1692) --- cmd/syncthing/main.go | 46 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 82291ad3..7e54a207 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -10,6 +10,7 @@ import ( "crypto/tls" "flag" "fmt" + "io/ioutil" "log" "net" "net/http" @@ -349,7 +350,13 @@ func main() { // Use leveldb database locks to protect against concurrent upgrades _, err = leveldb.OpenFile(locations[locDatabase], &opt.Options{OpenFilesCacheCapacity: 100}) if err != nil { - l.Fatalln("Cannot upgrade, database seems to be locked. Is another copy of Syncthing already running?") + l.Infoln("Attempting upgrade through running Syncthing...") + err = upgradeViaRest() + if err != nil { + l.Fatalln("Upgrade:", err) + } + l.Okln("Syncthing upgrading") + return } err = upgrade.To(rel) @@ -374,6 +381,43 @@ func main() { } } +func upgradeViaRest() error { + cfg, err := config.Load(locations[locConfigFile], protocol.LocalDeviceID) + if err != nil { + return err + } + target := cfg.GUI().Address + if cfg.GUI().UseTLS { + target = "https://" + target + } else { + target = "http://" + target + } + r, _ := http.NewRequest("POST", target+"/rest/system/upgrade", nil) + r.Header.Set("X-API-Key", cfg.GUI().APIKey) + + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + client := &http.Client{ + Transport: tr, + Timeout: 60 * time.Second, + } + resp, err := client.Do(r) + if err != nil { + return err + } + if resp.StatusCode != 200 { + bs, err := ioutil.ReadAll(resp.Body) + defer resp.Body.Close() + if err != nil { + return err + } + return errors.New(string(bs)) + } + + return err +} + func syncthingMain() { // Create a main service manager. We'll add things to this as we go along. // We want any logging it does to go through our log system, with INFO