diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go index 1ab81843d..81a7c7053 100644 --- a/cmd/tailscaled/tailscaled.go +++ b/cmd/tailscaled/tailscaled.go @@ -163,6 +163,34 @@ func main() { } } +func trySynologyMigration(p string) error { + if runtime.GOOS != "linux" || distro.Get() != distro.Synology { + return nil + } + + fi, err := os.Stat(p) + if err == nil && fi.Size() > 0 || !os.IsNotExist(err) { + return err + } + // File is empty or doesn't exist, try reading from the old path. + + const oldPath = "/var/packages/Tailscale/etc/tailscaled.state" + if _, err := os.Stat(oldPath); err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + + if err := os.Chown(oldPath, os.Getuid(), os.Getgid()); err != nil { + return err + } + if err := os.Rename(oldPath, p); err != nil { + return err + } + return nil +} + func ipnServerOpts() (o ipnserver.Options) { // Allow changing the OS-specific IPN behavior for tests // so we can e.g. test Windows-specific behaviors on Linux. @@ -225,6 +253,9 @@ func run() error { if args.statepath == "" { log.Fatalf("--state is required") } + if err := trySynologyMigration(args.statepath); err != nil { + log.Printf("error in synology migration: %v", err) + } var debugMux *http.ServeMux if args.debug != "" {