Skip to content

Commit

Permalink
add config option for control URL
Browse files Browse the repository at this point in the history
also return any replacer errors, and remove app nil check since we
always check prior to calling these config funcs.

Closes #22

Co-authored-by: ChibangLW <ich@leonlenzen.de>
Signed-off-by: Will Norris <will@tailscale.com>
  • Loading branch information
willnorris and ChibangLW committed May 9, 2024
1 parent c1c65b6 commit a92d1bc
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 9 deletions.
16 changes: 16 additions & 0 deletions app.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ type App struct {
// DefaultAuthKey is the default auth key to use for Tailscale if no other auth key is specified.
DefaultAuthKey string `json:"auth_key,omitempty" caddy:"namespace=tailscale.auth_key"`

// ControlURL specifies the default control URL to use for nodes.
ControlURL string `json:"control_url,omitempty" caddy:"namespace=tailscale.control_url"`

// Ephemeral specifies whether Tailscale nodes should be registered as ephemeral.
Ephemeral bool `json:"ephemeral,omitempty" caddy:"namespace=tailscale.ephemeral"`

Expand All @@ -38,6 +41,9 @@ type Node struct {
// AuthKey is the Tailscale auth key used to register the node.
AuthKey string `json:"auth_key,omitempty" caddy:"namespace=auth_key"`

// ControlURL specifies the control URL to use for the node.
ControlURL string `json:"control_url,omitempty" caddy:"namespace=tailscale.control_url"`

// Ephemeral specifies whether the node should be registered as ephemeral.
Ephemeral bool `json:"ephemeral,omitempty" caddy:"namespace=tailscale.ephemeral"`

Expand Down Expand Up @@ -82,6 +88,11 @@ func parseAppConfig(d *caddyfile.Dispenser, _ any) (any, error) {
return nil, d.ArgErr()
}
app.DefaultAuthKey = d.Val()
case "control_url":
if !d.NextArg() {
return nil, d.ArgErr()
}
app.ControlURL = d.Val()
case "ephemeral":
app.Ephemeral = true
default:
Expand Down Expand Up @@ -119,6 +130,11 @@ func parseNodeConfig(d *caddyfile.Dispenser) (Node, error) {
return node, segment.ArgErr()
}
node.AuthKey = segment.Val()
case "control_url":
if !segment.NextArg() {
return node, segment.ArgErr()
}
node.ControlURL = segment.Val()
case "ephemeral":
node.Ephemeral = true
default:
Expand Down
22 changes: 13 additions & 9 deletions module.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,10 @@ func getNode(ctx caddy.Context, name string) (*tailscaleNode, error) {
}

if s.AuthKey, err = getAuthKey(name, app); err != nil {
app.logger.Warn("error parsing auth key", zap.Error(err))
return nil, err
}
if s.ControlURL, err = getControlURL(name, app); err != nil {
return nil, err
}

if name != "" {
Expand Down Expand Up @@ -142,10 +145,6 @@ func getNode(ctx caddy.Context, name string) (*tailscaleNode, error) {
var repl = caddy.NewReplacer()

func getAuthKey(name string, app *App) (string, error) {
if app == nil {
return "", nil
}

if node, ok := app.Nodes[name]; ok {
if node.AuthKey != "" {
return repl.ReplaceOrErr(node.AuthKey, true, true)
Expand All @@ -167,14 +166,19 @@ func getAuthKey(name string, app *App) (string, error) {
return os.Getenv("TS_AUTHKEY"), nil
}

func getEphemeral(name string, app *App) bool {
if app == nil {
return false
func getControlURL(name string, app *App) (string, error) {
if node, ok := app.Nodes[name]; ok {
if node.ControlURL != "" {
return repl.ReplaceOrErr(node.ControlURL, true, true)
}
}
return repl.ReplaceOrErr(app.ControlURL, true, true)
}

func getEphemeral(name string, app *App) bool {
if node, ok := app.Nodes[name]; ok {
return node.Ephemeral
}

return app.Ephemeral
}

Expand Down

0 comments on commit a92d1bc

Please sign in to comment.