mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-12 09:50:47 +01:00
76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
|
package dns
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"io/fs"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
|
||
|
"github.com/sirupsen/logrus"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
netbirdProgramDataLocation = "Netbird"
|
||
|
fileUncleanShutdownFile = "unclean_shutdown_dns.txt"
|
||
|
)
|
||
|
|
||
|
func CheckUncleanShutdown(string) error {
|
||
|
file := getUncleanShutdownFile()
|
||
|
|
||
|
if _, err := os.Stat(file); err != nil {
|
||
|
if errors.Is(err, fs.ErrNotExist) {
|
||
|
// no file -> clean shutdown
|
||
|
return nil
|
||
|
} else {
|
||
|
return fmt.Errorf("state: %w", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
logrus.Warnf("detected unclean shutdown, file %s exists. Restoring unclean shutdown dns settings.", file)
|
||
|
|
||
|
guid, err := os.ReadFile(file)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("read %s: %w", file, err)
|
||
|
}
|
||
|
|
||
|
manager, err := newHostManagerWithGuid(string(guid))
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("create host manager: %w", err)
|
||
|
}
|
||
|
|
||
|
if err := manager.restoreUncleanShutdownDNS(nil); err != nil {
|
||
|
return fmt.Errorf("restore unclean shutdown backup: %w", err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func createUncleanShutdownIndicator(guid string) error {
|
||
|
file := getUncleanShutdownFile()
|
||
|
|
||
|
dir := filepath.Dir(file)
|
||
|
if err := os.MkdirAll(dir, os.FileMode(0755)); err != nil {
|
||
|
return fmt.Errorf("create dir %s: %w", dir, err)
|
||
|
}
|
||
|
|
||
|
if err := os.WriteFile(file, []byte(guid), 0600); err != nil {
|
||
|
return fmt.Errorf("create %s: %w", file, err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func removeUncleanShutdownIndicator() error {
|
||
|
file := getUncleanShutdownFile()
|
||
|
|
||
|
if err := os.Remove(file); err != nil && !errors.Is(err, fs.ErrNotExist) {
|
||
|
return fmt.Errorf("remove %s: %w", file, err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func getUncleanShutdownFile() string {
|
||
|
return filepath.Join(os.Getenv("PROGRAMDATA"), netbirdProgramDataLocation, fileUncleanShutdownFile)
|
||
|
}
|