diff --git a/app.go b/app.go index b9f6417..c9f1b6e 100644 --- a/app.go +++ b/app.go @@ -47,6 +47,9 @@ type TSNode struct { // Ephemeral specifies whether the node should be registered as ephemeral. Ephemeral bool `json:"ephemeral,omitempty" caddy:"namespace=tailscale.ephemeral"` + // Hostname is the hostname to use when registering the node. + Hostname string `json:"hostname,omitempty" caddy:"namespace=tailscale.hostname"` + name string } @@ -137,6 +140,11 @@ func parseTSNode(d *caddyfile.Dispenser) (TSNode, error) { node.ControlURL = segment.Val() case "ephemeral": node.Ephemeral = true + case "hostname": + if !segment.NextArg() { + return node, segment.ArgErr() + } + node.Hostname = segment.Val() default: return node, segment.Errf("unrecognized subdirective: %s", segment.Val()) } diff --git a/module.go b/module.go index 31d7427..35c0968 100644 --- a/module.go +++ b/module.go @@ -103,7 +103,6 @@ func getNode(ctx caddy.Context, name string) (*tailscaleNode, error) { s, _, err := nodes.LoadOrNew(name, func() (caddy.Destructor, error) { s := &tsnet.Server{ - Hostname: name, Logf: func(format string, args ...any) { app.logger.Sugar().Debugf(format, args...) }, @@ -116,6 +115,9 @@ func getNode(ctx caddy.Context, name string) (*tailscaleNode, error) { if s.ControlURL, err = getControlURL(name, app); err != nil { return nil, err } + if s.Hostname, err = getHostname(name, app); err != nil { + return nil, err + } if name != "" { // Set config directory for tsnet. By default, tsnet will use the name of the @@ -182,6 +184,19 @@ func getEphemeral(name string, app *TSApp) bool { return app.Ephemeral } +func getHostname(name string, app *TSApp) (string, error) { + if app == nil { + return name, nil + } + if node, ok := app.Nodes[name]; ok { + if node.Hostname != "" { + return repl.ReplaceOrErr(node.Hostname, true, true) + } + } + + return name, nil +} + // tailscaleNode is a wrapper around a tsnet.Server that provides a fully self-contained Tailscale node. // This node can listen on the tailscale network interface, or be used to connect to other nodes in the tailnet. type tailscaleNode struct {