Files

87 lines
2.2 KiB
Go

package core
import (
"context"
fmt2 "fmt"
"log/slog"
"time"
"tailscale.com/ipn"
"tailscale.com/tsnet"
)
func InitTsNet(ctx context.Context, cfg *Core, logger *slog.Logger, withDebugLog bool) (*tsnet.Server, error) {
dbgLogger := func(fmt string, args ...interface{}) {}
if withDebugLog {
logger.Warn("Tsnet debug log activated")
dbgLogger = func(fmt string, args ...interface{}) {
logger.With(slog.String("from", "tsnet")).Debug(fmt2.Sprintf(fmt, args...))
}
}
if withDebugLog {
logger.Warn("Tsnet will be turn on their embedded web client, use for your own risk")
}
srv := &tsnet.Server{
Hostname: "tslink-" + cfg.Hostname,
AuthKey: cfg.AuthKey,
Ephemeral: cfg.Ephemeral,
Logf: dbgLogger,
UserLogf: func(fmt string, args ...interface{}) {
logger.With(slog.String("from", "tsnet")).Info(fmt2.Sprintf(fmt, args...))
},
RunWebClient: withDebugLog,
}
if cfg.ControlURL != "" {
srv.ControlURL = cfg.ControlURL
}
logger.Debug("starting tsnet server")
if err := srv.Start(); err != nil {
logger.With(slog.String("error", err.Error())).Error("starting tsnet server failed")
return nil, err
}
cnclCtx, cancel := context.WithTimeout(ctx, 30*time.Second)
defer cancel()
status, err := srv.Up(cnclCtx)
if err != nil {
logger.With(slog.String("error", err.Error())).Error("bring up tsnet server failed")
return nil, err
}
for _, ip := range status.TailscaleIPs {
logger.With(slog.String("ip", ip.String())).Info("ip got from tsnet")
}
rawSuffix, err := GetMagicDNSSuffixFromStatus(status)
if err != nil {
logger.Debug("failed to extract MagicDNS suffix", slog.String("error", err.Error()))
} else {
SetMagicDNSSuffix(rawSuffix)
logger.Info("MagicDNS suffix extracted", slog.String("suffix", rawSuffix))
}
if cfg.AcceptRoutes {
lc, err := srv.LocalClient()
if err != nil {
logger.With(slog.String("error", err.Error())).Error("error from getting local client")
} else {
_, err = lc.EditPrefs(ctx, &ipn.MaskedPrefs{
Prefs: ipn.Prefs{RouteAll: true},
RouteAllSet: true,
})
if err != nil {
logger.With(slog.String("error", err.Error())).Error("error from editing prefs")
} else {
logger.Debug("subnet route accepted")
}
}
}
return srv, nil
}