diff --git a/cliHelpers/chalDeployerService/deleteChal.go b/cliHelpers/chalDeployerService/deleteChal.go new file mode 100644 index 00000000..7ce7ec58 --- /dev/null +++ b/cliHelpers/chalDeployerService/deleteChal.go @@ -0,0 +1,32 @@ +package chalDeployerService + +import ( + "fmt" + "log" + + "github.com/spf13/cobra" + + g "github.com/sdslabs/katana/configs" +) + +// still have to test this [WIP] + +var DelChalCmd = &cobra.Command{ + Use: "delete-chal", + Short: "Run the Challenge Delete command", + Long: "Deletes the Challenge", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + challengeID := args[0] + g.LoadConfiguration(); + g.LoadKubeElements(); + + if err := DeleteChallenge(challengeID); err != nil { + log.Printf("Error deleting the challenge with ID %s: %v", challengeID, err) + return fmt.Errorf("failed to delete challenge: %v", err) + } + + log.Printf("Challenge with ID %s deleted successfully", challengeID) + return nil + }, +} diff --git a/cliHelpers/chalDeployerService/deployChal.go b/cliHelpers/chalDeployerService/deployChal.go new file mode 100644 index 00000000..b037d961 --- /dev/null +++ b/cliHelpers/chalDeployerService/deployChal.go @@ -0,0 +1,27 @@ +package chalDeployerService + +import ( + "log" + + "github.com/spf13/cobra" + + g "github.com/sdslabs/katana/configs" +) + +// still have to test this [WIP] + +var DeployChalCmd = &cobra.Command{ + Use: "chal-deploy", + Short: "Run the Challenge Deploy command", + Long: "Runs the challenge deploy", + RunE: func(cmd *cobra.Command, args []string) error { + g.LoadConfiguration(); + g.LoadKubeElements(); + if err := DeployChallenge(); err != nil { + log.Println("Error deploying the challenge:", err) + return err + } + log.Println("Challenge deployed successfully") + return nil + }, +} diff --git a/cliHelpers/chalDeployerService/helper.go b/cliHelpers/chalDeployerService/helper.go new file mode 100644 index 00000000..e1896556 --- /dev/null +++ b/cliHelpers/chalDeployerService/helper.go @@ -0,0 +1,191 @@ +package chalDeployerService + +import ( + "context" + "log" + "os" + "strconv" + "strings" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/sdslabs/katana/configs" + g "github.com/sdslabs/katana/configs" + "github.com/sdslabs/katana/lib/deployment" + "github.com/sdslabs/katana/lib/utils" + "github.com/sdslabs/katana/services/challengedeployerservice" +) + +func DeployChallenge() error { + patch := false + replicas := int32(1) + challengeType := "web" + log.Println("Starting") + + katanaDir, err := utils.GetKatanaRootPath() + if err != nil { + return err + } + challengesDir:=katanaDir+"/challenges" + + //Read folder challenge by os + dir, err := os.Open(challengesDir) + + //Loop over all subfolders in the challenge folder + if err != nil { + log.Println("Error in opening challenges folder") + return err + } + defer dir.Close() + + //Read all challenges in the folder + fileInfos, err := dir.Readdir(-1) + if err != nil { + log.Println("Error in reading challenges folder") + return err + } + + res := make([][]string, 0) + + //Loop over all folders + for _, fileInfo := range fileInfos { + //Check if it is a directory + if fileInfo.IsDir() { + //Get the challenger name + folderName := fileInfo.Name() + log.Println("Folder name is : " + folderName) + //Update challenge path to be absolute path + challengePath, _ := os.Getwd() + challengePath = challengePath + "/challenges/" + folderName + log.Println("Challenge path is : " + challengePath) + log.Println(challengePath + "/" + folderName + "/" + folderName) + + //Check if the folder has a Dockerfile + if _, err := os.Stat(challengePath + "/" + folderName + "/" + folderName); err != nil { + log.Println("Dockerfile not found in the " + folderName + " challenge folder. Please follow proper format.") + } else { + //Update challenge path to get dockerfile + err := utils.BuildDockerImage(folderName, challengePath+"/"+folderName+"/"+folderName) + if err != nil { + return err + } + clusterConfig := g.ClusterConfig + numberOfTeams := clusterConfig.TeamCount + for i := 0; i < int(numberOfTeams); i++ { + log.Println("-----------Deploying challenge for team: " + strconv.Itoa(i) + " --------") + teamName := "katana-team-" + strconv.Itoa(i) + err = deployment.DeployChallengeToCluster(folderName, teamName, patch, replicas) + if err != nil { + if !(strings.Contains(err.Error(), "already exists")) { + return err + }else{ + log.Println("Deployment already existed.") + } + } + url, err := challengedeployerservice.CreateServiceForChallenge(folderName, teamName, 3000, i) + if err != nil { + return err + } else { + res = append(res, []string{teamName, url}) + } + } + } + err = challengedeployerservice.CopyChallengeIntoTsuka(challengePath, folderName, challengeType) + if err != nil { + return err + } + err = challengedeployerservice.CopyFlagDataIntoKashira(challengePath, folderName) + if err != nil { + return err + } + err = challengedeployerservice.CopyChallengeCheckerIntoKissaki(challengePath, folderName) + if err != nil { + return err + } + } + } + return nil +} + +func DeleteChallenge(challengeName string) error { + + //Delete chall directory also ? + log.Println("Challenge name is : " + challengeName) + + dirPath, _ := os.Getwd() + challengePath := dirPath + "/challenges/" + challengeName + log.Println("Deleting challenge folder :", challengePath) + err := os.RemoveAll(challengePath) + if err != nil { + log.Println("Error in deleting challenge folder") + return err + } + + totalTeams := utils.GetTeamNumber() + + for i := 0; i < totalTeams; i++ { + + teamName := "team-" + strconv.Itoa(i) + + teamNamespace := "katana-" + teamName + "-ns" + kubeclient := configs.GlobalKubeClient + if err != nil { + return err + } + + log.Println("---------------Deleting challenge for team: ", teamNamespace) + serviceClient := kubeclient.CoreV1().Services(teamNamespace) + deploymentsClient := kubeclient.AppsV1().Deployments(teamNamespace) + + //Get deployment + deps, err := deploymentsClient.Get(context.TODO(), challengeName, metav1.GetOptions{}) + if err != nil { + log.Println(" Error in getting deployments associated with the challenge. ") + continue + } + + //Delete deployments + if deps.Name != challengeName { + log.Println("Deployment does not exist. Create one using /deploy route.") + return nil + } else { + log.Println("Deleting deployment...") + deletePolicy := metav1.DeletePropagationForeground + err = deploymentsClient.Delete(context.TODO(), challengeName, metav1.DeleteOptions{PropagationPolicy: &deletePolicy}) + if err != nil { + log.Println("Error in deleting deployment.") + continue + } + } + + //Check if service exists + services, err := serviceClient.List(context.TODO(), metav1.ListOptions{}) + if err != nil { + log.Println(" Error in getting services for" + challengeName + "in the namespace " + teamNamespace) + return err + } + + flag := 0 + for _, service := range services.Items { + if service.Name == challengeName+"-svc-"+strconv.Itoa(i) { + flag = 1 + } + } + if flag == 0 { + log.Println("Service does not exist for the " + challengeName + " in namespace " + teamNamespace) + continue + } + + //Delete service + log.Println("Deleting services associated with this challenge...") + err = serviceClient.Delete(context.TODO(), challengeName+"-svc-"+strconv.Itoa(i), metav1.DeleteOptions{}) + if err != nil { + log.Println("Error in deleting service for "+challengeName+" in namespace "+teamNamespace, err) + continue + } + } + + log.Println("Process completed") + + return nil +} diff --git a/cliHelpers/createTeams.go b/cliHelpers/createTeams.go new file mode 100644 index 00000000..2a5b66f1 --- /dev/null +++ b/cliHelpers/createTeams.go @@ -0,0 +1,112 @@ +package cliHelpers + +import ( + "bytes" + "context" + "fmt" + "html/template" + "log" + "os" + "path/filepath" + "strconv" + + coreV1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/sdslabs/katana/configs" + "github.com/sdslabs/katana/lib/deployment" + "github.com/sdslabs/katana/lib/mongo" + "github.com/sdslabs/katana/lib/utils" + "github.com/sdslabs/katana/services/infrasetservice" +) + +func CreateTeams() error { + + // if !utils.VerifyToken(c) { + // return c.SendString("Unauthorized") + // } + config:= configs.GlobalKubeConfig + client:= configs.GlobalKubeClient + noOfTeams := int(configs.ClusterConfig.TeamCount) + + if _, err := os.Stat("teams"); os.IsNotExist(err) { + errDir := os.Mkdir("teams", 0755) + if errDir != nil { + log.Fatal(err) + return err + } + } + + // Create a directory named teams in the current directory + if _, err := os.Stat("teams"); os.IsNotExist(err) { + errDir := os.Mkdir("teams", 0755) + if errDir != nil { + log.Fatal(err) + } + } + + // Create a directory named teams in the current directory + if _, err := os.Stat("teams"); os.IsNotExist(err) { + errDir := os.Mkdir("teams", 0755) + if errDir != nil { + log.Fatal(err) + } + } + + var teams []interface{} + credsFile, err := os.Create(configs.SSHProviderConfig.CredsFile) + if err != nil { + log.Fatal(err) + return err + } + + for i := 0; i < noOfTeams; i++ { + // Create a directory named katana-team-i in the teams directory + if _, err := os.Stat("teams/katana-team-" + strconv.Itoa(i)); os.IsNotExist(err) { + errDir := os.Mkdir("teams/katana-team-"+strconv.Itoa(i), 0755) + if errDir != nil { + log.Fatal(err) + return err + } + } + + log.Println("Creating Team: " + strconv.Itoa(i)) + namespace := "katana-team-" + strconv.Itoa(i) + "-ns" + nsName := &coreV1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: namespace, + }, + } + _, err = client.CoreV1().Namespaces().Create(context.TODO(), nsName, metav1.CreateOptions{}) + if err != nil { + log.Fatal(err) + return err + } + + manifest := &bytes.Buffer{} + tmpl, err := template.ParseFiles(filepath.Join(configs.ClusterConfig.TemplatedManifestDir, "runtime", "teams.yml")) + if err != nil { + return err + } + + pwd, team, err := infrasetservice.CreateTeamCredentials(i) + if err != nil { + return err + } + deploymentConfig := utils.DeploymentConfig() + + deploymentConfig.SSHPassword = pwd + + if err = tmpl.Execute(manifest, deploymentConfig); err != nil { + return err + } + + if err = deployment.ApplyManifest(config, client, manifest.Bytes(), namespace); err != nil { + return err + } + teams = append(teams, team) + fmt.Fprintf(credsFile, "Team: %d, Username: %s, Password: %s\n", i, team.Name, pwd) + } + mongo.CreateTeams(teams) + return nil +} diff --git a/cliHelpers/infraService/dbSetup.go b/cliHelpers/infraService/dbSetup.go new file mode 100644 index 00000000..84205d1a --- /dev/null +++ b/cliHelpers/infraService/dbSetup.go @@ -0,0 +1,40 @@ +package infraService + +import ( + "log" + + "github.com/spf13/cobra" + + g "github.com/sdslabs/katana/configs" +) +//have to test yet [WIP] +var MongoDBCmd = &cobra.Command{ + Use: "mongodb-setup", + Short: "Run the mongo db setup command", + Long: "Runs the mongo database setup", + RunE: func(cmd *cobra.Command, args []string) error { + g.LoadConfiguration(); + g.LoadKubeElements(); + if err := mongoDBSetup(); err != nil { + log.Println("Error setting up mongo database:", err) + return err + } + log.Println("Database connected successfully") + return nil + }, +} +var MySqlDBCmd = &cobra.Command{ + Use: "mysqldb-setup", + Short: "Run the mysql db setup command", + Long: "Runs the mysql database setup", + RunE: func(cmd *cobra.Command, args []string) error { + g.LoadConfiguration(); + g.LoadKubeElements(); + if err := mysqlDBSetup(); err != nil { + log.Println("Error setting up MySQL database:", err) + return err + } + log.Println("Database connected successfully") + return nil + }, +} diff --git a/cliHelpers/infraService/gitServer.go b/cliHelpers/infraService/gitServer.go new file mode 100644 index 00000000..68296130 --- /dev/null +++ b/cliHelpers/infraService/gitServer.go @@ -0,0 +1,43 @@ +package infraService + +import ( +"fmt" +"log" + + "github.com/spf13/cobra" + + g "github.com/sdslabs/katana/configs" +"github.com/sdslabs/katana/cliHelpers" +) + +var GitCmd = &cobra.Command{ + Use: "git-server", + Short: "Run the git-server setup command", + Long: `Runs the katana API server on port 3000`, + RunE: func(cmd *cobra.Command, args []string) error { + g.LoadConfiguration(); + g.LoadKubeElements(); + if err := GitSetup(); err != nil { + log.Println("Error setting up the git server:", err) + return err + } + log.Println("Git Server connected successfully") + return nil + }, +} + +var CreateTeamCmd= &cobra.Command{ + Use: "create-team", + Short: "Run the create-team command", + Long: `Create namespaces fot teams`, + RunE: func(cmd *cobra.Command, args []string) error { + g.LoadConfiguration(); + g.LoadKubeElements(); + fmt.Println("Creating teams") + if err := cliHelpers.CreateTeams(); err != nil { + log.Println("Error creating teams:", err) + return err + } + return nil + }, +} \ No newline at end of file diff --git a/cliHelpers/infraService/helper.go b/cliHelpers/infraService/helper.go new file mode 100644 index 00000000..07017aa7 --- /dev/null +++ b/cliHelpers/infraService/helper.go @@ -0,0 +1,107 @@ +package infraService + +import ( + "bytes" + "fmt" + "log" + "mime/multipart" + "net/http" + + g "github.com/sdslabs/katana/configs" + "github.com/sdslabs/katana/lib/deployment" + "github.com/sdslabs/katana/lib/harbor" + "github.com/sdslabs/katana/lib/mongo" + "github.com/sdslabs/katana/lib/mysql" + utils "github.com/sdslabs/katana/lib/utils" + infraSetService "github.com/sdslabs/katana/services/infrasetservice" +) + +func mongoDBSetup() error { + if err := mongo.Init(); err != nil { + return err + } + return nil +} +func mysqlDBSetup() error { + if err := mysql.Init(); err != nil { + return err + } + return nil +} + +func InfraSetup() error { + config:= g.GlobalKubeConfig + kubeclient:= g.GlobalKubeClient + + infraSetService.GenerateCertsforHarbor() + deployment.DeployCluster(config, kubeclient) + err := harbor.SetupHarbor() + if err != nil { + log.Println("There was error in setting up harbor", err) + return err + } + err = infraSetService.BuildKatanaServices() + if err != nil { + return err + } + return nil +} + +func GitSetup() error { + if err := mysql.Init(); err != nil { + return err + } + var requestBody bytes.Buffer + writer := multipart.NewWriter(&requestBody) + LoadBalancer, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } + writer.WriteField("db_type", "MySQL") + writer.WriteField("db_host", LoadBalancer+":3306") + writer.WriteField("db_user", g.MySQLConfig.Username) + writer.WriteField("db_passwd", g.MySQLConfig.Password) + writer.WriteField("db_name", "gogs") + writer.WriteField("db_schema", "public") + writer.WriteField("ssl_mode", "disable") + writer.WriteField("db_path", "/app/gogs/data/gogs.db") + writer.WriteField("app_name", "Gogs") + writer.WriteField("repo_root_path", "/data/git/gogs-repositories") + writer.WriteField("run_user", "git") + writer.WriteField("domain", LoadBalancer+":3000") + writer.WriteField("ssh_port", "22") + writer.WriteField("http_port", "3000") + writer.WriteField("app_url", "http://"+LoadBalancer+":3000") + writer.WriteField("log_root_path", "/app/gogs/log") + writer.WriteField("default_branch", "master") + + // Close the writer + writer.Close() + + // Create the request + req, err := http.NewRequest("POST", "http://"+LoadBalancer+":3000"+"/install", &requestBody) + if err != nil { + fmt.Println(err) + return err + } + + // Set the content type + req.Header.Set("Content-Type", writer.FormDataContentType()) + + // Send the request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return err + } + + // Check the response + if resp.StatusCode != http.StatusOK { + fmt.Println("error while setting up Git Server") + return err + } + + log.Println("Git Server setup completed") + return nil +} diff --git a/cliHelpers/infraService/infraset.go b/cliHelpers/infraService/infraset.go new file mode 100644 index 00000000..da631a3e --- /dev/null +++ b/cliHelpers/infraService/infraset.go @@ -0,0 +1,26 @@ +package infraService + +import ( + "log" + + "github.com/spf13/cobra" + + g "github.com/sdslabs/katana/configs" +) + +var InfraCmd = &cobra.Command{ + + Use: "infra-setup", + Short: "Run the infraset setup command", + Long: `Runs the katana API server on port 3000`, + RunE: func(cmd *cobra.Command, args []string) error { + g.LoadConfiguration(); + g.LoadKubeElements(); + if err := InfraSetup(); err != nil { + log.Println("Error setting up the infrastructure:", err) + return err + } + log.Println("Infrastructure setup successfully") + return nil + }, +} diff --git a/cliHelpers/infraService/setup.go b/cliHelpers/infraService/setup.go new file mode 100644 index 00000000..4f3606b2 --- /dev/null +++ b/cliHelpers/infraService/setup.go @@ -0,0 +1,43 @@ +package infraService + +import ( + "log" + + "github.com/spf13/cobra" + + "github.com/sdslabs/katana/configs" +) + +var SetUpCmd = &cobra.Command{ + Use: "setup", + Short: "SetUps Katana on your computer", + RunE: func(cmd *cobra.Command, args []string) error { + configs.LoadConfiguration(); + configs.LoadKubeElements(); + if err := InfraSetup(); err != nil { + log.Println("Error setting up the infrastructure:", err) + return err + } + log.Println("Infrastructure setup successfully") + if err := mongoDBSetup(); err != nil { + log.Println("Error setting up the mongo database:", err) + return err + } + log.Println("MongoDB connected successfully") + if err := GitSetup(); err != nil { + log.Println("Error setting up the git server:", err) + return err + } + log.Println("Git Server connected successfully") + if err := mongoDBSetup(); err != nil { + log.Println("Error setting up the mongo database:", err) + return err + } + if err := mysqlDBSetup(); err != nil { + log.Println("Error setting up the mysql database:", err) + return err + } + log.Println("MySQL Database connected successfully") + return nil + }, +} diff --git a/cmd/root.go b/cmd/root.go index ff207977..14f4e539 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -4,6 +4,9 @@ import ( "log" "github.com/spf13/cobra" + + "github.com/sdslabs/katana/cliHelpers/chalDeployerService" + "github.com/sdslabs/katana/cliHelpers/infraService" ) // rootCmd represents the run command @@ -22,4 +25,12 @@ var rootCmd = &cobra.Command{ func init() { rootCmd.AddCommand(runCmd) + rootCmd.AddCommand(infraService.MongoDBCmd) + rootCmd.AddCommand(infraService.MySqlDBCmd) + rootCmd.AddCommand(infraService.InfraCmd) + rootCmd.AddCommand(infraService.SetUpCmd) + rootCmd.AddCommand(infraService.GitCmd) + rootCmd.AddCommand(infraService.CreateTeamCmd) + rootCmd.AddCommand(chalDeployerService.DelChalCmd) + rootCmd.AddCommand(chalDeployerService.DeployChalCmd) } diff --git a/cmd/run.go b/cmd/run.go index 18d54372..5369f9f8 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -1,9 +1,10 @@ package main import ( + "github.com/spf13/cobra" + "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/services/master" - "github.com/spf13/cobra" ) // runCmd represents the run command @@ -26,8 +27,9 @@ var runCmd = &cobra.Command{ // } // apiServer := api.Server() - configs.LoadConfiguration() - return master.Server() + configs.LoadConfiguration(); + configs.LoadKubeElements(); + return master.Server(); // if err := g.Wait(); err != nil { // os.Exit(1) diff --git a/configs/kubeProvider.go b/configs/kubeProvider.go new file mode 100644 index 00000000..bc9caefb --- /dev/null +++ b/configs/kubeProvider.go @@ -0,0 +1,38 @@ +package configs + +import ( + "os" + "path/filepath" + + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" +) +func LoadKubeElements() error { + var pathToCfg string + if KatanaConfig.KubeConfig == "" { + pathToCfg = filepath.Join( + os.Getenv("HOME"), ".kube", "config", + ) + } else { + pathToCfg = KatanaConfig.KubeConfig + } + config,err := clientcmd.BuildConfigFromFlags("", pathToCfg) + if err != nil { + return err + } + GlobalKubeConfig = config + kubeclient,err := kubernetes.NewForConfig(config) + if err != nil { + return err + } + GlobalKubeClient = kubeclient + return nil +} + +var +( + GlobalKubeConfig *rest.Config + GlobalKubeClient *kubernetes.Clientset +) + diff --git a/configs/parser.go b/configs/parser.go index a5727a73..ace77797 100644 --- a/configs/parser.go +++ b/configs/parser.go @@ -7,12 +7,13 @@ import ( "github.com/BurntSushi/toml" ) -func LoadConfiguration() { +func LoadConfiguration() error { flag.Parse() config := &KatanaCfg{} configFile := flag.String("conf", "config.toml", "location of config file") if _, err := toml.DecodeFile(*configFile, config); err != nil { log.Fatal(err) + return err } KatanaConfig = config ServicesConfig = &KatanaConfig.Services @@ -24,6 +25,7 @@ func LoadConfiguration() { MongoConfig = &KatanaConfig.Mongo MySQLConfig = &KatanaConfig.MySQL HarborConfig = &KatanaConfig.Harbor + return nil } var ( diff --git a/go.mod b/go.mod index 2d3a977a..ce457285 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/xdg-go/pbkdf2 v1.0.0 go.mongodb.org/mongo-driver v1.12.1 - golang.org/x/crypto v0.12.0 + golang.org/x/crypto v0.13.0 k8s.io/api v0.28.1 k8s.io/apimachinery v0.28.1 k8s.io/client-go v0.28.1 @@ -24,13 +24,10 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect github.com/andybalholm/brotli v1.0.5 // indirect - github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect @@ -39,9 +36,6 @@ require ( github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect - github.com/go-errors/errors v1.4.2 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.4.1 // indirect github.com/go-logr/logr v1.2.4 // indirect @@ -52,13 +46,10 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/btree v1.0.1 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect @@ -67,30 +58,25 @@ require ( github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/klauspost/pgzip v1.2.6 // indirect - github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // 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.19 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/moby/spdystream v0.2.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nwaples/rardecode v1.1.3 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc3 // indirect - github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/skeema/knownhosts v1.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -102,18 +88,16 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect - github.com/xlab/treeprint v1.2.0 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/oauth2 v0.11.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/term v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/term v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.0 // indirect + golang.org/x/tools v0.13.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -121,15 +105,10 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.0 // indirect - k8s.io/cli-runtime v0.28.1 // indirect - k8s.io/component-base v0.28.1 // indirect k8s.io/klog/v2 v2.100.1 // indirect k8s.io/kube-openapi v0.0.0-20230811205723-7ac0aad8c58d // indirect - k8s.io/kubectl v0.28.1 // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect - sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index b6096ca6..50d8b8b3 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,8 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -21,13 +16,6 @@ github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= -github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -51,15 +39,7 @@ github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJI github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -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 v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= @@ -87,19 +67,9 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -107,16 +77,8 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -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.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= @@ -125,13 +87,9 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ 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/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/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -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.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -162,8 +120,6 @@ 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= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= @@ -177,8 +133,6 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= -github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -188,8 +142,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= @@ -209,8 +161,6 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc3 h1:fzg1mXZFj8YdPeNkRXMg+zb88BFV0Ys52cJydRwBkb8= github.com/opencontainers/image-spec v1.1.0-rc3/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -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/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= @@ -220,13 +170,10 @@ 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/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= @@ -271,8 +218,6 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= -github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= @@ -281,8 +226,6 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -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= 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-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -291,22 +234,14 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -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= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -318,13 +253,10 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -332,7 +264,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -341,7 +272,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -350,16 +280,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -369,44 +298,24 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= @@ -428,38 +337,20 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.28.0-alpha.3 h1:dl9ku8PmbvD7VFdgYzA34SRGsg5hpmDeqZUC670kVjw= -k8s.io/api v0.28.0-alpha.3/go.mod h1:8xUcnnu+0XlJiU0p9mwS7tRpUB1ce+XZrCYsEHeUQRw= k8s.io/api v0.28.1 h1:i+0O8k2NPBCPYaMB+uCkseEbawEt/eFaiRqUx8aB108= k8s.io/api v0.28.1/go.mod h1:uBYwID+66wiL28Kn2tBjBYQdEU0Xk0z5qF8bIBqk/Dg= -k8s.io/apimachinery v0.28.0-alpha.3 h1:poqReta738jpeYUyvxXxYbOk6hj5vc1EcKxyo0zhklk= -k8s.io/apimachinery v0.28.0-alpha.3/go.mod h1:tAiIbF8KB8+Ri2DfUWwZGwNOThIwM0fhXLnOymriu+4= k8s.io/apimachinery v0.28.1 h1:EJD40og3GizBSV3mkIoXQBsws32okPOy+MkRyzh6nPY= k8s.io/apimachinery v0.28.1/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw= -k8s.io/cli-runtime v0.28.1 h1:7Njc4eD5kaO4tYdSYVJJEs54koYD/vT6gxOq8dEVf9g= -k8s.io/cli-runtime v0.28.1/go.mod h1:yIThSWkAVLqeRs74CMkq6lNFW42GyJmvMtcNn01SZho= -k8s.io/client-go v0.28.0-alpha.3 h1:CPcmGXW3lRogryie7htr93ZIitk6H+zrzPns3TpuFyY= -k8s.io/client-go v0.28.0-alpha.3/go.mod h1:1KTCIXQZjy18QNeXI6zDkq1w2E4UP6gjl1fp5QRF3mo= k8s.io/client-go v0.28.1 h1:pRhMzB8HyLfVwpngWKE8hDcXRqifh1ga2Z/PU9SXVK8= k8s.io/client-go v0.28.1/go.mod h1:pEZA3FqOsVkCc07pFVzK076R+P/eXqsgx5zuuRWukNE= -k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= -k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20230811205723-7ac0aad8c58d h1:lGN9colvFFZIY0Guxkzdd73CoDXHIbhlQkfi7n/26Ak= k8s.io/kube-openapi v0.0.0-20230811205723-7ac0aad8c58d/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= -k8s.io/kubectl v0.28.1 h1:jAq4yKEqQL+fwkWcEsUWxhJ7uIRcOYQraJxx4SyAMTY= -k8s.io/kubectl v0.28.1/go.mod h1:a0nk/lMMeKBulp0lMTJAKbkjZg1ykqfLfz/d6dnv1ak= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= -sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= -sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM7vh3b7HvGNfXrJ/xL6BDMS0v1V/HHg5U= -sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/katana-services b/katana-services index a79e56b2..7eabff25 160000 --- a/katana-services +++ b/katana-services @@ -1 +1 @@ -Subproject commit a79e56b2458f84a42fa51d293fa1bce036af57b5 +Subproject commit 7eabff255a9b65cde4999af0e50854ca4050ee33 diff --git a/kubernetes/templates/storage-init.yml b/kubernetes/templates/storage-init.yml index faa0c934..3e5e3711 100644 --- a/kubernetes/templates/storage-init.yml +++ b/kubernetes/templates/storage-init.yml @@ -45,7 +45,7 @@ spec: containers: - name: create-data-dirs image: busybox - command: ["sh", "-c", "mkdir /mnt/gogs /mnt/mysql /mnt/mongo /mnt/kashira /mnt/kissaki && sleep infinity"] + command: ["sh", "-c", "rm -rf /mnt/gogs /mnt/mysql /mnt/mongo /mnt/kashira /mnt/kissaki && mkdir /mnt/gogs /mnt/mysql /mnt/mongo /mnt/kashira /mnt/kissaki && sleep infinity"] volumeMounts: - mountPath: "/mnt" name: setup-volume diff --git a/lib/deployment/deployment.go b/lib/deployment/deployment.go index 594752f0..6d5b8884 100644 --- a/lib/deployment/deployment.go +++ b/lib/deployment/deployment.go @@ -7,10 +7,9 @@ import ( "io" "log" "path/filepath" + "strings" "text/template" - g "github.com/sdslabs/katana/configs" - "github.com/sdslabs/katana/lib/utils" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" @@ -24,6 +23,9 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/restmapper" + + g "github.com/sdslabs/katana/configs" + "github.com/sdslabs/katana/lib/utils" ) // ApplyManifest applies a given manifest to the cluster @@ -32,14 +34,12 @@ func ApplyManifest(kubeconfig *rest.Config, kubeclientset *kubernetes.Clientset, if err != nil { return err } - decoder := yamlutil.NewYAMLOrJSONDecoder(bytes.NewReader(manifest), 100) for { var rawObj runtime.RawExtension if err = decoder.Decode(&rawObj); err != nil { break } - obj, gvk, err := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, nil) if err != nil { return err @@ -79,7 +79,13 @@ func ApplyManifest(kubeconfig *rest.Config, kubeclientset *kubernetes.Clientset, continue // TODO: Handle PVCs, currently on deletion of PVCs, the cluster is stuck in a loop } - _ = dri.Delete(context.Background(), unstructuredObj.GetName(), metav1.DeleteOptions{}) + err = dri.Delete(context.Background(), unstructuredObj.GetName(), metav1.DeleteOptions{}) + if err != nil { + if strings.Contains(err.Error(), "not found") { + return nil + } + log.Fatal(err) + } watcher, err := dri.Watch(context.Background(), metav1.ListOptions{ FieldSelector: fmt.Sprintf("metadata.name=%s", unstructuredObj.GetName()), }) @@ -87,8 +93,10 @@ func ApplyManifest(kubeconfig *rest.Config, kubeclientset *kubernetes.Clientset, return err } defer watcher.Stop() + for event := range watcher.ResultChan() { if event.Type == watch.Deleted { + _, err = dri.Create(context.Background(), unstructuredObj, metav1.CreateOptions{}) if err != nil { return err @@ -99,7 +107,6 @@ func ApplyManifest(kubeconfig *rest.Config, kubeclientset *kubernetes.Clientset, } } } - if err != io.EOF { return err } @@ -113,9 +120,12 @@ func DeployCluster(kubeconfig *rest.Config, kubeclientset *kubernetes.Clientset) deploymentConfig := utils.DeploymentConfig() - clientset, _ := utils.GetKubeClient() + nodes, err := utils.GetNodes(kubeclientset) - nodes, _ := utils.GetNodes(clientset) + if err != nil { + log.Println(err) + return err + } deploymentConfig.NodeAffinityValue = nodes[0].Name @@ -140,7 +150,7 @@ func DeployCluster(kubeconfig *rest.Config, kubeclientset *kubernetes.Clientset) func DeployChallengeToCluster(challengeName, teamName string, firstPatch bool, replicas int32) error { teamNamespace := teamName + "-ns" - kubeclient, _ := utils.GetKubeClient() + kubeclient:= g.GlobalKubeClient deploymentsClient := kubeclient.AppsV1().Deployments(teamNamespace) imageName := "harbor.katana.local/katana/" + challengeName + ":latest" @@ -204,10 +214,13 @@ func DeployChallengeToCluster(challengeName, teamName string, firstPatch bool, r } log.Println("Creating deployment...") result, err := deploymentsClient.Create(context.TODO(), manifest, metav1.CreateOptions{}) - if err != nil { - log.Println("Unable to create deployement") - panic(err) + if(!strings.Contains(err.Error(), "already exists")){ + log.Println("Unable to create deployement") + panic(err) + }else{ + log.Println("Deployment already existed") + } } log.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName()+" in namespace "+teamNamespace) diff --git a/lib/harbor/hosts.go b/lib/harbor/hosts.go index d7841feb..e2b31acf 100644 --- a/lib/harbor/hosts.go +++ b/lib/harbor/hosts.go @@ -9,18 +9,21 @@ import ( "strings" "text/template" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/lib/deployment" "github.com/sdslabs/katana/lib/utils" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func updateOrAddHost() error { filePath := "/etc/hosts" hostname := "harbor.katana.local" - ipAddress := utils.GetKatanaLoadbalancer() - + ipAddress, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } file, err := os.Open(filePath) if err != nil { return err @@ -59,8 +62,8 @@ func updateOrAddHost() error { } func deployHarborClusterDaemonSet() error { - kubeConfig, _ := utils.GetKubeConfig() - kubeClient, _ := utils.GetKubeClient() + kubeConfig:= configs.GlobalKubeConfig + kubeClient:= configs.GlobalKubeClient namespace := "kube-system" diff --git a/lib/harbor/setup.go b/lib/harbor/setup.go index 94e7e34c..3c495447 100644 --- a/lib/harbor/setup.go +++ b/lib/harbor/setup.go @@ -3,11 +3,12 @@ package harbor import ( "log" + "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/lib/utils" ) func SetupHarbor() error { - client, _ := utils.GetKubeClient() + client:= configs.GlobalKubeClient deploymentNames := []string{ "katana-release-harbor-core", diff --git a/lib/mongo/connection.go b/lib/mongo/connection.go index c58ca177..29ce95ff 100644 --- a/lib/mongo/connection.go +++ b/lib/mongo/connection.go @@ -43,7 +43,11 @@ func setup() error { log.Printf("Trying to connect to MongoDB, attempt %d", i+1) ctx, _ = context.WithTimeout(context.Background(), time.Duration(configs.KatanaConfig.TimeOut)*time.Second) var err error - client, err = mongo.Connect(ctx, options.Client().ApplyURI("mongodb://"+configs.MongoConfig.Username+":"+configs.MongoConfig.Password+"@"+utils.GetKatanaLoadbalancer()+":27017/?directConnection=true&appName=mongosh+"+configs.MongoConfig.Version)) + katanaLB, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } + client, err = mongo.Connect(ctx, options.Client().ApplyURI("mongodb://"+configs.MongoConfig.Username+":"+configs.MongoConfig.Password+"@"+katanaLB+":27017/?directConnection=true&appName=mongosh+"+configs.MongoConfig.Version)) if err != nil { return fmt.Errorf("cannot connect to mongo: %w", err) } diff --git a/lib/mysql/connection.go b/lib/mysql/connection.go index 953206d5..6510d709 100644 --- a/lib/mysql/connection.go +++ b/lib/mysql/connection.go @@ -4,10 +4,11 @@ import ( "database/sql" "fmt" "log" + "strings" "time" _ "github.com/go-sql-driver/mysql" - "github.com/sdslabs/katana/configs" + g "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/lib/utils" ) @@ -17,7 +18,11 @@ var db *sql.DB func setup() error { for i := 0; i < 10; i++ { log.Printf("Trying to connect to MySQL, attempt %d", i+1) - database, err := sql.Open("mysql", configs.MySQLConfig.Username+":"+configs.MySQLConfig.Password+"@tcp("+utils.GetKatanaLoadbalancer()+":3306)/mysql") + katanaLB, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } + database, err := sql.Open("mysql", g.MySQLConfig.Username+":"+g.MySQLConfig.Password+"@tcp("+katanaLB+":3306)/mysql") if err != nil { return fmt.Errorf("cannot connect to mysql: %w", err) } @@ -30,9 +35,21 @@ func setup() error { time.Sleep(time.Duration(g.KatanaConfig.TimeOut) * time.Second) } else { log.Println("MySQL Connection Established") - if err := setupGogs(); err != nil { - return fmt.Errorf("cannot setup gogs: %w", err) + + if err := CreateDatabase(gogsDatabase); err != nil { + if !strings.Contains(err.Error(), "database exists") { + return fmt.Errorf("cannot create gogs database: %w", err) + } else { + if err := setupGogs(); err != nil { + return fmt.Errorf("cannot setup gogs: %w", err) + }else{ + log.Println("Gogs MySQL database setup successfully") + } + } + } else { + log.Println("Gogs database created successfully in MySQL") } + return nil } } @@ -40,14 +57,11 @@ func setup() error { } func setupGogs() error { - if err := CreateDatabase(gogsDatabase); err != nil { - fmt.Errorf("cannot create database: %w", err) - } - if err := CreateGogsAdmin(configs.AdminConfig.Username, configs.AdminConfig.Password); err != nil { - fmt.Errorf("cannot create gogs admin: %w", err) + if err := CreateGogsAdmin(g.AdminConfig.Username, g.AdminConfig.Password); err != nil { + return fmt.Errorf("cannot create gogs admin: %w", err) } - if err := CreateAccessToken(configs.AdminConfig.Username, configs.AdminConfig.Password); err != nil { - fmt.Errorf("cannot create access token: %w", err) + if err := CreateAccessToken(g.AdminConfig.Username, g.AdminConfig.Password); err != nil { + return fmt.Errorf("cannot create access token: %w", err) } return nil } diff --git a/lib/mysql/create.go b/lib/mysql/create.go index 89d06555..23f0c615 100644 --- a/lib/mysql/create.go +++ b/lib/mysql/create.go @@ -23,7 +23,11 @@ func CreateDatabase(database string) error { func CreateGogsUser(username, password string) error { // Get time in unix format and convert it to string - gogs, err := sql.Open("mysql", configs.MySQLConfig.Username+":"+configs.MySQLConfig.Password+"@tcp("+utils.GetKatanaLoadbalancer()+":3306)/gogs") + katanaLB, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } + gogs, err := sql.Open("mysql", configs.MySQLConfig.Username+":"+configs.MySQLConfig.Password+"@tcp("+katanaLB+":3306)/gogs") if err != nil { return err } @@ -59,13 +63,18 @@ func CreateGogsUser(username, password string) error { _, err = gogs.Exec(query) if err != nil { log.Println(err) + return err } return nil } func CreateGogsAdmin(username, password string) error { // Get time in unix format and convert it to string - gogs, err := sql.Open("mysql", configs.MySQLConfig.Username+":"+configs.MySQLConfig.Password+"@tcp("+utils.GetKatanaLoadbalancer()+":3306)/gogs") + katanaLB, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } + gogs, err := sql.Open("mysql", configs.MySQLConfig.Username+":"+configs.MySQLConfig.Password+"@tcp("+katanaLB+":3306)/gogs") if err != nil { return err } @@ -85,11 +94,13 @@ func CreateGogsAdmin(username, password string) error { rand, err := utils.RandomSalt() if err != nil { log.Println(err) + return err } salt, err := utils.RandomSalt() if err != nil { log.Println(err) + return err } password = utils.EncodePassword(password, salt) @@ -112,6 +123,7 @@ func CreateGogsAdmin(username, password string) error { _, err = gogs.Exec("INSERT INTO `user` (`id`, `lower_name`, `name`, `full_name`, `email`, `passwd`, `login_source`, `login_name`, `type`, `location`, `website`, `rands`, `salt`, `created_unix`, `updated_unix`, `last_repo_visibility`, `max_repo_creation`, `is_active`, `is_admin`, `allow_git_hook`, `allow_import_local`, `prohibit_login`, `avatar`, `avatar_email`, `use_custom_avatar`, `num_followers`, `num_following`, `num_stars`, `num_repos`, `description`, `num_teams`, `num_members`) VALUES (NULL, '" + user.LowerName + "', '" + user.Name + "', '" + user.FullName + "', '" + user.Email + "', '" + user.Password + "', '0', '', '0', '', '', '" + user.Rands + "', '" + user.Salt + "', '" + strconv.FormatInt(user.CreatedUnix, 10) + "', '" + strconv.FormatInt(user.UpdatedUnix, 10) + "', '0', '-1', '1', '1', '0', '0', '0', '" + user.Avatar + "', '" + user.AvatarEmail + "', '0', '0', '0', '0', '0', '', '0', '0')") if err != nil { log.Println(err) + return err } return nil @@ -119,7 +131,11 @@ func CreateGogsAdmin(username, password string) error { func CreateAccessToken(username, token string) error { // TODO: Don't create connections again - gogs, err := sql.Open("mysql", configs.MySQLConfig.Username+":"+configs.MySQLConfig.Password+"@tcp("+utils.GetKatanaLoadbalancer()+":3306)/gogs") + katanaLB, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } + gogs, err := sql.Open("mysql", configs.MySQLConfig.Username+":"+configs.MySQLConfig.Password+"@tcp("+katanaLB+":3306)/gogs") if err != nil { return err } diff --git a/lib/utils/crypto.go b/lib/utils/crypto.go index f7a50ae4..dffb60e6 100644 --- a/lib/utils/crypto.go +++ b/lib/utils/crypto.go @@ -24,12 +24,26 @@ func Base64Encode(str string) string { } func GenerateCerts(domain string, basePath string) error { + + openSSLabove3,err :=CheckOpenSSLVersion() + if err != nil { + return err + } // Generate ca.key in harbor directory cmd := "openssl genrsa -out " + basePath + "/ca.key 4096" if err := RunCommand(cmd); err != nil { + fmt.Println("Error generating ca.key") return err } + if(openSSLabove3){ + // using -traditional flag to get PKCS#1 [different header], otherwise 500 Internal Error + cmd = "openssl rsa -in " + basePath + "/ca.key -out " + basePath + "/ca.key -traditional" + if err := RunCommand(cmd); err != nil { + return err + } + } + // using -traditional flag to get PKCS#1 [different header], otherwise 500 Internal Error cmd = "openssl rsa -in " + basePath + "/ca.key -out " + basePath + "/ca.key -traditional" if err := RunCommand(cmd); err != nil { @@ -39,36 +53,43 @@ func GenerateCerts(domain string, basePath string) error { // Generate ca.crt cmd = "openssl req -x509 -new -nodes -sha512 -days 3650 -subj '/C=IN/ST=Delhi/L=Delhi/O=Katana/CN=" + domain + "' -key " + basePath + "/ca.key -out " + basePath + "/ca.crt" if err := RunCommand(cmd); err != nil { - return err - } - - // using -traditional flag to get PKCS#1 [different header], otherwise 500 Internal Error - cmd = "openssl rsa -in " + basePath + "/" + domain + ".key -out " + basePath + "/" + domain + ".key -traditional" - if err := RunCommand(cmd); err != nil { + fmt.Println("Error generating ca.crt") return err } // Generate private key cmd = "openssl genrsa -out " + basePath + "/" + domain + ".key 4096" if err := RunCommand(cmd); err != nil { + fmt.Println("Error generating private key") return err } + if(openSSLabove3){ + // using -traditional flag to get PKCS#1 [different header], otherwise 500 Internal Error + cmd = "openssl rsa -in " + basePath+"/"+domain + ".key -out "+ basePath +"/"+domain + ".key -traditional" + if err := RunCommand(cmd); err != nil { + return err + } + } + // Generate certificate signing request cmd = "openssl req -sha512 -new -subj '/C=IN/ST=Delhi/L=Delhi/O=Katana/CN=" + domain + "' -key " + basePath + "/" + domain + ".key -out " + basePath + "/" + domain + ".csr" if err := RunCommand(cmd); err != nil { + fmt.Println("Error generating certificate signing request") return err } // Generate v3.ext file cmd = "echo 'authorityKeyIdentifier=keyid,issuer\nbasicConstraints=CA:FALSE\nkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS.1=" + domain + "' > " + basePath + "/v3.ext" if err := RunCommand(cmd); err != nil { + fmt.Println("Error generating v3.ext file") return err } // Generate certificate cmd = "openssl x509 -req -sha512 -days 3650 -extfile " + basePath + "/v3.ext -CA " + basePath + "/ca.crt -CAkey " + basePath + "/ca.key -CAcreateserial -in " + basePath + "/" + domain + ".csr -out " + basePath + "/" + domain + ".crt" if err := RunCommand(cmd); err != nil { + fmt.Println("Error generating certificate") return err } diff --git a/lib/utils/docker.go b/lib/utils/docker.go index 48c51e85..b4591dd1 100644 --- a/lib/utils/docker.go +++ b/lib/utils/docker.go @@ -11,17 +11,18 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/client" + "github.com/sdslabs/katana/configs" ) -func dockerLogin(username string, password string) { +func dockerLogin(username string, password string) error { log.Println("Logging into Harbor, Please wait...") cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { log.Fatal("Error creating Docker client:", err) - return + return err } authConfig := registry.AuthConfig{ @@ -33,9 +34,10 @@ func dockerLogin(username string, password string) { _, err = cli.RegistryLogin(context.Background(), authConfig) if err != nil { log.Printf("Error during login: %s\n", err) - return + return err } log.Println("Logged into Harbor successfully") + return nil } func CheckDockerfile(_DockerfilePath string) bool { @@ -43,16 +45,16 @@ func CheckDockerfile(_DockerfilePath string) bool { return !os.IsNotExist(err) } -func BuildDockerImage(_ChallengeName string, _DockerfilePath string) { +func BuildDockerImage(_ChallengeName string, _DockerfilePath string) error { buf := new(bytes.Buffer) if err := Tar(_DockerfilePath, buf); err != nil { log.Fatal(err, ": error tarring directory") - return + return err } cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { log.Fatal(err) - return + return err } log.Println(_ChallengeName) @@ -71,18 +73,20 @@ func BuildDockerImage(_ChallengeName string, _DockerfilePath string) { ) if err != nil { log.Fatal(err, " :unable to create image") - return + return err } _, err = io.Copy(os.Stdout, imageBuildResponse.Body) if err != nil { log.Fatal(err, " :unable to read image build response") - return + return err } log.Println("Docker image built successfully") - - dockerLogin(configs.KatanaConfig.Harbor.Username, configs.KatanaConfig.Harbor.Password) + err = dockerLogin(configs.KatanaConfig.Harbor.Username, configs.KatanaConfig.Harbor.Password) + if err != nil { + return err + } log.Println("Pushing Docker image to Harbor, please wait...") @@ -93,7 +97,7 @@ func BuildDockerImage(_ChallengeName string, _DockerfilePath string) { authJSON, err := json.Marshal(authConfig) if err != nil { log.Fatal(err, ": error encoding credentials") - return + return err } encodedAuth := Base64Encode(string(authJSON)) @@ -105,11 +109,11 @@ func BuildDockerImage(_ChallengeName string, _DockerfilePath string) { _, err = cli.ImagePush(context.Background(), "harbor.katana.local/katana/"+_ChallengeName, pushOptions) if err != nil { log.Fatal(err, " :unable to push docker image") - return + return err } log.Println("Image Pushed to Harbor successfully") - + return nil } func DockerImageExists(imageName string) bool { diff --git a/lib/utils/kube.go b/lib/utils/kube.go index d5b1ebec..287d84b9 100644 --- a/lib/utils/kube.go +++ b/lib/utils/kube.go @@ -4,17 +4,16 @@ import ( "bytes" "context" "fmt" - "io" "io/ioutil" "log" "os" "path/filepath" "strings" + "sync" - g "github.com/sdslabs/katana/configs" - "github.com/sdslabs/katana/types" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/intstr" @@ -24,7 +23,9 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/remotecommand" - cmdutil "k8s.io/kubectl/pkg/cmd/util" + + g "github.com/sdslabs/katana/configs" + "github.com/sdslabs/katana/types" ) // GetKubeConfig returns a kubernetes REST config object @@ -82,31 +83,26 @@ func GetTeamPodLabels() string { return string(g.ClusterConfig.DeploymentLabel) } -func GetMongoIP() string { +func GetMongoIP() (string, error) { client, err := GetKubeClient() if err != nil { log.Fatal(err) + return "", err } service, err := client.CoreV1().Services("katana").Get(context.TODO(), "mongo-nodeport-svc", metav1.GetOptions{}) if err != nil { log.Fatal(err) + return "", err } // Print the IP address of the service log.Println(service.Spec.ClusterIP) - return service.Spec.ClusterIP + return service.Spec.ClusterIP, nil } func CopyFromPod(podName string, containerName string, pathInPod string, localFilePath string, ns ...string) error { - config, err := GetKubeConfig() - if err != nil { - return err - } - - client, err := GetKubeClient() - if err != nil { - return err - } + config:=g.GlobalKubeConfig + client:=g.GlobalKubeClient namespace := "katana" if len(ns) > 0 { @@ -179,24 +175,96 @@ func CopyFromPod(podName string, containerName string, pathInPod string, localFi return nil } -func GetKatanaLoadbalancer() string { +func CopyIntoPod(podName string, containerName string, pathInPod string, localFilePath string, ns ...string) error { + config:=g.GlobalKubeConfig + client:=g.GlobalKubeClient + localFile, err := os.Open(localFilePath) + if err != nil { + log.Printf("Error opening local file: %s\n", err) + } + + namespace := "katana" + if len(ns) > 0 { + namespace = ns[0] + } + + pod, err := client.CoreV1().Pods(namespace).Get(context.TODO(), podName, metav1.GetOptions{}) + if err != nil { + log.Printf("Error getting pod: %s\n", err) + } + + // Find the container in the pod + var container *corev1.Container + for _, c := range pod.Spec.Containers { + if c.Name == containerName { + container = &c + break + } + } + + if container == nil { + log.Printf("Container not found in pod\n") + } + // Create a stream to the container + req := client.CoreV1().RESTClient().Post(). + Resource("pods"). + Name(podName). + Namespace(namespace). + SubResource("exec"). + Param("container", containerName) + + req.VersionedParams(&corev1.PodExecOptions{ + Container: containerName, + Command: []string{"bash", "-c", "cat > " + pathInPod}, + Stdin: true, + Stdout: true, + Stderr: true, + TTY: false, + }, scheme.ParameterCodec) + + exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL()) + if err != nil { + log.Printf("Error creating executor: %s\n", err) + return err + } + + // Stream the file + err = exec.Stream(remotecommand.StreamOptions{ + Stdin: localFile, + Stdout: os.Stdout, + Stderr: os.Stderr, + Tty: false, + }) + if err != nil { + log.Printf("Error streaming the file: %s\n", err) + return err + } + + log.Println("File copied successfully") + return nil +} + +func GetKatanaLoadbalancer() (string,error) { client, err := GetKubeClient() if err != nil { log.Fatal(err) + return "", err } // Check if the service is ready err = WaitForLoadBalancerExternalIP(client, "katana-lb", "katana") if err != nil { log.Fatal(err) + return "", err } service, err := client.CoreV1().Services("katana").Get(context.TODO(), "katana-lb", metav1.GetOptions{}) if err != nil { log.Fatal(err) + return "", err } externalIP := service.Status.LoadBalancer.Ingress[0].IP - return externalIP + return externalIP, nil } func DeploymentConfig() types.ManifestConfig { @@ -227,10 +295,12 @@ func DeploymentConfig() types.ManifestConfig { harborKey, err := ioutil.ReadFile(basePath + "/lib/harbor/certs/harbor.katana.local.key") if err != nil { log.Fatal(err) + } harborCrt, err := ioutil.ReadFile(basePath + "/lib/harbor/certs/harbor.katana.local.crt") if err != nil { log.Fatal(err) + } harborCaCrt, err := ioutil.ReadFile(basePath + "/lib/harbor/certs/ca.crt") if err != nil { @@ -244,7 +314,7 @@ func DeploymentConfig() types.ManifestConfig { return config } -func Podexecutor(command []string, kubeClientset *kubernetes.Clientset, kubeConfig *rest.Config, podNamespace string) { +func Podexecutor(command []string, kubeClientset *kubernetes.Clientset, kubeConfig *rest.Config, podNamespace string)error { req := kubeClientset.CoreV1().RESTClient().Post(). Resource("pods"). Name("katana-team-master-pod-0"). @@ -260,6 +330,7 @@ func Podexecutor(command []string, kubeClientset *kubernetes.Clientset, kubeConf exec, err := remotecommand.NewSPDYExecutor(kubeConfig, "POST", req.URL()) if err != nil { log.Fatal(err) + return err } var stdout, stderr bytes.Buffer err = exec.Stream(remotecommand.StreamOptions{ @@ -269,10 +340,12 @@ func Podexecutor(command []string, kubeClientset *kubernetes.Clientset, kubeConf }) if err != nil { log.Fatal(err) + return err } + return nil } -func DeleteDaemonSetAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *rest.Config, daemonSetName string, daemonSetNamespace string) { +func DeleteDaemonSetAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *rest.Config, daemonSetName string, daemonSetNamespace string) error{ listOptions := metav1.ListOptions{ FieldSelector: "metadata.name=" + daemonSetName, Watch: true, @@ -282,14 +355,16 @@ func DeleteDaemonSetAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *res watcher, err := kubeClientset.AppsV1().DaemonSets(daemonSetNamespace).Watch(context.Background(), listOptions) if err != nil { log.Fatal(err) + return err } err = kubeClientset.AppsV1().DaemonSets(daemonSetNamespace).Delete(context.TODO(), daemonSetName, metav1.DeleteOptions{}) if err != nil { if strings.Contains(err.Error(), "not found") { - return + return nil } log.Fatal(err) + return err } for event := range watcher.ResultChan() { @@ -304,9 +379,10 @@ func DeleteDaemonSetAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *res } watcher.Stop() + return nil } -func DeleteConfigMapAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *rest.Config, configMapName string, configMapNamespace string) { +func DeleteConfigMapAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *rest.Config, configMapName string, configMapNamespace string)error { // Wait for the configmap to be deleted listOptions := metav1.ListOptions{ FieldSelector: "metadata.name=" + configMapName, @@ -317,14 +393,16 @@ func DeleteConfigMapAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *res watcher, err := kubeClientset.CoreV1().ConfigMaps(configMapNamespace).Watch(context.Background(), listOptions) if err != nil { log.Fatal(err) + return err } err = kubeClientset.CoreV1().ConfigMaps(configMapNamespace).Delete(context.TODO(), configMapName, metav1.DeleteOptions{}) if err != nil { if strings.Contains(err.Error(), "not found") { - return + return nil } log.Fatal(err) + return err } for event := range watcher.ResultChan() { @@ -339,6 +417,7 @@ func DeleteConfigMapAndWait(kubeClientset *kubernetes.Clientset, kubeConfig *res } watcher.Stop() + return nil } func WaitForLoadBalancerExternalIP(clientset *kubernetes.Clientset, serviceName string, namespace string) error { @@ -404,6 +483,22 @@ func WaitForDeploymentReady(clientset *kubernetes.Clientset, deploymentName stri return nil } +//Not Tested Yet : was giving error +func WaitForPodReady(clientset *kubernetes.Clientset, podNamespace string, wg *sync.WaitGroup) error { + watch, _ := clientset.CoreV1().Pods(podNamespace+"-ns").Watch(context.Background(), metav1.ListOptions{}) + for event := range watch.ResultChan() { + p, ok := event.Object.(*v1.Pod) + if !ok { + return fmt.Errorf("unexpected type") + } + if p.Status.Phase != "Pending" { + log.Println("Pod created") + wg.Done() + return nil + } + } + return nil +} func CreateService(clientset *kubernetes.Clientset, serviceName string, namespace string, port int32, targetPort int32, selector map[string]string) error { service := &corev1.Service{ @@ -438,83 +533,3 @@ func GetNodes(clientset *kubernetes.Clientset) ([]corev1.Node, error) { return nodes.Items, nil } -func CopyIntoPod(podName string, containerName string, pathInPod string, localFilePath string, ns ...string) error { - config, err := GetKubeConfig() - if err != nil { - return err - } - - client, err := GetKubeClient() - if err != nil { - return err - } - - namespace := "katana" - if len(ns) > 0 { - namespace = ns[0] - } - - reader, writer := io.Pipe() - - go func() { - defer writer.Close() - err := Tar(localFilePath, writer) - cmdutil.CheckErr(err) - }() - - pod, err := client.CoreV1().Pods(namespace).Get(context.TODO(), podName, metav1.GetOptions{}) - if err != nil { - log.Printf("Error getting pod: %s\n", err) - } - - // Find the container in the pod - var container *corev1.Container - for _, c := range pod.Spec.Containers { - if c.Name == containerName { - container = &c - break - } - } - - if container == nil { - log.Printf("Container not found in pod\n") - } - - // Create a stream to the container - req := client.CoreV1().RESTClient().Post(). - Resource("pods"). - Name(podName). - Namespace(namespace). - SubResource("exec"). - Param("container", containerName) - - req.VersionedParams(&corev1.PodExecOptions{ - Container: containerName, - Command: []string{"bash", "-c", "cat > " + pathInPod}, - Stdin: true, - Stdout: true, - Stderr: true, - TTY: false, - }, scheme.ParameterCodec) - - exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL()) - if err != nil { - log.Printf("Error creating executor: %s\n", err) - return err - } - - // Stream the file - err = exec.Stream(remotecommand.StreamOptions{ - Stdin: reader, - Stdout: os.Stdout, - Stderr: os.Stderr, - Tty: false, - }) - if err != nil { - log.Printf("Error streaming the file: %s\n", err) - return err - } - - log.Println("File copied successfully at " + pathInPod) - return nil -} diff --git a/lib/utils/os.go b/lib/utils/os.go index 5d8b4c18..620b7f10 100644 --- a/lib/utils/os.go +++ b/lib/utils/os.go @@ -70,11 +70,43 @@ func RunCommand(cmd string) error { return nil } +func CheckOpenSSLVersion() (bool, error) { + cmd := "openssl version" + output, err := exec.Command("bash", "-c", cmd).CombinedOutput() + if err != nil { + return false, err + } + opensslVersion:= string(output) + + versionParts := strings.Fields(opensslVersion) + if len(versionParts) < 2 { + return false,fmt.Errorf("unable to determine OpenSSL version") + } + + majorVersionStr := strings.Split(versionParts[1], ".")[0] + if majorVersionStr == "" { + return false,fmt.Errorf("unable to determine OpenSSL major version") + } + + majorVersion := 0 + _, err = fmt.Sscanf(majorVersionStr, "%d", &majorVersion) + if err != nil { + return false,fmt.Errorf("error parsing OpenSSL major version: %v", err) + } + + if majorVersion >= 3 { + return true,nil + }else{ + fmt.Println("OpenSSL version 3 or higher is required") + return false,nil + } +} + func GetKatanaRootPath() (string, error) { katanaDir, err := os.Getwd() if err != nil { fmt.Println("Error:", err) - return "", nil + return "", err } return katanaDir, nil } \ No newline at end of file diff --git a/lib/wireguard/firewall.go b/lib/wireguard/firewall.go index ba78798f..01925699 100644 --- a/lib/wireguard/firewall.go +++ b/lib/wireguard/firewall.go @@ -76,7 +76,7 @@ func ApplyFirewall() error { if err != nil { log.Println(err) } - filepath = filepath + "/katana-services/Wireguard/root/defaults/firewall.conf" + filepath = filepath + "/katana-services/wireguard/root/defaults/firewall.conf" err = os.WriteFile(filepath, []byte(finalIprules), 0644) if err != nil { fmt.Println("Error writing to file:", err) diff --git a/services/challengedeployerservice/controller.go b/services/challengedeployerservice/controller.go index f46bff33..1389eefd 100644 --- a/services/challengedeployerservice/controller.go +++ b/services/challengedeployerservice/controller.go @@ -13,11 +13,12 @@ import ( "github.com/go-git/go-git/v5/plumbing/transport/http" "github.com/gofiber/fiber/v2" archiver "github.com/mholt/archiver/v3" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + g "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/lib/deployment" "github.com/sdslabs/katana/lib/utils" "github.com/sdslabs/katana/types" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func Deploy(c *fiber.Ctx) error { @@ -26,8 +27,14 @@ func Deploy(c *fiber.Ctx) error { challengeType := "web" log.Println("Starting") + katanaDir, err := utils.GetKatanaRootPath() + if err != nil { + return err + } + challengesDir:=katanaDir+"/challenges" + //Read folder challenge by os - dir, err := os.Open("./challenges") + dir, err := os.Open(challengesDir) //Loop over all subfolders in the challenge folder if err != nil { @@ -71,7 +78,7 @@ func Deploy(c *fiber.Ctx) error { log.Println("-----------Deploying challenge for team: " + strconv.Itoa(i) + " --------") teamName := "katana-team-" + strconv.Itoa(i) deployment.DeployChallengeToCluster(folderName, teamName, patch, replicas) - url, err := createServiceForChallenge(folderName, teamName, 3000, i) + url, err := CreateServiceForChallenge(folderName, teamName, 3000, i) if err != nil { res = append(res, []string{teamName, err.Error()}) } else { @@ -79,9 +86,18 @@ func Deploy(c *fiber.Ctx) error { } } } - copyChallengeIntoTsuka(challengePath, folderName, challengeType) - copyFlagDataIntoKashira(challengePath, folderName) - copyChallengeCheckerIntoKissaki(challengePath, folderName) + err = CopyChallengeIntoTsuka(challengePath, folderName, challengeType) + if err != nil { + return err + } + err = CopyFlagDataIntoKashira(challengePath, folderName) + if err != nil { + return err + } + err = CopyChallengeCheckerIntoKissaki(challengePath, folderName) + if err != nil { + return err + } } } return c.JSON(res) @@ -106,7 +122,7 @@ func DeployChallenge(c *fiber.Ctx) error { match := regex.FindStringSubmatch(file.Filename) folderName = match[1] - response, challengePath := createFolder(folderName) + response, challengePath := CreateFolder(folderName) if response == 1 { log.Println("Directory already exists with same name") return c.SendString("Directory already exists with same name") @@ -134,7 +150,10 @@ func DeployChallenge(c *fiber.Ctx) error { } //Update challenge path to get dockerfile - utils.BuildDockerImage(folderName, challengePath+"/"+folderName) + err = utils.BuildDockerImage(folderName, challengePath+"/"+folderName) + if err != nil { + return err + } //Get no.of teams and DEPLOY CHALLENGE to each namespace (assuming they exist and /createTeams has been called) clusterConfig := g.ClusterConfig @@ -144,16 +163,16 @@ func DeployChallenge(c *fiber.Ctx) error { log.Println("-----------Deploying challenge for team: " + strconv.Itoa(i) + " --------") teamName := "katana-team-" + strconv.Itoa(i) deployment.DeployChallengeToCluster(folderName, teamName, patch, replicas) - url, err := createServiceForChallenge(folderName, teamName, 3000, i) + url, err := CreateServiceForChallenge(folderName, teamName, 3000, i) if err != nil { res = append(res, []string{teamName, err.Error()}) } else { res = append(res, []string{teamName, url}) } } - copyChallengeIntoTsuka(challengePath, folderName, challengeType) - copyFlagDataIntoKashira(challengePath, folderName) - copyChallengeCheckerIntoKissaki(challengePath, folderName) + CopyChallengeIntoTsuka(challengePath, folderName, challengeType) + CopyFlagDataIntoKashira(challengePath, folderName) + CopyChallengeCheckerIntoKissaki(challengePath, folderName) return c.JSON(res) } @@ -164,7 +183,7 @@ func DeployChallenge(c *fiber.Ctx) error { func ChallengeUpdate(c *fiber.Ctx) error { replicas := int32(1) - client, _ := utils.GetKubeClient() + client:=g.GlobalKubeClient patch := true //http connection configuration for 30 min @@ -183,6 +202,7 @@ func ChallengeUpdate(c *fiber.Ctx) error { repo, err := git.PlainOpen("teams/" + dir) if err != nil { log.Println(err) + return err } auth := &http.BasicAuth{ @@ -197,14 +217,21 @@ func ChallengeUpdate(c *fiber.Ctx) error { }) if err != nil { - log.Println("Error pulling changes:", err) + return fmt.Errorf("Error pulling changes:%w", err) + } katanaDir, err := utils.GetKatanaRootPath() + if err != nil { + return err + } imageName := strings.Replace(dir, "/", "-", -1) log.Println("Pull successful for", teamName, ". Building image...") firstPatch := !utils.DockerImageExists(imageName) - utils.BuildDockerImage(imageName, katanaDir+"/teams/"+dir) + err = utils.BuildDockerImage(imageName, katanaDir+"/teams/"+dir) + if err != nil { + return err + } if firstPatch { log.Println("First Patch for", teamName) @@ -223,6 +250,7 @@ func ChallengeUpdate(c *fiber.Ctx) error { if err != nil { log.Println("Error") log.Println(err) + return err } } log.Println("Image built for", teamName) @@ -251,7 +279,7 @@ func DeleteChallenge(c *fiber.Ctx) error { teamName := "team-" + strconv.Itoa(i) teamNamespace := "katana-" + teamName + "-ns" - kubeclient, err := utils.GetKubeClient() + kubeclient:=g.GlobalKubeClient if err != nil { return err } @@ -265,7 +293,6 @@ func DeleteChallenge(c *fiber.Ctx) error { if err != nil { log.Println(" Error in getting deployments associated with the challenge. ") continue - //panic(err) } //Delete deployments @@ -292,7 +319,7 @@ func DeleteChallenge(c *fiber.Ctx) error { flag := 0 for _, service := range services.Items { - if service.Name == challengeName { + if service.Name == challengeName+"-svc-"+strconv.Itoa(i) { flag = 1 } } diff --git a/services/challengedeployerservice/helper.go b/services/challengedeployerservice/helper.go index f704bdb8..9664fbc7 100644 --- a/services/challengedeployerservice/helper.go +++ b/services/challengedeployerservice/helper.go @@ -5,15 +5,17 @@ import ( "log" "os" "strconv" + "strings" git "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/config" + v1 "k8s.io/api/core/v1" + g "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/lib/utils" - v1 "k8s.io/api/core/v1" ) -func copyChallengeIntoTsuka(dirPath string, challengeName string, challengeType string) error { +func CopyChallengeIntoTsuka(dirPath string, challengeName string, challengeType string) error { localFilePath := dirPath + "/" + challengeName pathInPod := "/opt/katana/katana_" + challengeType + "_" + challengeName + ".tar.gz" log.Println("Testing" + localFilePath + "....and..." + pathInPod) @@ -27,19 +29,38 @@ func copyChallengeIntoTsuka(dirPath string, challengeName string, challengeType err := os.Mkdir("teams/"+path, 0755) if err != nil { log.Println(err) + if (strings.Contains(err.Error(), "file exists")) { + err = os.RemoveAll("teams/" + path) + if err != nil { + log.Println(err) + } + err = os.Mkdir("teams/"+path, 0755) + if err != nil { + log.Println(err) + } + }else{ + return err + } } git.PlainInit("teams/"+path, false) repo, err := git.PlainOpen("teams/" + path) if err != nil { log.Println(err) } + katanaLB, err := utils.GetKatanaLoadbalancer() + if err != nil { + return fmt.Errorf("error in getting Katana Load Balancer : %s/n", err) + } remoteConfig := &config.RemoteConfig{ Name: "origin", - URLs: []string{"http://sdslabs@" + utils.GetKatanaLoadbalancer() + ":3000" + "/" + path}} + URLs: []string{"http://sdslabs@" + katanaLB + ":3000" + "/" + path}} _, err = repo.CreateRemote(remoteConfig) if err != nil { log.Println(err) + if (!strings.Contains(err.Error(), "remote already exists")) { + return err + } } podsInTeam, err := utils.GetPods(map[string]string{ "app": g.ClusterConfig.TeamLabel, @@ -61,8 +82,8 @@ func copyChallengeIntoTsuka(dirPath string, challengeName string, challengeType return nil } -func createServiceForChallenge(challengeName, teamName string, targetPort int32, teamNumber int) (string, error) { - kubeclient, _ := utils.GetKubeClient() +func CreateServiceForChallenge(challengeName, teamName string, targetPort int32, teamNumber int) (string, error) { + kubeclient:=g.GlobalKubeClient serviceName := challengeName + "-svc-" + strconv.Itoa(teamNumber) teamNamespace := teamName + "-ns" port := int32(80) @@ -77,7 +98,7 @@ func createServiceForChallenge(challengeName, teamName string, targetPort int32, return serviceName, nil } -func createFolder(challengeName string) (message int, challengePath string) { +func CreateFolder(challengeName string) (message int, challengePath string) { basePath, _ := os.Getwd() dirPath := basePath + "/challenges" //basepath is .../katana @@ -112,7 +133,7 @@ func createFolder(challengeName string) (message int, challengePath string) { return 0, challengePath } -func copyChallengeCheckerIntoKissaki(dirPath string, challengeName string) error { +func CopyChallengeCheckerIntoKissaki(dirPath string, challengeName string) error { srcFilePath := dirPath + "/" + challengeName + "-challenge-checker" pathInPod := "/opt/kissaki/kissaki_" + challengeName + ".tar.gz" @@ -123,7 +144,7 @@ func copyChallengeCheckerIntoKissaki(dirPath string, challengeName string) error return nil } -func copyFlagDataIntoKashira(dirPath string, challengeName string) error { +func CopyFlagDataIntoKashira(dirPath string, challengeName string) error { srcFilePath := dirPath + "/" + "flag-data" pathInPod := "/opt/kashira/kashira_" + challengeName + ".tar.gz" diff --git a/services/infrasetservice/controller.go b/services/infrasetservice/controller.go index 93146165..0d08874b 100644 --- a/services/infrasetservice/controller.go +++ b/services/infrasetservice/controller.go @@ -14,6 +14,9 @@ import ( "github.com/gofiber/fiber/v2" "github.com/golang-jwt/jwt" + coreV1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/lib/deployment" "github.com/sdslabs/katana/lib/harbor" @@ -22,44 +25,38 @@ import ( utils "github.com/sdslabs/katana/lib/utils" "github.com/sdslabs/katana/lib/wireguard" "github.com/sdslabs/katana/types" - coreV1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func InfraSet(c *fiber.Ctx) error { - - config, err := utils.GetKubeConfig() - if err != nil { - log.Fatal(err) - } - - kubeclient, err := utils.GetKubeClient() - if err != nil { - log.Fatal(err) + config:= configs.GlobalKubeConfig + kubeclient:= configs.GlobalKubeClient + if err := GenerateCertsforHarbor(); err != nil { + log.Println("Error generating certificates :", err) + return err } - - log.Println("Creating harbor certs ...") - generateCertsforHarbor() - log.Println("Created harbor certs ...") - if err = deployment.DeployCluster(config, kubeclient); err != nil { + if err := deployment.DeployCluster(config, kubeclient); err != nil { log.Fatal(err) + return err } - - err = harbor.SetupHarbor() + err := harbor.SetupHarbor() if err != nil { log.Fatal(err) + return err } - err = wireguard.ApplyFirewall() if err != nil { log.Fatal(err) } - buildKatanaServices() + if err = BuildKatanaServices(); err != nil { + log.Fatal(err) + return err + } err = wireguard.SetupWireguard() if err != nil { log.Fatal(err) + return err } return c.SendString("Infrastructure setup completed") @@ -117,40 +114,16 @@ func CreateTeams(c *fiber.Ctx) error { // if !utils.VerifyToken(c) { // return c.SendString("Unauthorized") // } + config:= configs.GlobalKubeConfig + client:= configs.GlobalKubeClient - config, err := utils.GetKubeConfig() - if err != nil { - log.Fatal(err) - } - client, err := utils.GetKubeClient() - if err != nil { - log.Fatal(err) - } noOfTeams := int(configs.ClusterConfig.TeamCount) - if err != nil { - log.Fatal(err) - } - if _, err := os.Stat("teams"); os.IsNotExist(err) { - errDir := os.Mkdir("teams", 0755) - if errDir != nil { - log.Fatal(err) - } - } - - // Create a directory named teams in the current directory - if _, err := os.Stat("teams"); os.IsNotExist(err) { - errDir := os.Mkdir("teams", 0755) - if errDir != nil { - log.Fatal(err) - } - } - - // Create a directory named teams in the current directory if _, err := os.Stat("teams"); os.IsNotExist(err) { errDir := os.Mkdir("teams", 0755) if errDir != nil { log.Fatal(err) + return err } } @@ -158,6 +131,7 @@ func CreateTeams(c *fiber.Ctx) error { credsFile, err := os.Create(configs.SSHProviderConfig.CredsFile) if err != nil { log.Fatal(err) + return err } for i := 0; i < noOfTeams; i++ { @@ -166,6 +140,7 @@ func CreateTeams(c *fiber.Ctx) error { errDir := os.Mkdir("teams/katana-team-"+strconv.Itoa(i), 0755) if errDir != nil { log.Fatal(err) + return err } } @@ -176,24 +151,27 @@ func CreateTeams(c *fiber.Ctx) error { Name: namespace, }, } - _, err = client.CoreV1().Namespaces().Create(c.Context(), nsName, metav1.CreateOptions{}) if err != nil { log.Fatal(err) + if(err.Error() != "namespaces \""+namespace+"\" already exists in the cluster"){ + return err + } } - manifest := &bytes.Buffer{} tmpl, err := template.ParseFiles(filepath.Join(configs.ClusterConfig.TemplatedManifestDir, "runtime", "teams.yml")) + if err != nil { + log.Fatal(err) + return err + } + pwd, team, err := CreateTeamCredentials(i) if err != nil { return err } - - pwd, team := createTeamCredentials(i) deploymentConfig := utils.DeploymentConfig() deploymentConfig.SSHPassword = pwd - if err = tmpl.Execute(manifest, deploymentConfig); err != nil { return err } @@ -212,8 +190,10 @@ func GitServer(c *fiber.Ctx) error { var requestBody bytes.Buffer writer := multipart.NewWriter(&requestBody) - LoadBalancer := utils.GetKatanaLoadbalancer() - + LoadBalancer, err := utils.GetKatanaLoadbalancer() + if err != nil { + return err + } writer.WriteField("db_type", "MySQL") writer.WriteField("db_host", LoadBalancer+":3306") writer.WriteField("db_user", configs.MySQLConfig.Username) diff --git a/services/infrasetservice/helper.go b/services/infrasetservice/helper.go index 71b344ce..cb5a3e7e 100644 --- a/services/infrasetservice/helper.go +++ b/services/infrasetservice/helper.go @@ -7,15 +7,16 @@ import ( "os" "strings" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/sdslabs/katana/configs" "github.com/sdslabs/katana/lib/mysql" utils "github.com/sdslabs/katana/lib/utils" "github.com/sdslabs/katana/types" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func generateCertsforHarbor() { +func GenerateCertsforHarbor() error { path, _ := os.Getwd() path = path + "/lib/harbor/certs" @@ -25,6 +26,7 @@ func generateCertsforHarbor() { errDir := os.RemoveAll(path) if errDir != nil { log.Fatal(err) + return err } } log.Println("CHECK 2") @@ -38,18 +40,26 @@ func generateCertsforHarbor() { // Generate the certificates if err := utils.GenerateCerts("harbor.katana.local", path); err != nil { log.Fatal(err) + return err } log.Println("CHECK 4") + return nil } -func createTeamCredentials(teamNumber int) (string, types.CTFTeam) { +func CreateTeamCredentials(teamNumber int) (string, types.CTFTeam, error) { teamlabels := utils.GetTeamPodLabels() podName := teamlabels + "-team-master-pod-0" - gogs := utils.GetKatanaLoadbalancer() + ":3000" + gogs, err := utils.GetKatanaLoadbalancer() + if err != nil { + log.Fatal(err) + return "", types.CTFTeam{}, err + } + gogs = gogs + ":3000" pwd := utils.RandomString(configs.SSHProviderConfig.PasswordLen) hashed, err := utils.HashPassword(pwd) if err != nil { log.Fatal(err) + return "", types.CTFTeam{}, err } podNamespace := "katana-team-" + fmt.Sprint(teamNumber) // start watching for container events @@ -60,19 +70,28 @@ func createTeamCredentials(teamNumber int) (string, types.CTFTeam) { PodName: podName, Password: hashed, } - mysql.CreateGogsUser(team.Name, pwd) - mysql.CreateAccessToken(team.Name, pwd) - return pwd, team + err = mysql.CreateGogsUser(team.Name, pwd) + if err != nil { + log.Fatal(err) + return "", types.CTFTeam{}, err + } + err = mysql.CreateAccessToken(team.Name, pwd) + if err != nil { + log.Fatal(err) + return "", types.CTFTeam{}, err + } + return pwd, team, nil } -func envVariables(gogs string, pwd string, podNamespace string) { - kubeClientset, _ := utils.GetKubeClient() - kubeConfig, _ := utils.GetKubeConfig() +func envVariables(gogs string, pwd string, podNamespace string) error { + kubeClientset:= configs.GlobalKubeClient + kubeConfig:= configs.GlobalKubeConfig watch, _ := kubeClientset.CoreV1().Pods(podNamespace+"-ns").Watch(context.Background(), metav1.ListOptions{}) for event := range watch.ResultChan() { p, ok := event.Object.(*v1.Pod) if !ok { log.Fatal("unexpected type") + return fmt.Errorf("unexpected type") } if p.Status.Phase != "Pending" { log.Println("Pod created") @@ -93,18 +112,22 @@ func envVariables(gogs string, pwd string, podNamespace string) { break } } + return nil } -func buildKatanaServices() { - katanaDir, err := utils.GetKatanaRootPath() - if err != nil { - log.Fatal(err) +func BuildKatanaServices() error { + katanaDir, errDir := utils.GetKatanaRootPath() + if errDir != nil { + log.Fatal(errDir) + return errDir } + katanaServicesDir := katanaDir + "/katana-services" services, err := os.ReadDir(katanaServicesDir) if err != nil { log.Fatal(err) + return err } for _, service := range services { @@ -123,7 +146,12 @@ func buildKatanaServices() { if service.IsDir() { log.Println("Building " + service.Name()) imageName := strings.ToLower(service.Name()) - utils.BuildDockerImage(imageName, katanaServicesDir+"/"+service.Name()) + err := utils.BuildDockerImage(imageName, katanaServicesDir+"/"+service.Name()) + if err != nil { + return err + } + } } + return nil } diff --git a/services/master/server.go b/services/master/server.go index 91a16df4..6776d122 100644 --- a/services/master/server.go +++ b/services/master/server.go @@ -7,6 +7,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" + cfg "github.com/sdslabs/katana/configs" challengeDeployerService "github.com/sdslabs/katana/services/challengedeployerservice" infraSetService "github.com/sdslabs/katana/services/infrasetservice"