Correct state handling for split updates
- Always merge state again, so that we keep the missing information from the not updated protocol
This commit is contained in:
parent
45d4e45bb1
commit
73b7a3d1ee
@ -6,6 +6,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UpdateRequest struct {
|
type UpdateRequest struct {
|
||||||
@ -30,13 +31,41 @@ func (ur *UpdateRequest) PrettyPrint() string {
|
|||||||
return string(s)
|
return string(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ur *UpdateRequest) MergeOldStateFile() {
|
||||||
|
filename := ur.Config.GetStateFileName()
|
||||||
|
|
||||||
|
if _, err := os.Stat(filename); err != nil {
|
||||||
|
log.Printf("No old state file %s found, skip merging: %v", filename, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have a state file present, load it and merge into current state
|
||||||
|
// so that we don't loose any IPv4/v6 data during partial updates.
|
||||||
|
|
||||||
|
oldState, err := LoadStateFile(ur.Config)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Failed to load old state file %s to merge while saving, skipping it: %v",
|
||||||
|
filename, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ur.IPv4 == nil {
|
||||||
|
ur.IPv4 = oldState.IPv4
|
||||||
|
}
|
||||||
|
if ur.IPv6 == nil {
|
||||||
|
ur.IPv6 = oldState.IPv6
|
||||||
|
ur.IPv6Net = oldState.IPv6Net
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (ur *UpdateRequest) SaveStateFile() error {
|
func (ur *UpdateRequest) SaveStateFile() error {
|
||||||
|
ur.MergeOldStateFile()
|
||||||
|
|
||||||
|
filename := ur.Config.GetStateFileName()
|
||||||
data, err := json.MarshalIndent(ur, "", " ")
|
data, err := json.MarshalIndent(ur, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to convert state for user %s to JSON: %v",
|
return fmt.Errorf("failed to convert state for user %s to JSON: %v",
|
||||||
ur.UserName, err)
|
ur.UserName, err)
|
||||||
}
|
}
|
||||||
filename := ur.Config.GetStateFileName()
|
|
||||||
if err = ioutil.WriteFile(filename, data, 0640); err != nil {
|
if err = ioutil.WriteFile(filename, data, 0640); err != nil {
|
||||||
return fmt.Errorf("failed to to write sate file for user %s to file %s: %v",
|
return fmt.Errorf("failed to to write sate file for user %s to file %s: %v",
|
||||||
ur.UserName, filename, err)
|
ur.UserName, filename, err)
|
||||||
|
Loading…
Reference in New Issue
Block a user