Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions cmd/extensions.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"path/filepath"
"time"

"github.com/kernel/cli/pkg/extensions"
"github.com/kernel/cli/pkg/util"
"github.com/kernel/kernel-go-sdk"
"github.com/kernel/kernel-go-sdk/option"
Expand Down Expand Up @@ -422,12 +423,60 @@ var extensionsUploadCmd = &cobra.Command{
},
}

var extensionsBuildWebBotAuthCmd = &cobra.Command{
Use: "build-web-bot-auth",
Short: "Build the Cloudflare web-bot-auth extension for Kernel",
Long: `Download, build, and prepare the Cloudflare web-bot-auth extension with Kernel-specific configurations.
Defaults to RFC9421 test key (works with Cloudflare's test site).
Uploads it to Kernel as 'web-bot-auth'. Optionally accepts a custom JWK or PEM key file.`,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
output, _ := cmd.Flags().GetString("to")
url, _ := cmd.Flags().GetString("url")
keyPath, _ := cmd.Flags().GetString("key")
uploadName, _ := cmd.Flags().GetString("upload")

// Use upload name for extension name, or default to "web-bot-auth"
extensionName := "web-bot-auth"
if uploadName != "" {
extensionName = uploadName
}

// Build the extension
result, err := extensions.BuildWebBotAuth(cmd.Context(), extensions.ExtensionsBuildWebBotAuthInput{
Output: output,
HostURL: url,
KeyPath: keyPath,
ExtensionName: extensionName,
AutoUpload: uploadName != "",
})
if err != nil {
return err
}

// Upload if requested
if uploadName != "" {
client := getKernelClient(cmd)
svc := client.Extensions
e := ExtensionsCmd{extensions: &svc}
pterm.Info.Println("Uploading extension to Kernel...")
return e.Upload(cmd.Context(), ExtensionsUploadInput{
Dir: result.OutputDir,
Name: extensionName,
})
}

return nil
},
}

func init() {
extensionsCmd.AddCommand(extensionsListCmd)
extensionsCmd.AddCommand(extensionsDeleteCmd)
extensionsCmd.AddCommand(extensionsDownloadCmd)
extensionsCmd.AddCommand(extensionsDownloadWebStoreCmd)
extensionsCmd.AddCommand(extensionsUploadCmd)
extensionsCmd.AddCommand(extensionsBuildWebBotAuthCmd)

extensionsListCmd.Flags().StringP("output", "o", "", "Output format: json for raw API response")
extensionsDeleteCmd.Flags().BoolP("yes", "y", false, "Skip confirmation prompt")
Expand All @@ -436,4 +485,8 @@ func init() {
extensionsDownloadWebStoreCmd.Flags().String("os", "", "Target OS: mac, win, or linux (default linux)")
extensionsUploadCmd.Flags().StringP("output", "o", "", "Output format: json for raw API response")
extensionsUploadCmd.Flags().String("name", "", "Optional unique extension name")
extensionsBuildWebBotAuthCmd.Flags().String("to", "./web-bot-auth", "Output directory for the prepared extension")
extensionsBuildWebBotAuthCmd.Flags().String("url", "http://127.0.0.1:10001", "Base URL for update.xml and policy templates")
extensionsBuildWebBotAuthCmd.Flags().String("key", "", "Path to Ed25519 private key file (JWK or PEM format)")
extensionsBuildWebBotAuthCmd.Flags().String("upload", "", "Upload extension to Kernel with specified name (e.g., --upload web-bot-auth)")
}
Loading