|
|
|
|
@ -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 != "" { |
|
|
|
|
|