mirror of https://github.com/tailscale/tailscale/
cmd/tailscale,ipn,tailcfg: add `tailscale advertise` subcommand behind envknob (#13734)
Signed-off-by: Naman Sood <mail@nsood.in>bradfitz/ssh_config_from_env
parent
d32d742af0
commit
22c89fcb19
@ -0,0 +1,78 @@
|
|||||||
|
// Copyright (c) Tailscale Inc & AUTHORS
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
package cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/peterbourgon/ff/v3/ffcli"
|
||||||
|
"tailscale.com/envknob"
|
||||||
|
"tailscale.com/ipn"
|
||||||
|
"tailscale.com/tailcfg"
|
||||||
|
)
|
||||||
|
|
||||||
|
var advertiseArgs struct {
|
||||||
|
services string // comma-separated list of services to advertise
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(naman): This flag may move to set.go or serve_v2.go after the WIPCode
|
||||||
|
// envknob is not needed.
|
||||||
|
var advertiseCmd = &ffcli.Command{
|
||||||
|
Name: "advertise",
|
||||||
|
ShortUsage: "tailscale advertise --services=<services>",
|
||||||
|
ShortHelp: "Advertise this node as a destination for a service",
|
||||||
|
Exec: runAdvertise,
|
||||||
|
FlagSet: (func() *flag.FlagSet {
|
||||||
|
fs := newFlagSet("advertise")
|
||||||
|
fs.StringVar(&advertiseArgs.services, "services", "", "comma-separated services to advertise; each must start with \"svc:\" (e.g. \"svc:idp,svc:nas,svc:database\")")
|
||||||
|
return fs
|
||||||
|
})(),
|
||||||
|
}
|
||||||
|
|
||||||
|
func maybeAdvertiseCmd() []*ffcli.Command {
|
||||||
|
if !envknob.UseWIPCode() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return []*ffcli.Command{advertiseCmd}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runAdvertise(ctx context.Context, args []string) error {
|
||||||
|
if len(args) > 0 {
|
||||||
|
return flag.ErrHelp
|
||||||
|
}
|
||||||
|
|
||||||
|
services, err := parseServiceNames(advertiseArgs.services)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = localClient.EditPrefs(ctx, &ipn.MaskedPrefs{
|
||||||
|
AdvertiseServicesSet: true,
|
||||||
|
Prefs: ipn.Prefs{
|
||||||
|
AdvertiseServices: services,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseServiceNames takes a comma-separated list of service names
|
||||||
|
// (eg. "svc:hello,svc:webserver,svc:catphotos"), splits them into
|
||||||
|
// a list and validates each service name. If valid, it returns
|
||||||
|
// the service names in a slice of strings.
|
||||||
|
func parseServiceNames(servicesArg string) ([]string, error) {
|
||||||
|
var services []string
|
||||||
|
if servicesArg != "" {
|
||||||
|
services = strings.Split(servicesArg, ",")
|
||||||
|
for _, svc := range services {
|
||||||
|
err := tailcfg.CheckServiceName(svc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("service %q: %s", svc, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return services, nil
|
||||||
|
}
|
Loading…
Reference in New Issue