diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index 1e1df8bf4..c0009e52b 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -36,7 +36,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de W 💣 golang.zx2c4.com/wireguard/windows/tunnel/winipcfg from tailscale.com/net/interfaces+ 💣 gvisor.dev/gvisor/pkg/gohacks from gvisor.dev/gvisor/pkg/state/wire gvisor.dev/gvisor/pkg/linewriter from gvisor.dev/gvisor/pkg/log - gvisor.dev/gvisor/pkg/log from gvisor.dev/gvisor/pkg/tcpip/stack+ + gvisor.dev/gvisor/pkg/log from gvisor.dev/gvisor/pkg/state+ gvisor.dev/gvisor/pkg/rand from gvisor.dev/gvisor/pkg/tcpip/network/hash+ 💣 gvisor.dev/gvisor/pkg/sleep from gvisor.dev/gvisor/pkg/tcpip/transport/tcp 💣 gvisor.dev/gvisor/pkg/state from gvisor.dev/gvisor/pkg/tcpip+ @@ -46,7 +46,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de gvisor.dev/gvisor/pkg/tcpip/adapters/gonet from tailscale.com/wgengine/netstack gvisor.dev/gvisor/pkg/tcpip/buffer from gvisor.dev/gvisor/pkg/tcpip/adapters/gonet+ gvisor.dev/gvisor/pkg/tcpip/hash/jenkins from gvisor.dev/gvisor/pkg/tcpip/stack+ - gvisor.dev/gvisor/pkg/tcpip/header from gvisor.dev/gvisor/pkg/tcpip/link/channel+ + gvisor.dev/gvisor/pkg/tcpip/header from gvisor.dev/gvisor/pkg/tcpip/header/parse+ gvisor.dev/gvisor/pkg/tcpip/header/parse from gvisor.dev/gvisor/pkg/tcpip/network/ipv4+ gvisor.dev/gvisor/pkg/tcpip/link/channel from tailscale.com/wgengine/netstack gvisor.dev/gvisor/pkg/tcpip/network/fragmentation from gvisor.dev/gvisor/pkg/tcpip/network/ipv4+ @@ -70,12 +70,12 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/atomicfile from tailscale.com/ipn+ tailscale.com/control/controlclient from tailscale.com/ipn/ipnlocal+ tailscale.com/derp from tailscale.com/derp/derphttp+ - tailscale.com/derp/derphttp from tailscale.com/net/netcheck+ + tailscale.com/derp/derphttp from tailscale.com/cmd/tailscaled+ tailscale.com/derp/derpmap from tailscale.com/cmd/tailscaled tailscale.com/disco from tailscale.com/derp+ tailscale.com/health from tailscale.com/control/controlclient+ tailscale.com/internal/deepprint from tailscale.com/ipn/ipnlocal+ - tailscale.com/ipn from tailscale.com/ipn/ipnserver+ + tailscale.com/ipn from tailscale.com/ipn/ipnlocal+ tailscale.com/ipn/ipnlocal from tailscale.com/ipn/ipnserver+ tailscale.com/ipn/ipnserver from tailscale.com/cmd/tailscaled tailscale.com/ipn/ipnstate from tailscale.com/ipn+ @@ -83,13 +83,13 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/ipn/policy from tailscale.com/ipn/ipnlocal tailscale.com/log/filelogger from tailscale.com/ipn/ipnserver tailscale.com/log/logheap from tailscale.com/control/controlclient - tailscale.com/logpolicy from tailscale.com/cmd/tailscaled - tailscale.com/logtail from tailscale.com/logpolicy + tailscale.com/logpolicy from tailscale.com/cmd/tailscaled+ + tailscale.com/logtail from tailscale.com/control/controlclient+ tailscale.com/logtail/backoff from tailscale.com/control/controlclient+ tailscale.com/logtail/filch from tailscale.com/logpolicy tailscale.com/metrics from tailscale.com/derp tailscale.com/net/dnscache from tailscale.com/control/controlclient+ - tailscale.com/net/flowtrack from tailscale.com/wgengine/filter+ + tailscale.com/net/flowtrack from tailscale.com/net/packet+ 💣 tailscale.com/net/interfaces from tailscale.com/cmd/tailscaled+ tailscale.com/net/netcheck from tailscale.com/wgengine/magicsock tailscale.com/net/netns from tailscale.com/control/controlclient+ @@ -100,18 +100,18 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/net/stun from tailscale.com/net/netcheck+ tailscale.com/net/tlsdial from tailscale.com/control/controlclient+ tailscale.com/net/tsaddr from tailscale.com/ipn/ipnlocal+ - 💣 tailscale.com/net/tshttpproxy from tailscale.com/control/controlclient+ + 💣 tailscale.com/net/tshttpproxy from tailscale.com/cmd/tailscaled+ tailscale.com/paths from tailscale.com/cmd/tailscaled+ tailscale.com/portlist from tailscale.com/ipn/ipnlocal tailscale.com/safesocket from tailscale.com/ipn/ipnserver tailscale.com/smallzstd from tailscale.com/ipn/ipnserver+ tailscale.com/syncs from tailscale.com/net/interfaces+ - tailscale.com/tailcfg from tailscale.com/control/controlclient+ + tailscale.com/tailcfg from tailscale.com/cmd/tailscaled+ W tailscale.com/tsconst from tailscale.com/net/interfaces tailscale.com/tstime from tailscale.com/wgengine/magicsock tailscale.com/types/empty from tailscale.com/control/controlclient+ tailscale.com/types/flagtype from tailscale.com/cmd/tailscaled - tailscale.com/types/key from tailscale.com/derp+ + tailscale.com/types/key from tailscale.com/cmd/tailscaled+ tailscale.com/types/logger from tailscale.com/cmd/tailscaled+ tailscale.com/types/netmap from tailscale.com/control/controlclient+ tailscale.com/types/nettype from tailscale.com/wgengine/magicsock @@ -122,7 +122,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/types/strbuilder from tailscale.com/net/packet tailscale.com/types/structs from tailscale.com/control/controlclient+ tailscale.com/types/wgkey from tailscale.com/control/controlclient+ - tailscale.com/util/dnsname from tailscale.com/wgengine/tsdns+ + tailscale.com/util/dnsname from tailscale.com/ipn/ipnstate+ LW tailscale.com/util/endian from tailscale.com/net/netns+ tailscale.com/util/lineread from tailscale.com/control/controlclient+ tailscale.com/util/pidowner from tailscale.com/ipn/ipnserver @@ -133,7 +133,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/wgengine from tailscale.com/cmd/tailscaled+ tailscale.com/wgengine/filter from tailscale.com/control/controlclient+ tailscale.com/wgengine/magicsock from tailscale.com/cmd/tailscaled+ - 💣 tailscale.com/wgengine/monitor from tailscale.com/wgengine+ + 💣 tailscale.com/wgengine/monitor from tailscale.com/cmd/tailscaled+ tailscale.com/wgengine/netstack from tailscale.com/cmd/tailscaled tailscale.com/wgengine/router from tailscale.com/cmd/tailscaled+ tailscale.com/wgengine/router/dns from tailscale.com/ipn/ipnlocal+ @@ -180,7 +180,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de golang.org/x/text/transform from golang.org/x/text/secure/bidirule+ golang.org/x/text/unicode/bidi from golang.org/x/net/idna+ golang.org/x/text/unicode/norm from golang.org/x/net/idna - golang.org/x/time/rate from tailscale.com/types/logger+ + golang.org/x/time/rate from gvisor.dev/gvisor/pkg/tcpip/stack+ bufio from compress/flate+ bytes from bufio+ compress/flate from compress/gzip+ @@ -227,12 +227,12 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de hash from compress/zlib+ hash/adler32 from compress/zlib hash/crc32 from compress/gzip+ - hash/fnv from tailscale.com/wgengine/magicsock+ + hash/fnv from gvisor.dev/gvisor/pkg/tcpip/network/ipv6+ hash/maphash from go4.org/mem html from net/http/pprof+ io from bufio+ io/fs from crypto/rand+ - io/ioutil from github.com/godbus/dbus/v5+ + io/ioutil from crypto/x509+ log from expvar+ math from compress/flate+ math/big from crypto/dsa+ diff --git a/control/controlclient/direct.go b/control/controlclient/direct.go index be04e143c..66b529ec6 100644 --- a/control/controlclient/direct.go +++ b/control/controlclient/direct.go @@ -35,6 +35,8 @@ import ( "inet.af/netaddr" "tailscale.com/health" "tailscale.com/log/logheap" + "tailscale.com/logpolicy" + "tailscale.com/logtail" "tailscale.com/net/dnscache" "tailscale.com/net/netns" "tailscale.com/net/tlsdial" @@ -390,6 +392,36 @@ func (c *Direct) doLogin(ctx context.Context, t *oauth2.Token, flags LoginFlags, c.logf("RegisterReq: got response; nodeKeyExpired=%v, machineAuthorized=%v; authURL=%v", resp.NodeKeyExpired, resp.MachineAuthorized, resp.AuthURL != "") + if resp.Login.LoginName != persist.LoginName { + // rotate log id here + newPrivateID, err := logtail.NewPrivateID() + if err != nil { + return false, "", fmt.Errorf("new log ID generation issue: %v", err) + } + + newPublicID := newPrivateID.Public() + c.logf("switching to log id %s", newPublicID) + cfgPath, oldc, err := logpolicy.LoadConfig() + if err != nil { + return false, "", fmt.Errorf("can't load old log config file: %v", err) + } + + oldPublicID := oldc.PublicID + oldc.PrivateID = newPrivateID + oldc.PublicID = newPublicID + err = oldc.Save(cfgPath) + if err != nil { + return false, "", fmt.Errorf("can't save log config to %q: %v", cfgPath, err) + } + + // XXX(Xe): Overwrite log.Output to the new log id, the other middleware + // inbetween this will be maintained, this just overrides what log.Printf + // gets put to. This modifies global state. + logpolicy.New("tailnode.log.tailscale.io") + + c.logf("continuing from log ID %s", oldPublicID) + } + if resp.NodeKeyExpired { if regen { return true, "", fmt.Errorf("weird: regen=true but server says NodeKeyExpired: %v", request.NodeKey) diff --git a/logpolicy/logpolicy.go b/logpolicy/logpolicy.go index add1874a6..fe494318c 100644 --- a/logpolicy/logpolicy.go +++ b/logpolicy/logpolicy.go @@ -24,6 +24,7 @@ import ( "runtime" "strconv" "strings" + "sync" "time" "golang.org/x/term" @@ -65,7 +66,7 @@ func (c *Config) ToBytes() []byte { } // Save writes the JSON representation of c to stateFile. -func (c *Config) save(stateFile string) error { +func (c *Config) Save(stateFile string) error { c.PublicID = c.PrivateID.Public() if err := os.MkdirAll(filepath.Dir(stateFile), 0750); err != nil { return err @@ -308,6 +309,40 @@ func tryFixLogStateLocation(dir, cmdname string) { } } +// LoadConfig loads the logging configuration that is currently in use. +// This is intended for use outside of this package. +func LoadConfig() (string, *Config, error) { + dir := logsDir(log.Printf) + cmdName := version.CmdName() + tryFixLogStateLocation(dir, cmdName) + + cfgPath := filepath.Join(dir, fmt.Sprintf("%s.log.conf", cmdName)) + + // The Windows service previously ran as tailscale-ipn.exe, so + // let's keep using that log base name if it exists. + if runtime.GOOS == "windows" && cmdName == "tailscaled" { + const oldCmdName = "tailscale-ipn" + oldPath := filepath.Join(dir, oldCmdName+".log.conf") + if fi, err := os.Stat(oldPath); err == nil && fi.Mode().IsRegular() { + cfgPath = oldPath + cmdName = oldCmdName + } + } + + var result Config + fin, err := os.Open(cfgPath) + if err != nil { + return "", nil, fmt.Errorf("can't open %q: %w", cfgPath, err) + } + defer fin.Close() + err = json.NewDecoder(fin).Decode(&result) + if err != nil { + return "", nil, fmt.Errorf("can't decode log config at %q: %w", cfgPath, err) + } + + return cfgPath, &result, nil +} + // New returns a new log policy (a logger and its instance ID) for a // given collection name. func New(collection string) *Policy { @@ -381,7 +416,7 @@ func New(collection string) *Policy { } newc.PublicID = newc.PrivateID.Public() if newc != *oldc { - if err := newc.save(cfgPath); err != nil { + if err := newc.Save(cfgPath); err != nil { earlyLogf("logpolicy.Config.Save: %v", err) } } @@ -415,6 +450,12 @@ func New(collection string) *Policy { log.SetFlags(0) // other logflags are set on console, not here log.SetOutput(lw) + lastLogLevelMu.Lock() + if lastLogLevel != -1 { + lw.SetVerbosityLevel(lastLogLevel) + } + lastLogLevelMu.Unlock() + log.Printf("Program starting: v%v, Go %v: %#v", version.Long, goVersion(), @@ -433,12 +474,20 @@ func New(collection string) *Policy { } } +var ( + lastLogLevelMu sync.Mutex + lastLogLevel int = -1 +) + // SetVerbosityLevel controls the verbosity level that should be // written to stderr. 0 is the default (not verbose). Levels 1 or higher // are increasingly verbose. // // It should not be changed concurrently with log writes. func (p *Policy) SetVerbosityLevel(level int) { + lastLogLevelMu.Lock() + lastLogLevel = level + lastLogLevelMu.Unlock() p.Logtail.SetVerbosityLevel(level) }