mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 04:55:31 +00:00
280c84e46a
C:\WINDOWS\system32\config\systemprofile\AppData\Local\ is frequently cleared for almost any reason: Windows updates, System Restore, even various System Cleaner utilities. The server-state.conf file in AppData\Local could be deleted at any time, which would break login until the node is removed from the Admin Panel allowing it to create a new key. Carefully copy any AppData state to ProgramData at startup. If copying the state fails, continue to use AppData so at least there will be connectivity. If there is no state, use ProgramData. We also migrate the log.conf file. Very old versions of Tailscale named the EXE tailscale-ipn, so the log conf was tailscale-ipn.log.conf and more recent versions preserved this filename and cmdName in logs. In this migration we always update the filename to c:\ProgramData\Tailscale\tailscaled.log.conf Updates https://github.com/tailscale/tailscale/issues/2856 Signed-off-by: Denton Gentry <dgentry@tailscale.com>
62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package paths returns platform and user-specific default paths to
|
|
// Tailscale files and directories.
|
|
package paths
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"sync/atomic"
|
|
|
|
"tailscale.com/version/distro"
|
|
)
|
|
|
|
// AppSharedDir is a string set by the iOS or Android app on start
|
|
// containing a directory we can read/write in.
|
|
var AppSharedDir atomic.Value
|
|
|
|
// DefaultTailscaledSocket returns the path to the tailscaled Unix socket
|
|
// or the empty string if there's no reasonable default.
|
|
func DefaultTailscaledSocket() string {
|
|
if runtime.GOOS == "windows" {
|
|
return ""
|
|
}
|
|
if runtime.GOOS == "darwin" {
|
|
return "/var/run/tailscaled.socket"
|
|
}
|
|
if distro.Get() == distro.Synology {
|
|
// TODO(maisem): be smarter about this. We can parse /etc/VERSION.
|
|
const dsm6Sock = "/var/packages/Tailscale/etc/tailscaled.sock"
|
|
const dsm7Sock = "/var/packages/Tailscale/var/tailscaled.sock"
|
|
if fi, err := os.Stat(dsm6Sock); err == nil && !fi.IsDir() {
|
|
return dsm6Sock
|
|
}
|
|
if fi, err := os.Stat(dsm7Sock); err == nil && !fi.IsDir() {
|
|
return dsm7Sock
|
|
}
|
|
}
|
|
if fi, err := os.Stat("/var/run"); err == nil && fi.IsDir() {
|
|
return "/var/run/tailscale/tailscaled.sock"
|
|
}
|
|
return "tailscaled.sock"
|
|
}
|
|
|
|
var stateFileFunc func() string
|
|
|
|
// DefaultTailscaledStateFile returns the default path to the
|
|
// tailscaled state file, or the empty string if there's no reasonable
|
|
// default value.
|
|
func DefaultTailscaledStateFile() string {
|
|
if f := stateFileFunc; f != nil {
|
|
return f()
|
|
}
|
|
if runtime.GOOS == "windows" {
|
|
return filepath.Join(os.Getenv("ProgramData"), "Tailscale", "server-state.conf")
|
|
}
|
|
return ""
|
|
}
|