diff --git a/scbctl/cmd/root.go b/scbctl/cmd/root.go new file mode 100644 index 0000000000..a9ddf55148 --- /dev/null +++ b/scbctl/cmd/root.go @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: the secureCodeBox authors +// +// SPDX-License-Identifier: Apache-2.0 +package cmd + +import ( + kubernetes "github.com/secureCodeBox/secureCodeBox/scbctl/pkg" + "github.com/spf13/cobra" + "k8s.io/cli-runtime/pkg/genericclioptions" +) + +var kubeconfigArgs = genericclioptions.NewConfigFlags(false) + +var ( + clientProvider kubernetes.ClientProvider = &kubernetes.DefaultClientProvider{} +) + +func NewRootCommand() *cobra.Command { + rootCmd := &cobra.Command{ + Use: "scbctl", + Short: "cli app to manage scans & other secureCodeBox resources", + Long: ``, + } + kubeconfigArgs.AddFlags(rootCmd.PersistentFlags()) + + rootCmd.AddCommand(NewScanCommand()) + + return rootCmd +} diff --git a/scbctl/cmd/scans.go b/scbctl/cmd/scans.go index 84e0bdc35c..a46da6abf9 100644 --- a/scbctl/cmd/scans.go +++ b/scbctl/cmd/scans.go @@ -4,93 +4,90 @@ package cmd import ( - "context" - "errors" "fmt" "strings" v1 "github.com/secureCodeBox/secureCodeBox/operator/apis/execution/v1" - kubernetes "github.com/secureCodeBox/secureCodeBox/scbctl/pkg" + "github.com/spf13/cobra" metav2 "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/cli-runtime/pkg/genericclioptions" ) -var ( - kubeconfigArgs = genericclioptions.NewConfigFlags(false) - clientProvider kubernetes.ClientProvider = &kubernetes.DefaultClientProvider{} - scheme = runtime.NewScheme() -) +func NewScanCommand() *cobra.Command { + scanCmd := &cobra.Command{ + Use: "scan [scanType] -- [parameters...]", + Short: "Create a new scan", + Long: `Create a new Scan custom resource in the the current namespace`, + Args: cobra.MinimumNArgs(1), + Example: ` + # Create a new scan + scbctl scan nmap -- scanme.nmap.org + + # Create a scan with a custom name + scbctl scan nmap --name scanme-nmap-org -- scanme.nmap.org + + # Create a with a different scan type + scbctl scan nuclei -- -target example.com + + # Create in a different namespace + scbctl scan --namespace foobar nmap -- -p 80 scanme.nmap.org + `, + SilenceUsage: true, + RunE: func(cmd *cobra.Command, args []string) error { + scanType := args[0] + + scanName := scanType + if name, err := cmd.Flags().GetString("name"); err == nil && name != "" { + scanName = name + } + paramIndex := cmd.ArgsLenAtDash() + if paramIndex == -1 { + return fmt.Errorf("you must use '--' to separate scan parameters") + } -func init() { - utilruntime.Must(v1.AddToScheme(scheme)) - ScanCmd.Flags().StringP("namespace", "n", "", "Namespace in which to create the scan") -} + parameters := args[paramIndex:] + + kubeclient, namespace, err := clientProvider.GetClient(kubeconfigArgs) + if err != nil { + return fmt.Errorf("error initializing kubernetes client. your kubeconfig is likely malformed or invalid. %s", err) + } + + if namespaceFlag, err := cmd.Flags().GetString("namespace"); err == nil && namespaceFlag != "" { + namespace = namespaceFlag + } -var ScanCmd = &cobra.Command{ - Use: "scan [name] -- [parameters...]", - Short: "Create a new scanner", - Long: `Create a new execution (Scan) in the default namespace if no namespace is provided`, - Example: ` - # Create a new scan - scbctl scan nmap - # Create in a different namespace - scbctl scan --namespace foobar nmap -- scanme.nmap.org -p 90 - `, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - - scanName := args[0] - paramIndex := cmd.ArgsLenAtDash() - if paramIndex == -1 { - return errors.New("You must use '--' to separate scan parameters") - } - - parameters := args[paramIndex:] - - fmt.Println("🎬 Initializing Kubernetes client") - - kubeclient, namespace, err := clientProvider.GetClient(kubeconfigArgs) - if err != nil { - return fmt.Errorf("Error initializing Kubernetes client: %s", err) - } - - if namespaceFlag, err := cmd.Flags().GetString("namespace"); err == nil && namespaceFlag != "" { - namespace = namespaceFlag - } - - fmt.Printf("🆕 Creating a new scan with name '%s' and parameters '%s'\n", scanName, strings.Join(parameters, " ")) - - scan := &v1.Scan{ - TypeMeta: metav1.TypeMeta{ - Kind: "Scan", - APIVersion: "execution.securecodebox.io/v1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: scanName, - Namespace: namespace, - }, - Spec: v1.ScanSpec{ - ScanType: scanName, - Parameters: parameters, - }, - } - - fmt.Println("🔁 Launching the scan") - - err = kubeclient.Create(context.TODO(), scan) - if err != nil { - if metav2.IsNotFound(err) { - return fmt.Errorf("failed to create Scan: namespace '%s' not found", namespace) + fmt.Printf("🆕 Creating a new scan with name '%s' and parameters '%s'\n", scanName, strings.Join(parameters, " ")) + + scan := &v1.Scan{ + TypeMeta: metav1.TypeMeta{ + Kind: "Scan", + APIVersion: "execution.securecodebox.io/v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: scanName, + Namespace: namespace, + }, + Spec: v1.ScanSpec{ + ScanType: scanType, + Parameters: parameters, + }, } - return fmt.Errorf("Failed to create Scan: %s", err) - } - fmt.Printf("🚀 Successfully created a new Scan '%s'\n", args[0]) - return nil + err = kubeclient.Create(cmd.Context(), scan) + if err != nil { + if metav2.IsNotFound(err) { + return fmt.Errorf("failed to create Scan: namespace '%s' not found", namespace) + } + return fmt.Errorf("failed to create scan: %s", err) + } + + fmt.Printf("🚀 Successfully created a new Scan '%s'\n", scanName) + return nil + }, + } + + scanCmd.Flags().String("name", "", "Name of the created scan. If no name is provided, the ScanType will be used as the name") - }, + return scanCmd } diff --git a/scbctl/cmd/scans_test.go b/scbctl/cmd/scans_test.go index 99fd7fccf6..7a9ce03161 100644 --- a/scbctl/cmd/scans_test.go +++ b/scbctl/cmd/scans_test.go @@ -9,7 +9,7 @@ import ( "testing" v1 "github.com/secureCodeBox/secureCodeBox/operator/apis/execution/v1" - "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/cli-runtime/pkg/genericclioptions" @@ -27,39 +27,95 @@ func (m *MockClientProvider) GetClient(_ *genericclioptions.ConfigFlags) (client return m.Client, m.namespace, m.err } -func TestScanCommand(t *testing.T) { - scheme := runtime.NewScheme() - utilruntime.Must(v1.AddToScheme(scheme)) +type testcase struct { + name string + args []string + expectedError error + expectedScan *expectedScan +} - testcases := []struct { - name string - args []string - expectedError error - }{ +type expectedScan struct { + name string + scanType string + namespace string + parameters []string +} + +func TestScanCommand(t *testing.T) { + testcases := []testcase{ { - name: "Valid entry ", - args: []string{"nmap", "--", "scanme.nmap.org"}, + name: "Should create nmap scan with a single parameter", + args: []string{"scan", "nmap", "--", "scanme.nmap.org"}, expectedError: nil, + expectedScan: &expectedScan{ + name: "nmap", + scanType: "nmap", + namespace: "default", + parameters: []string{"scanme.nmap.org"}, + }, }, { - name: "Valid entry with multiple parameters", - args: []string{"nmap", "--", "scanme.nmap.org", "-p", "90"}, + name: "Should create nmap scan with multiple parameters", + args: []string{"scan", "nmap", "--", "scanme.nmap.org", "-p", "90"}, expectedError: nil, + expectedScan: &expectedScan{ + name: "nmap", + scanType: "nmap", + namespace: "default", + parameters: []string{"scanme.nmap.org", "-p", "90"}, + }, }, { - name: "Valid entry with namespace", + name: "Should use --name flag as the name of the scan if provided", + args: []string{"scan", "--name", "scanme-nmap-org", "nmap", "--", "scanme.nmap.org"}, + expectedError: nil, + expectedScan: &expectedScan{ + scanType: "nmap", + name: "scanme-nmap-org", + namespace: "default", + parameters: []string{"scanme.nmap.org"}, + }, + }, + { + name: "Should create nmap in a custom namespace", args: []string{"scan", "--namespace", "foobar", "nmap", "--", "scanme.nmap.org"}, expectedError: nil, + expectedScan: &expectedScan{ + name: "nmap", + scanType: "nmap", + namespace: "foobar", + parameters: []string{"scanme.nmap.org"}, + }, + }, + { + name: "Flags provided after the `--` seperator should be passed as parameters, not flags", + args: []string{"scan", "--namespace", "foobar", "kubeaudit", "--", "--namespace", "some-other-namespace"}, + expectedError: nil, + expectedScan: &expectedScan{ + name: "kubeaudit", + scanType: "kubeaudit", + namespace: "foobar", + parameters: []string{"--namespace", "some-other-namespace"}, + }, }, { - name: "No scan parameters provided", - args: []string{"nmap"}, - expectedError: errors.New("You must use '--' to separate scan parameters"), + name: "Should throw an error when no parameters are provided", + args: []string{"scan", "nmap"}, + expectedError: errors.New("you must use '--' to separate scan parameters"), + expectedScan: nil, + }, + { + name: "Should throw an error when no `--` separator is used before the scan parameters", + args: []string{"scan", "nmap", "scanme.nmap.org"}, + expectedError: errors.New("you must use '--' to separate scan parameters"), + expectedScan: nil, }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { + scheme := runtime.NewScheme() + utilruntime.Must(v1.AddToScheme(scheme)) client := fake.NewClientBuilder().WithScheme(scheme).Build() clientProvider = &MockClientProvider{ Client: client, @@ -67,38 +123,28 @@ func TestScanCommand(t *testing.T) { err: nil, } - cmd := &cobra.Command{ - Use: ScanCmd.Use, - Short: ScanCmd.Short, - Long: ScanCmd.Long, - Example: ScanCmd.Example, - RunE: ScanCmd.RunE, - } + rootCmd := NewRootCommand() - cmd.Flags().AddFlagSet(ScanCmd.Flags()) + rootCmd.SetArgs(tc.args) + rootCmd.SilenceUsage = true - cmd.SetArgs(tc.args) - cmd.SilenceUsage = true + err := rootCmd.Execute() - err := cmd.Execute() - if tc.expectedError != nil { - if err == nil || err.Error() != tc.expectedError.Error() { - t.Errorf("expected error: %v, got: %v", tc.expectedError, err) - } - } else if err != nil { - t.Errorf("expected no error, but got: %v", err) - } + assert.Equal(t, tc.expectedError, err, "error returned by scan should match") - if tc.expectedError == nil { + if tc.expectedScan != nil { scans := &v1.ScanList{} - if listErr := client.List(context.Background(), scans); listErr != nil { - t.Fatalf("failed to list scans: %v", listErr) - } - if len(scans.Items) != 1 { - t.Fatalf("expected 1 scan to created but got %d", len(scans.Items)) - } - } + listErr := client.List(context.Background(), scans) + assert.Nil(t, listErr, "failed to list scans") + assert.Len(t, scans.Items, 1, "expected 1 scan to be created") + scan := scans.Items[0] + + assert.Equal(t, tc.expectedScan.name, scan.Name) + assert.Equal(t, tc.expectedScan.namespace, scan.Namespace) + assert.Equal(t, tc.expectedScan.scanType, scan.Spec.ScanType) + assert.Equal(t, tc.expectedScan.parameters, scan.Spec.Parameters) + } }) } } diff --git a/scbctl/go.mod b/scbctl/go.mod index a3897b023d..126673c5b9 100644 --- a/scbctl/go.mod +++ b/scbctl/go.mod @@ -7,7 +7,16 @@ go 1.22.0 toolchain go1.22.3 -require sigs.k8s.io/controller-runtime v0.18.4 +require ( + github.com/secureCodeBox/secureCodeBox/operator v0.0.0-20240603123116-d52caf587550 + github.com/spf13/cobra v1.7.0 + k8s.io/api v0.30.1 + k8s.io/apimachinery v0.30.1 + k8s.io/cli-runtime v0.30.1 + sigs.k8s.io/controller-runtime v0.18.4 +) + +require github.com/stretchr/testify v1.8.4 require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect @@ -41,8 +50,7 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/secureCodeBox/secureCodeBox/operator v0.0.0-20240603123116-d52caf587550 - github.com/spf13/cobra v1.7.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/xlab/treeprint v1.2.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect @@ -58,9 +66,6 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.30.1 // indirect - k8s.io/apimachinery v0.30.1 // indirect - k8s.io/cli-runtime v0.30.1 // indirect k8s.io/client-go v0.30.1 // indirect k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect diff --git a/scbctl/go.sum b/scbctl/go.sum index 860a94e048..1618e5a38b 100644 --- a/scbctl/go.sum +++ b/scbctl/go.sum @@ -9,6 +9,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -16,8 +18,6 @@ github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxER github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= @@ -26,12 +26,16 @@ github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxI github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -58,17 +62,19 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -80,8 +86,11 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm 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= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= @@ -98,37 +107,56 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= +github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= +github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= +github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/secureCodeBox/secureCodeBox/operator v0.0.0-20240603123116-d52caf587550 h1:LoDWFat5Y9maj3D32x6VJd+BC4ZOGeX1caVcJsn0DPQ= github.com/secureCodeBox/secureCodeBox/operator v0.0.0-20240603123116-d52caf587550/go.mod h1:n80o6zgDki2s2qODX2p0ipn0xKqP8jnOPQB6vFyDMBY= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -146,8 +174,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -184,6 +210,8 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -209,6 +237,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -223,6 +252,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= +k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= +k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= k8s.io/cli-runtime v0.30.1 h1:kSBBpfrJGS6lllc24KeniI9JN7ckOOJKnmFYH1RpTOw= diff --git a/scbctl/main.go b/scbctl/main.go index d8d8c7d900..8c236f60d2 100644 --- a/scbctl/main.go +++ b/scbctl/main.go @@ -7,28 +7,19 @@ import ( "os" "github.com/secureCodeBox/secureCodeBox/scbctl/cmd" - "github.com/spf13/cobra" v1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/cli-runtime/pkg/genericclioptions" ) -var kubeconfigArgs = genericclioptions.NewConfigFlags(false) var scheme = runtime.NewScheme() -var rootCmd = &cobra.Command{ - Use: "scbctl", - Short: "cli app to manage scans & other secureCodeBox resources", - Long: ``, -} - func init() { utilruntime.Must(v1.AddToScheme(scheme)) - rootCmd.AddCommand(cmd.ScanCmd) - kubeconfigArgs.AddFlags(rootCmd.PersistentFlags()) } + func main() { + rootCmd := cmd.NewRootCommand() err := rootCmd.Execute() if err != nil { os.Exit(1)