diff --git a/__debug_bin b/__debug_bin new file mode 100755 index 0000000..61119f0 Binary files /dev/null and b/__debug_bin differ diff --git a/cmd/root.go b/cmd/root.go index 01e71f5..1af773d 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -6,6 +6,7 @@ import ( "github.com/k8sgpt-ai/k8sgpt/cmd/filters" "github.com/k8sgpt-ai/k8sgpt/cmd/generate" + "github.com/k8sgpt-ai/k8sgpt/cmd/serve" "k8s.io/client-go/util/homedir" "github.com/fatih/color" @@ -54,13 +55,14 @@ func init() { rootCmd.AddCommand(analyze.AnalyzeCmd) rootCmd.AddCommand(filters.FiltersCmd) rootCmd.AddCommand(generate.GenerateCmd) + rootCmd.AddCommand(serve.ServeCmd) rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.k8sgpt.yaml)") rootCmd.PersistentFlags().StringVar(&kubecontext, "kubecontext", "", "Kubernetes context to use. Only required if out-of-cluster.") rootCmd.PersistentFlags().StringVar(&kubeconfig, "kubeconfig", kubeconfigPath, "Path to a kubeconfig. Only required if out-of-cluster.") // Cobra also supports local flags, which will only run // when this action is called directly. // rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") - + viper.Set("rootCmd", rootCmd) } // initConfig reads in config file and ENV variables if set. diff --git a/cmd/serve/serve.go b/cmd/serve/serve.go new file mode 100644 index 0000000..c04d5b8 --- /dev/null +++ b/cmd/serve/serve.go @@ -0,0 +1,54 @@ +package serve + +import ( + "io/ioutil" + "log" + "net/http" + "os" + + "github.com/julienschmidt/httprouter" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var ( + port string +) + +// generateCmd represents the auth command +var ServeCmd = &cobra.Command{ + Use: "serve", + Short: "", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + + rootCmd := viper.Get("rootCmd").(*cobra.Command) + // Start http server + router := httprouter.New() + router.GET("/:command", func(w http.ResponseWriter, + r *http.Request, p httprouter.Params) { + + // find the command + command := p.ByName("command") + cmd, string, err := rootCmd.Find([]string{command}) + if err != nil { + w.Write([]byte(err.Error())) + } + old := os.Stdout // keep backup of the real stdout + rd, d, _ := os.Pipe() + os.Stdout = d + cmd.Run(cmd, string) + d.Close() + out, _ := ioutil.ReadAll(rd) + os.Stdout = old // restoring the real stdout + w.Write(out) + }) + + log.Fatal(http.ListenAndServe(":8080", router)) + }, +} + +func init() { + // add flag for backend + ServeCmd.Flags().StringVarP(&port, "port", "p", "8080", "Port to serve on") +} diff --git a/cmd/version.go b/cmd/version.go index 2ad6faf..d9c6057 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -1,6 +1,8 @@ package cmd import ( + "fmt" + "github.com/spf13/cobra" ) @@ -10,7 +12,7 @@ var versionCmd = &cobra.Command{ Short: "Print the version number of k8sgpt", Long: `All software has versions. This is k8sgpt's`, Run: func(cmd *cobra.Command, args []string) { - cmd.Printf("k8sgpt version %s", version) + fmt.Printf("k8sgpt version %s", version) }, } diff --git a/go.mod b/go.mod index 6c428ed..99d4371 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.8.2 + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa golang.org/x/term v0.7.0 k8s.io/api v0.26.3 k8s.io/apimachinery v0.26.3 @@ -36,6 +37,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.18 // indirect diff --git a/go.sum b/go.sum index 2ef6601..bc0f44b 100644 --- a/go.sum +++ b/go.sum @@ -174,6 +174,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -279,6 +281,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=