From 771191bad5b8fafbb8abd0b8a6c9d0eb5306b063 Mon Sep 17 00:00:00 2001 From: Will Norris Date: Wed, 8 May 2024 12:40:02 -0700 Subject: [PATCH] add config option for node hostname this overrides the name used to refer to the node in the caddy config, and is mostly useful because it can include environment variables. Closes #18 Co-authored-by: kdevan Signed-off-by: Will Norris --- app.go | 8 ++++++++ module.go | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) 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 {