package cli import ( "context" "fmt" v1 "github.com/juanfont/headscale/gen/go/headscale/v1" "github.com/juanfont/headscale/hscontrol/types" "github.com/spf13/cobra" ) // Error is used to compare errors as per https://dave.cheney.net/2016/04/07/constant-errors type Error string func (e Error) Error() string { return string(e) } func init() { rootCmd.AddCommand(debugCmd) createNodeCmd.Flags().StringP("name", "", "", "Name") createNodeCmd.Flags().StringP("user", "u", "", "User") createNodeCmd.Flags().StringP("namespace", "n", "", "User") createNodeNamespaceFlag := createNodeCmd.Flags().Lookup("namespace") createNodeNamespaceFlag.Deprecated = deprecateNamespaceMessage createNodeNamespaceFlag.Hidden = true createNodeCmd.Flags().StringP("key", "k", "", "Key") mustMarkRequired(createNodeCmd, "name", "user", "key") createNodeCmd.Flags(). StringSliceP("route", "r", []string{}, "List (or repeated flags) of routes to advertise") debugCmd.AddCommand(createNodeCmd) } var debugCmd = &cobra.Command{ Use: "debug", Short: "debug and testing commands", Long: "debug contains extra commands used for debugging and testing headscale", } var createNodeCmd = &cobra.Command{ Use: "create-node", Short: "Create a node that can be registered with `nodes register <>` command", RunE: grpcRunE(func(ctx context.Context, client v1.HeadscaleServiceClient, cmd *cobra.Command, args []string) error { user, err := cmd.Flags().GetString("user") if err != nil { return fmt.Errorf("getting user flag: %w", err) } name, err := cmd.Flags().GetString("name") if err != nil { return fmt.Errorf("getting name flag: %w", err) } registrationID, err := cmd.Flags().GetString("key") if err != nil { return fmt.Errorf("getting key flag: %w", err) } _, err = types.RegistrationIDFromString(registrationID) if err != nil { return fmt.Errorf("parsing machine key: %w", err) } routes, err := cmd.Flags().GetStringSlice("route") if err != nil { return fmt.Errorf("getting routes flag: %w", err) } request := &v1.DebugCreateNodeRequest{ Key: registrationID, Name: name, User: user, Routes: routes, } response, err := client.DebugCreateNode(ctx, request) if err != nil { return fmt.Errorf("creating node: %w", err) } return printOutput(cmd, response.GetNode(), "Node created") }), }