cmd/syncthing: Copy config on upgrade, instead of renaming (fixes #3525)

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3560
This commit is contained in:
Jakob Borg 2016-09-03 21:29:32 +00:00 committed by Audrius Butkevicius
parent 49910a1d85
commit 7990ffcc60

View File

@ -889,19 +889,32 @@ func loadOrCreateConfig() *config.Wrapper {
} }
func archiveAndSaveConfig(cfg *config.Wrapper) error { func archiveAndSaveConfig(cfg *config.Wrapper) error {
// To prevent previous config from being cleaned up, quickly touch it too // Copy the existing config to an archive copy
now := time.Now()
_ = os.Chtimes(cfg.ConfigPath(), now, now) // May return error on Android etc; no worries
archivePath := cfg.ConfigPath() + fmt.Sprintf(".v%d", cfg.Raw().OriginalVersion) archivePath := cfg.ConfigPath() + fmt.Sprintf(".v%d", cfg.Raw().OriginalVersion)
l.Infoln("Archiving a copy of old config file format at:", archivePath) l.Infoln("Archiving a copy of old config file format at:", archivePath)
if err := osutil.Rename(cfg.ConfigPath(), archivePath); err != nil { if err := copyFile(cfg.ConfigPath(), archivePath); err != nil {
return err return err
} }
// Do a regular atomic config sve
return cfg.Save() return cfg.Save()
} }
func copyFile(src, dst string) error {
bs, err := ioutil.ReadFile(src)
if err != nil {
return err
}
if err := ioutil.WriteFile(dst, bs, 0600); err != nil {
// Attempt to clean up
os.Remove(dst)
return err
}
return nil
}
func startAuditing(mainService *suture.Supervisor) { func startAuditing(mainService *suture.Supervisor) {
auditFile := timestampedLoc(locAuditLog) auditFile := timestampedLoc(locAuditLog)
fd, err := os.OpenFile(auditFile, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) fd, err := os.OpenFile(auditFile, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)