mirror of
https://github.com/rclone/rclone.git
synced 2024-11-26 10:25:03 +01:00
oauthutil: Reload config file off disk before updating token
This fixes the config file being overwritten when two rclones are running. Fixes #682
This commit is contained in:
parent
473bdad00b
commit
1b2dda8c4c
43
fs/config.go
43
fs/config.go
@ -377,8 +377,11 @@ func LoadConfig() {
|
|||||||
// Load configuration file.
|
// Load configuration file.
|
||||||
var err error
|
var err error
|
||||||
ConfigFile, err = loadConfigFile()
|
ConfigFile, err = loadConfigFile()
|
||||||
if err != nil {
|
if err == errorConfigFileNotFound {
|
||||||
log.Fatalf("Failed to config file \"%s\": %v", ConfigPath, err)
|
Log(nil, "Config file %q not found - using defaults", ConfigPath)
|
||||||
|
ConfigFile, _ = goconfig.LoadFromReader(&bytes.Buffer{})
|
||||||
|
} else if err != nil {
|
||||||
|
log.Fatalf("Failed to load config file %q: %v", ConfigPath, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load filters
|
// Load filters
|
||||||
@ -391,13 +394,17 @@ func LoadConfig() {
|
|||||||
startTokenBucket()
|
startTokenBucket()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var errorConfigFileNotFound = errors.New("config file not found")
|
||||||
|
|
||||||
// loadConfigFile will load a config file, and
|
// loadConfigFile will load a config file, and
|
||||||
// automatically decrypt it.
|
// automatically decrypt it.
|
||||||
func loadConfigFile() (*goconfig.ConfigFile, error) {
|
func loadConfigFile() (*goconfig.ConfigFile, error) {
|
||||||
b, err := ioutil.ReadFile(ConfigPath)
|
b, err := ioutil.ReadFile(ConfigPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Log(nil, "Failed to load config file \"%v\" - using defaults: %v", ConfigPath, err)
|
if os.IsNotExist(err) {
|
||||||
return goconfig.LoadFromReader(&bytes.Buffer{})
|
return nil, errorConfigFileNotFound
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find first non-empty line
|
// Find first non-empty line
|
||||||
@ -622,6 +629,34 @@ func SaveConfig() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfigSetValueAndSave sets the key to the value and saves just that
|
||||||
|
// value in the config file. It loads the old config file in from
|
||||||
|
// disk first and overwrites the given value only.
|
||||||
|
func ConfigSetValueAndSave(name, key, value string) (err error) {
|
||||||
|
// Set the value in config in case we fail to reload it
|
||||||
|
ConfigFile.SetValue(name, key, value)
|
||||||
|
// Reload the config file
|
||||||
|
reloadedConfigFile, err := loadConfigFile()
|
||||||
|
if err == errorConfigFileNotFound {
|
||||||
|
// Config file not written yet so ignore reload
|
||||||
|
return nil
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = reloadedConfigFile.GetSection(name)
|
||||||
|
if err != nil {
|
||||||
|
// Section doesn't exist yet so ignore reload
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Update the config file with the reloaded version
|
||||||
|
ConfigFile = reloadedConfigFile
|
||||||
|
// Set the value in the reloaded version
|
||||||
|
reloadedConfigFile.SetValue(name, key, value)
|
||||||
|
// Save it again
|
||||||
|
SaveConfig()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ShowRemotes shows an overview of the config file
|
// ShowRemotes shows an overview of the config file
|
||||||
func ShowRemotes() {
|
func ShowRemotes() {
|
||||||
remotes := ConfigFile.GetSectionList()
|
remotes := ConfigFile.GetSectionList()
|
||||||
|
@ -99,9 +99,12 @@ func putToken(name string, token *oauth2.Token) error {
|
|||||||
tokenString := string(tokenBytes)
|
tokenString := string(tokenBytes)
|
||||||
old := fs.ConfigFile.MustValue(name, fs.ConfigToken)
|
old := fs.ConfigFile.MustValue(name, fs.ConfigToken)
|
||||||
if tokenString != old {
|
if tokenString != old {
|
||||||
fs.ConfigFile.SetValue(name, fs.ConfigToken, tokenString)
|
err = fs.ConfigSetValueAndSave(name, fs.ConfigToken, tokenString)
|
||||||
fs.SaveConfig()
|
if err != nil {
|
||||||
fs.Debug(name, "Saving new token in config file")
|
fs.ErrorLog(nil, "Failed to save new token in config file: %v", err)
|
||||||
|
} else {
|
||||||
|
fs.Debug(name, "Saved new token in config file")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user