From 1eef32dd8e4834f15a68975f87e4e0ad079bacb9 Mon Sep 17 00:00:00 2001 From: shm12 Date: Thu, 9 Jun 2022 14:53:48 +0300 Subject: [PATCH] Use clone in remote git repositories --- core/pkg/resourcehandler/filesloader.go | 28 +++++++++++++---- core/pkg/resourcehandler/remotegitutils.go | 36 ++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 +-- 4 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 core/pkg/resourcehandler/remotegitutils.go diff --git a/core/pkg/resourcehandler/filesloader.go b/core/pkg/resourcehandler/filesloader.go index 7ad49de9..f674930d 100644 --- a/core/pkg/resourcehandler/filesloader.go +++ b/core/pkg/resourcehandler/filesloader.go @@ -2,8 +2,11 @@ package resourcehandler import ( "fmt" + "os" + "path/filepath" "github.com/armosec/armoapi-go/armotypes" + giturl "github.com/armosec/go-git-url" "github.com/armosec/k8s-interface/workloadinterface" "github.com/armosec/opa-utils/reporthandling" "k8s.io/apimachinery/pkg/version" @@ -30,9 +33,6 @@ func NewFileResourceHandler(inputPatterns []string, registryAdaptors *RegistryAd func (fileHandler *FileResourceHandler) GetResources(sessionObj *cautils.OPASessionObj, designator *armotypes.PortalDesignator) (*cautils.K8SResources, map[string]workloadinterface.IMetadata, *cautils.ArmoResources, error) { - logger.L().Info("Accessing local objects") - cautils.StartSpinner() - // build resources map // map resources based on framework required resources: map["/group/version/kind"][] k8sResources := setK8sResourceMap(sessionObj.Policies) @@ -42,8 +42,26 @@ func (fileHandler *FileResourceHandler) GetResources(sessionObj *cautils.OPASess workloads := []workloadinterface.IMetadata{} + path := fileHandler.inputPatterns[0] + + // Clone git repository if needed + gitURL, err := giturl.NewGitURL(path) + if err == nil { + logger.L().Info("cloning git repository") + cautils.StartSpinner() + cloneDir, err := cloneRepo(gitURL) + cautils.StopSpinner() + if err != nil { + return nil, allResources, nil, fmt.Errorf("could not clone repository. %w", err) + } + defer os.RemoveAll(cloneDir) + path = filepath.Join(cloneDir, gitURL.GetPath()) + } + // load resource from local file system - sourceToWorkloads, err := cautils.LoadResourcesFromFiles(fileHandler.inputPatterns[0]) + logger.L().Info("Accessing local objects") + + sourceToWorkloads, err := cautils.LoadResourcesFromFiles(path) if err != nil { return nil, allResources, nil, err } @@ -83,11 +101,9 @@ func (fileHandler *FileResourceHandler) GetResources(sessionObj *cautils.OPASess logger.L().Warning("failed to collect images vulnerabilities", helpers.Error(err)) } - cautils.StopSpinner() logger.L().Success("Accessed to local objects") return k8sResources, allResources, armoResources, nil - } func (fileHandler *FileResourceHandler) GetClusterAPIServerInfo() *version.Info { diff --git a/core/pkg/resourcehandler/remotegitutils.go b/core/pkg/resourcehandler/remotegitutils.go new file mode 100644 index 00000000..47a45d09 --- /dev/null +++ b/core/pkg/resourcehandler/remotegitutils.go @@ -0,0 +1,36 @@ +package resourcehandler + +import ( + "fmt" + "os" + + giturl "github.com/armosec/go-git-url" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" +) + +// cloneRepo clones a repository to a local temporary directory and returns the directory +func cloneRepo(gitURL giturl.IGitURL) (string, error) { + + // Create temp directory + tmpDir, err := os.MkdirTemp("", "") + if err != nil { + return "", fmt.Errorf("failed to create temporary directory: %w", err) + } + + // Clone option + cloneURL := gitURL.GetHttpCloneURL() + cloneOpts := git.CloneOptions{URL: cloneURL} + if gitURL.GetBranchName() != "" { + cloneOpts.ReferenceName = plumbing.NewBranchReferenceName(gitURL.GetBranchName()) + cloneOpts.SingleBranch = true + } + + // Actual clone + _, err = git.PlainClone(tmpDir, false, &cloneOpts) + if err != nil { + return "", fmt.Errorf("failed to clone %s. %w", gitURL.GetRepoName(), err) + } + + return tmpDir, nil +} diff --git a/go.mod b/go.mod index 9ab4cca9..240749e3 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/armosec/armoapi-go v0.0.73 - github.com/armosec/go-git-url v0.0.9 + github.com/armosec/go-git-url v0.0.13 github.com/armosec/k8s-interface v0.0.76 github.com/armosec/opa-utils v0.0.144 github.com/armosec/rbac-utils v0.0.14 diff --git a/go.sum b/go.sum index d307095d..20abf5a9 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/armosec/armoapi-go v0.0.2/go.mod h1:vIK17yoKbJRQyZXWWLe3AqfqCRITxW8qm github.com/armosec/armoapi-go v0.0.23/go.mod h1:iaVVGyc23QGGzAdv4n+szGQg3Rbpixn9yQTU3qWRpaw= github.com/armosec/armoapi-go v0.0.73 h1:LMf+eCkkf+W9NVvOzHKFgVUEpBMvh27M7//UQP3aiO8= github.com/armosec/armoapi-go v0.0.73/go.mod h1:/9SQAgtLbYkfFneRRm/zkIn3zz+4Y2xv6N3vtFcyF8s= -github.com/armosec/go-git-url v0.0.9 h1:AnoG0NOrcAE8ptTy6iFG/0jlar3hly++DWAqhlvf/n4= -github.com/armosec/go-git-url v0.0.9/go.mod h1:GzfssG3IW9KiURSpK7c/bySBRTlghpObQ7NQ1O4hcMI= +github.com/armosec/go-git-url v0.0.13 h1:kwzHBL7oFqf2UsR0h4Sx+HMYqO9xHHuBFXGIyuMqHAg= +github.com/armosec/go-git-url v0.0.13/go.mod h1:GzfssG3IW9KiURSpK7c/bySBRTlghpObQ7NQ1O4hcMI= github.com/armosec/k8s-interface v0.0.8/go.mod h1:xxS+V5QT3gVQTwZyAMMDrYLWGrfKOpiJ7Jfhfa0w9sM= github.com/armosec/k8s-interface v0.0.37/go.mod h1:vHxGWqD/uh6+GQb9Sqv7OGMs+Rvc2dsFVc0XtgRh1ZU= github.com/armosec/k8s-interface v0.0.76 h1:pQaF+8BcNMm6GTYTjdG7vCM1l4BIk7oALXoT6v5gCAk=