diff --git a/CHANGES.md b/CHANGES.md index 953ea9c3..bf4c8358 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,9 +10,10 @@ ## 2021.5.8 ### New Features - When creating a DNS record to point a hostname at a tunnel, you can now use --overwrite-dns to overwrite any existing - DNS records with that hostname. This works when using the CLI to provision DNS, and when starting an adhoc tunnel, e.g. - - `cloudflared route --overwrite-dns dns foo foo.example.com` - - `cloudflared tunnel --overwrite-dns --name foo --hostname foo.example.com` + DNS records with that hostname. This works both when using the CLI to provision DNS, as well as when starting an adhoc + named tunnel, e.g.: + - `cloudflared tunnel route dns --overwrite-dns foo-tunnel foo.example.com` + - `cloudflared tunnel --overwrite-dns --name foo-tunnel --hostname foo.example.com` ## 2021.5.7 ### New Features diff --git a/cmd/cloudflared/tunnel/subcommands.go b/cmd/cloudflared/tunnel/subcommands.go index 66bd59b7..933b11bb 100644 --- a/cmd/cloudflared/tunnel/subcommands.go +++ b/cmd/cloudflared/tunnel/subcommands.go @@ -655,7 +655,6 @@ func cleanupCommand(c *cli.Context) error { func buildRouteCommand() *cli.Command { return &cli.Command{ Name: "route", - Action: cliutil.ConfiguredAction(routeCommand), Usage: "Define which traffic routed from Cloudflare edge to this tunnel: requests to a DNS hostname, to a Cloudflare Load Balancer, or traffic originating from Cloudflare WARP clients", UsageText: "cloudflared tunnel [tunnel command options] route [subcommand options] [dns TUNNEL HOSTNAME]|[lb TUNNEL HOSTNAME LB-POOL]|[ip NETWORK TUNNEL]", Description: `The route command defines how Cloudflare will proxy requests to this tunnel. @@ -675,16 +674,30 @@ Further information about managing Cloudflare WARP traffic to your tunnel is ava `, CustomHelpTemplate: commandHelpTemplate(), Subcommands: []*cli.Command{ + { + Name: "dns", + Action: cliutil.ConfiguredAction(routeDnsCommand), + Usage: "Route a hostname by creating a DNS CNAME record to a tunnel", + UsageText: "cloudflared tunnel route dns [TUNNEL] [HOSTNAME]", + Description: `Creates a DNS CNAME record hostname that points to the tunnel.`, + Flags: []cli.Flag{overwriteDNSFlag}, + }, + { + Name: "lb", + Action: cliutil.ConfiguredAction(routeLbCommand), + Usage: "Use this tunnel as a load balancer origin, creating pool and load balancer if necessary", + UsageText: "cloudflared tunnel route dns [TUNNEL] [HOSTNAME] [LB-POOL]", + Description: `Creates Load Balancer with an origin pool that points to the tunnel.`, + }, buildRouteIPSubcommand(), }, - Flags: []cli.Flag{overwriteDNSFlag}, } } func dnsRouteFromArg(c *cli.Context, overwriteExisting bool) (tunnelstore.Route, error) { const ( - userHostnameIndex = 2 - expectedNArgs = 3 + userHostnameIndex = 1 + expectedNArgs = 2 ) if c.NArg() != expectedNArgs { return nil, cliutil.UsageError("Expected %d arguments, got %d", expectedNArgs, c.NArg()) @@ -700,9 +713,9 @@ func dnsRouteFromArg(c *cli.Context, overwriteExisting bool) (tunnelstore.Route, func lbRouteFromArg(c *cli.Context) (tunnelstore.Route, error) { const ( - lbNameIndex = 2 - lbPoolIndex = 3 - expectedNArgs = 4 + lbNameIndex = 1 + lbPoolIndex = 2 + expectedNArgs = 3 ) if c.NArg() != expectedNArgs { return nil, cliutil.UsageError("Expected %d arguments, got %d", expectedNArgs, c.NArg()) @@ -744,41 +757,39 @@ func validateHostname(s string, allowWildcardSubdomain bool) bool { return err == nil && validateName(puny, allowWildcardSubdomain) } -func routeCommand(c *cli.Context) error { - if c.NArg() < 2 { - return cliutil.UsageError(`"cloudflared tunnel route" requires the first argument to be the route type(dns or lb), followed by the ID or name of the tunnel`) +func routeDnsCommand(c *cli.Context) error { + if c.NArg() != 2 { + return cliutil.UsageError(`This command expects the format "cloudflared tunnel route dns "`) } + return routeCommand(c, "dns") +} + +func routeLbCommand(c *cli.Context) error { + if c.NArg() != 3 { + return cliutil.UsageError(`This command expects the format "cloudflared tunnel route lb "`) + } + return routeCommand(c, "lb") +} + +func routeCommand(c *cli.Context, routeType string) error { sc, err := newSubcommandContext(c) if err != nil { return err } - const tunnelIDIndex = 1 - - routeType := c.Args().First() + tunnelID, err := sc.findID(c.Args().Get(0)) + if err != nil { + return err + } var route tunnelstore.Route - var tunnelID uuid.UUID switch routeType { case "dns": - tunnelID, err = sc.findID(c.Args().Get(tunnelIDIndex)) - if err != nil { - return err - } route, err = dnsRouteFromArg(c, c.Bool(overwriteDNSFlagName)) - if err != nil { - return err - } case "lb": - tunnelID, err = sc.findID(c.Args().Get(tunnelIDIndex)) - if err != nil { - return err - } route, err = lbRouteFromArg(c) - if err != nil { - return err - } - default: - return cliutil.UsageError("%s is not a recognized route type. Supported route types are dns and lb", routeType) + } + if err != nil { + return err } res, err := sc.route(tunnelID, route)