mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-09 23:00:58 +00:00
Migrate config
This commit is contained in:
parent
f561d3261a
commit
d4dc7911eb
@ -30,6 +30,9 @@ type Configuration struct {
|
|||||||
GUI GUIConfiguration `xml:"gui"`
|
GUI GUIConfiguration `xml:"gui"`
|
||||||
Options OptionsConfiguration `xml:"options"`
|
Options OptionsConfiguration `xml:"options"`
|
||||||
XMLName xml.Name `xml:"configuration" json:"-"`
|
XMLName xml.Name `xml:"configuration" json:"-"`
|
||||||
|
|
||||||
|
Deprecated_Repositories []FolderConfiguration `xml:"repository" json:"-"`
|
||||||
|
Deprecated_Nodes []DeviceConfiguration `xml:"node" json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FolderConfiguration struct {
|
type FolderConfiguration struct {
|
||||||
@ -43,6 +46,9 @@ type FolderConfiguration struct {
|
|||||||
Versioning VersioningConfiguration `xml:"versioning"`
|
Versioning VersioningConfiguration `xml:"versioning"`
|
||||||
|
|
||||||
deviceIDs []protocol.DeviceID
|
deviceIDs []protocol.DeviceID
|
||||||
|
|
||||||
|
Depreceted_Directory string `xml:"directory,omitempty,attr" json:"-"`
|
||||||
|
Depreceted_Nodes []FolderDeviceConfiguration `xml:"node" json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type VersioningConfiguration struct {
|
type VersioningConfiguration struct {
|
||||||
@ -352,6 +358,11 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) {
|
|||||||
convertV3V4(cfg)
|
convertV3V4(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Upgrade to v5 configuration if appropriate
|
||||||
|
if cfg.Version == 4 {
|
||||||
|
convertV4V5(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
// Hash old cleartext passwords
|
// Hash old cleartext passwords
|
||||||
if len(cfg.GUI.Password) > 0 && cfg.GUI.Password[0] != '$' {
|
if len(cfg.GUI.Password) > 0 && cfg.GUI.Password[0] != '$' {
|
||||||
hash, err := bcrypt.GenerateFromPassword([]byte(cfg.GUI.Password), 0)
|
hash, err := bcrypt.GenerateFromPassword([]byte(cfg.GUI.Password), 0)
|
||||||
@ -465,12 +476,38 @@ func ChangeRequiresRestart(from, to Configuration) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertV4V5(cfg *Configuration) {
|
||||||
|
// Renamed a bunch of fields in the structs.
|
||||||
|
if cfg.Deprecated_Nodes == nil {
|
||||||
|
cfg.Deprecated_Nodes = []DeviceConfiguration{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.Deprecated_Repositories == nil {
|
||||||
|
cfg.Deprecated_Repositories = []FolderConfiguration{}
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.Devices = cfg.Deprecated_Nodes
|
||||||
|
cfg.Folders = cfg.Deprecated_Repositories
|
||||||
|
|
||||||
|
for i := range cfg.Folders {
|
||||||
|
cfg.Folders[i].Path = cfg.Folders[i].Depreceted_Directory
|
||||||
|
cfg.Folders[i].Depreceted_Directory = ""
|
||||||
|
cfg.Folders[i].Devices = cfg.Folders[i].Depreceted_Nodes
|
||||||
|
cfg.Folders[i].Depreceted_Nodes = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.Deprecated_Nodes = nil
|
||||||
|
cfg.Deprecated_Repositories = nil
|
||||||
|
|
||||||
|
cfg.Version = 5
|
||||||
|
}
|
||||||
|
|
||||||
func convertV3V4(cfg *Configuration) {
|
func convertV3V4(cfg *Configuration) {
|
||||||
// In previous versions, rescan interval was common for each folder.
|
// In previous versions, rescan interval was common for each folder.
|
||||||
// From now, it can be set independently. We have to make sure, that after upgrade
|
// From now, it can be set independently. We have to make sure, that after upgrade
|
||||||
// the individual rescan interval will be defined for every existing folder.
|
// the individual rescan interval will be defined for every existing folder.
|
||||||
for i := range cfg.Folders {
|
for i := range cfg.Deprecated_Repositories {
|
||||||
cfg.Folders[i].RescanIntervalS = cfg.Options.Deprecated_RescanIntervalS
|
cfg.Deprecated_Repositories[i].RescanIntervalS = cfg.Options.Deprecated_RescanIntervalS
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg.Options.Deprecated_RescanIntervalS = 0
|
cfg.Options.Deprecated_RescanIntervalS = 0
|
||||||
@ -478,10 +515,10 @@ func convertV3V4(cfg *Configuration) {
|
|||||||
// In previous versions, folders held full device configurations.
|
// In previous versions, folders held full device configurations.
|
||||||
// Since that's the only place where device configs were in V1, we still have
|
// Since that's the only place where device configs were in V1, we still have
|
||||||
// to define the deprecated fields to be able to upgrade from V1 to V4.
|
// to define the deprecated fields to be able to upgrade from V1 to V4.
|
||||||
for i, folder := range cfg.Folders {
|
for i, folder := range cfg.Deprecated_Repositories {
|
||||||
|
|
||||||
for j := range folder.Devices {
|
for j := range folder.Depreceted_Nodes {
|
||||||
rncfg := cfg.Folders[i].Devices[j]
|
rncfg := cfg.Deprecated_Repositories[i].Depreceted_Nodes[j]
|
||||||
rncfg.Deprecated_Name = ""
|
rncfg.Deprecated_Name = ""
|
||||||
rncfg.Deprecated_Addresses = nil
|
rncfg.Deprecated_Addresses = nil
|
||||||
}
|
}
|
||||||
@ -494,8 +531,8 @@ func convertV2V3(cfg *Configuration) {
|
|||||||
// In previous versions, compression was always on. When upgrading, enable
|
// In previous versions, compression was always on. When upgrading, enable
|
||||||
// compression on all existing new. New devices will get compression on by
|
// compression on all existing new. New devices will get compression on by
|
||||||
// default by the GUI.
|
// default by the GUI.
|
||||||
for i := range cfg.Devices {
|
for i := range cfg.Deprecated_Nodes {
|
||||||
cfg.Devices[i].Compression = true
|
cfg.Deprecated_Nodes[i].Compression = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// The global discovery format and port number changed in v0.9. Having the
|
// The global discovery format and port number changed in v0.9. Having the
|
||||||
@ -513,27 +550,27 @@ func convertV1V2(cfg *Configuration) {
|
|||||||
// device ID. Set all folders to read only if the global read only flag is
|
// device ID. Set all folders to read only if the global read only flag is
|
||||||
// set.
|
// set.
|
||||||
var devices = map[string]FolderDeviceConfiguration{}
|
var devices = map[string]FolderDeviceConfiguration{}
|
||||||
for i, folder := range cfg.Folders {
|
for i, folder := range cfg.Deprecated_Repositories {
|
||||||
cfg.Folders[i].ReadOnly = cfg.Options.Deprecated_ReadOnly
|
cfg.Deprecated_Repositories[i].ReadOnly = cfg.Options.Deprecated_ReadOnly
|
||||||
for j, device := range folder.Devices {
|
for j, device := range folder.Depreceted_Nodes {
|
||||||
id := device.DeviceID.String()
|
id := device.DeviceID.String()
|
||||||
if _, ok := devices[id]; !ok {
|
if _, ok := devices[id]; !ok {
|
||||||
devices[id] = device
|
devices[id] = device
|
||||||
}
|
}
|
||||||
cfg.Folders[i].Devices[j] = FolderDeviceConfiguration{DeviceID: device.DeviceID}
|
cfg.Deprecated_Repositories[i].Depreceted_Nodes[j] = FolderDeviceConfiguration{DeviceID: device.DeviceID}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cfg.Options.Deprecated_ReadOnly = false
|
cfg.Options.Deprecated_ReadOnly = false
|
||||||
|
|
||||||
// Set and sort the list of devices.
|
// Set and sort the list of devices.
|
||||||
for _, device := range devices {
|
for _, device := range devices {
|
||||||
cfg.Devices = append(cfg.Devices, DeviceConfiguration{
|
cfg.Deprecated_Nodes = append(cfg.Deprecated_Nodes, DeviceConfiguration{
|
||||||
DeviceID: device.DeviceID,
|
DeviceID: device.DeviceID,
|
||||||
Name: device.Deprecated_Name,
|
Name: device.Deprecated_Name,
|
||||||
Addresses: device.Deprecated_Addresses,
|
Addresses: device.Deprecated_Addresses,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
sort.Sort(DeviceConfigurationList(cfg.Devices))
|
sort.Sort(DeviceConfigurationList(cfg.Deprecated_Nodes))
|
||||||
|
|
||||||
// GUI
|
// GUI
|
||||||
cfg.GUI.Address = cfg.Options.Deprecated_GUIAddress
|
cfg.GUI.Address = cfg.Options.Deprecated_GUIAddress
|
||||||
|
@ -47,7 +47,7 @@ func TestDefaultValues(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDeviceConfig(t *testing.T) {
|
func TestDeviceConfig(t *testing.T) {
|
||||||
for i, ver := range []string{"v1", "v2", "v3", "v4"} {
|
for i, ver := range []string{"v1", "v2", "v3", "v4", "v5"} {
|
||||||
cfg, err := Load("testdata/"+ver+".xml", device1)
|
cfg, err := Load("testdata/"+ver+".xml", device1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
@ -65,21 +65,21 @@ func TestDeviceConfig(t *testing.T) {
|
|||||||
expectedDevices := []DeviceConfiguration{
|
expectedDevices := []DeviceConfiguration{
|
||||||
{
|
{
|
||||||
DeviceID: device1,
|
DeviceID: device1,
|
||||||
Name: "device one",
|
Name: "node one",
|
||||||
Addresses: []string{"a"},
|
Addresses: []string{"a"},
|
||||||
Compression: true,
|
Compression: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
DeviceID: device4,
|
DeviceID: device4,
|
||||||
Name: "device two",
|
Name: "node two",
|
||||||
Addresses: []string{"b"},
|
Addresses: []string{"b"},
|
||||||
Compression: true,
|
Compression: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
expectedDeviceIDs := []protocol.DeviceID{device1, device4}
|
expectedDeviceIDs := []protocol.DeviceID{device1, device4}
|
||||||
|
|
||||||
if cfg.Version != 4 {
|
if cfg.Version != 5 {
|
||||||
t.Errorf("%d: Incorrect version %d != 3", i, cfg.Version)
|
t.Errorf("%d: Incorrect version %d != 5", i, cfg.Version)
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(cfg.Folders, expectedFolders) {
|
if !reflect.DeepEqual(cfg.Folders, expectedFolders) {
|
||||||
t.Errorf("%d: Incorrect Folders\n A: %#v\n E: %#v", i, cfg.Folders, expectedFolders)
|
t.Errorf("%d: Incorrect Folders\n A: %#v\n E: %#v", i, cfg.Folders, expectedFolders)
|
||||||
|
12
internal/config/testdata/v5.xml
vendored
Executable file
12
internal/config/testdata/v5.xml
vendored
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
<configuration version="5">
|
||||||
|
<folder id="test" path="~/Sync" ro="true" ignorePerms="false" rescanIntervalS="600">
|
||||||
|
<device id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR"></device>
|
||||||
|
<device id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2"></device>
|
||||||
|
</folder>
|
||||||
|
<device id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" name="node one" compression="true">
|
||||||
|
<address>a</address>
|
||||||
|
</device>
|
||||||
|
<device id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" name="node two" compression="true">
|
||||||
|
<address>b</address>
|
||||||
|
</device>
|
||||||
|
</configuration>
|
Loading…
Reference in New Issue
Block a user