Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kubescape for openSUSE:Factory checked in at 2025-07-28 14:58:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kubescape (Old) and /work/SRC/openSUSE:Factory/.kubescape.new.13279 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kubescape" Mon Jul 28 14:58:38 2025 rev:23 rq:1296010 version:3.0.36 Changes: -------- --- /work/SRC/openSUSE:Factory/kubescape/kubescape.changes 2025-07-07 14:49:37.732115247 +0200 +++ /work/SRC/openSUSE:Factory/.kubescape.new.13279/kubescape.changes 2025-07-28 14:58:57.224286701 +0200 @@ -1,0 +2,10 @@ +Mon Jul 28 05:34:58 UTC 2025 - Johannes Kastl <opensuse_buildserv...@ojkastl.de> + +- Update to version 3.0.36: + * fix buildnumber test + * close grype DB at the very end of processing + * do not fail version if update info cannot be fetched + * fix: control-plane node taints check (#1843) + * check scanInfo.Submit in HandleResults to not submit by default + +------------------------------------------------------------------- Old: ---- kubescape-3.0.35.obscpio New: ---- kubescape-3.0.36.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kubescape.spec ++++++ --- /var/tmp/diff_new_pack.1tNVFd/_old 2025-07-28 14:58:59.444379181 +0200 +++ /var/tmp/diff_new_pack.1tNVFd/_new 2025-07-28 14:58:59.448379348 +0200 @@ -17,7 +17,7 @@ Name: kubescape -Version: 3.0.35 +Version: 3.0.36 Release: 0 Summary: Tool providing a multi-cloud K8s single pane of glass License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.1tNVFd/_old 2025-07-28 14:58:59.480380680 +0200 +++ /var/tmp/diff_new_pack.1tNVFd/_new 2025-07-28 14:58:59.480380680 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/armosec/kubescape</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v3.0.35</param> + <param name="revision">v3.0.36</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.1tNVFd/_old 2025-07-28 14:58:59.500381513 +0200 +++ /var/tmp/diff_new_pack.1tNVFd/_new 2025-07-28 14:58:59.508381847 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/armosec/kubescape</param> - <param name="changesrevision">6042818a7178b43d0fa0dbb0bbc07f57036de426</param></service></servicedata> + <param name="changesrevision">cd046fa695f5492ea23195604c46f753e92dfb63</param></service></servicedata> (No newline at EOF) ++++++ kubescape-3.0.35.obscpio -> kubescape-3.0.36.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/cmd/scan/control.go new/kubescape-3.0.36/cmd/scan/control.go --- old/kubescape-3.0.35/cmd/scan/control.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/cmd/scan/control.go 2025-07-26 11:08:43.000000000 +0200 @@ -99,7 +99,7 @@ if err != nil { logger.L().Fatal(err.Error()) } - if err := results.HandleResults(ks.Context()); err != nil { + if err := results.HandleResults(ks.Context(), scanInfo); err != nil { logger.L().Fatal(err.Error()) } if !scanInfo.VerboseMode { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/cmd/scan/framework.go new/kubescape-3.0.36/cmd/scan/framework.go --- old/kubescape-3.0.35/cmd/scan/framework.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/cmd/scan/framework.go 2025-07-26 11:08:43.000000000 +0200 @@ -117,7 +117,7 @@ logger.L().Fatal(err.Error()) } - if err = results.HandleResults(ks.Context()); err != nil { + if err = results.HandleResults(ks.Context(), scanInfo); err != nil { logger.L().Fatal(err.Error()) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/cmd/scan/scan.go new/kubescape-3.0.36/cmd/scan/scan.go --- old/kubescape-3.0.35/cmd/scan/scan.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/cmd/scan/scan.go 2025-07-26 11:08:43.000000000 +0200 @@ -139,7 +139,7 @@ return err } - if err = results.HandleResults(ks.Context()); err != nil { + if err = results.HandleResults(ks.Context(), &scanInfo); err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/cmd/scan/workload.go new/kubescape-3.0.36/cmd/scan/workload.go --- old/kubescape-3.0.35/cmd/scan/workload.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/cmd/scan/workload.go 2025-07-26 11:08:43.000000000 +0200 @@ -70,7 +70,7 @@ logger.L().Fatal(err.Error()) } - if err = results.HandleResults(ks.Context()); err != nil { + if err = results.HandleResults(ks.Context(), scanInfo); err != nil { logger.L().Fatal(err.Error()) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/cmd/version/version.go new/kubescape-3.0.36/cmd/version/version.go --- old/kubescape-3.0.35/cmd/version/version.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/cmd/version/version.go 2025-07-26 11:08:43.000000000 +0200 @@ -16,14 +16,11 @@ Long: ``, RunE: func(cmd *cobra.Command, args []string) error { v := versioncheck.NewIVersionCheckHandler(ks.Context()) - versionCheckRequest := versioncheck.NewVersionCheckRequest("", versioncheck.BuildNumber, "", "", "version", nil) - if err := v.CheckLatestVersion(ks.Context(), versionCheckRequest); err != nil { - return err - } + _ = v.CheckLatestVersion(ks.Context(), versioncheck.NewVersionCheckRequest("", versioncheck.BuildNumber, "", "", "version", nil)) - fmt.Fprintf(cmd.OutOrStdout(), + _, _ = fmt.Fprintf(cmd.OutOrStdout(), "Your current version is: %s\n", - versionCheckRequest.ClientVersion, + versioncheck.BuildNumber, ) return nil }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/cmd/version/version_test.go new/kubescape-3.0.36/cmd/version/version_test.go --- old/kubescape-3.0.35/cmd/version/version_test.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/cmd/version/version_test.go 2025-07-26 11:08:43.000000000 +0200 @@ -20,7 +20,7 @@ }{ { name: "Undefined Build Number", - buildNumber: "", + buildNumber: "unknown", want: "Your current version is: unknown\n", }, { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/core/core/image_scan.go new/kubescape-3.0.36/core/core/image_scan.go --- old/kubescape-3.0.35/core/core/image_scan.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/core/core/image_scan.go 2025-07-26 11:08:43.000000000 +0200 @@ -165,7 +165,12 @@ logger.L().Start(fmt.Sprintf("Scanning image %s...", imgScanInfo.Image)) dbCfg, _ := imagescan.NewDefaultDBConfig() - svc := imagescan.NewScanService(dbCfg) + svc, err := imagescan.NewScanService(dbCfg) + if err != nil { + logger.L().StopError(fmt.Sprintf("Failed to initialize image scanner: %s", err)) + return nil, err + } + defer svc.Close() creds := imagescan.RegistryCredentials{ Username: imgScanInfo.Username, @@ -207,5 +212,5 @@ }, } - return scanResults, resultsHandler.HandleResults(ks.Context()) + return scanResults, resultsHandler.HandleResults(ks.Context(), scanInfo) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/core/core/patch.go new/kubescape-3.0.36/core/core/patch.go --- old/kubescape-3.0.35/core/core/patch.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/core/core/patch.go 2025-07-26 11:08:43.000000000 +0200 @@ -31,7 +31,12 @@ // Setup the scan service dbCfg, _ := imagescan.NewDefaultDBConfig() - svc := imagescan.NewScanService(dbCfg) + svc, err := imagescan.NewScanService(dbCfg) + if err != nil { + logger.L().StopError(fmt.Sprintf("Failed to initialize image scanner: %s", err)) + return nil, err + } + defer svc.Close() creds := imagescan.RegistryCredentials{ Username: patchInfo.Username, Password: patchInfo.Password, @@ -106,7 +111,7 @@ }, } - return scanResultsPatched, resultsHandler.HandleResults(ks.Context()) + return scanResultsPatched, resultsHandler.HandleResults(ks.Context(), scanInfo) } func disableCopaLogger() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/core/core/scan.go new/kubescape-3.0.36/core/core/scan.go --- old/kubescape-3.0.35/core/core/scan.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/core/core/scan.go 2025-07-26 11:08:43.000000000 +0200 @@ -244,7 +244,12 @@ } dbCfg, _ := imagescan.NewDefaultDBConfig() - svc := imagescan.NewScanService(dbCfg) + svc, err := imagescan.NewScanService(dbCfg) + if err != nil { + logger.L().StopError(fmt.Sprintf("Failed to initialize image scanner: %s", err)) + return + } + defer svc.Close() for _, img := range imagesToScan { logger.L().Start("Scanning", helpers.String("image", img)) @@ -255,7 +260,7 @@ } } -func scanSingleImage(ctx context.Context, img string, svc imagescan.Service, resultsHandling *resultshandling.ResultsHandler) error { +func scanSingleImage(ctx context.Context, img string, svc *imagescan.Service, resultsHandling *resultshandling.ResultsHandler) error { scanResults, err := svc.Scan(ctx, img, imagescan.RegistryCredentials{}, nil, nil) if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/core/pkg/resourcehandler/k8sresources.go new/kubescape-3.0.36/core/pkg/resourcehandler/k8sresources.go --- old/kubescape-3.0.35/core/pkg/resourcehandler/k8sresources.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/core/pkg/resourcehandler/k8sresources.go 2025-07-26 11:08:43.000000000 +0200 @@ -478,8 +478,15 @@ // NoSchedule taint with empty value is usually applied to controlplane func isMasterNodeTaints(taints []v1.Taint) bool { for _, taint := range taints { - if taint.Effect == v1.TaintEffectNoSchedule && taint.Value == "" { - return true + if taint.Effect == v1.TaintEffectNoSchedule { + // NoSchedule taint with empty value is usually applied to controlplane + if taint.Value == "" { + return true + } + + if taint.Key == "node-role.kubernetes.io/control-plane" && taint.Value == "true" { + return true + } } } return false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/core/pkg/resourcehandler/k8sresources_test.go new/kubescape-3.0.36/core/pkg/resourcehandler/k8sresources_test.go --- old/kubescape-3.0.35/core/pkg/resourcehandler/k8sresources_test.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/core/pkg/resourcehandler/k8sresources_test.go 2025-07-26 11:08:43.000000000 +0200 @@ -14,264 +14,264 @@ ) func TestIsMasterNodeTaints(t *testing.T) { - noTaintNode := ` -{ -"apiVersion": "v1", -"kind": "Node", -"metadata": { - "annotations": { - "kubeadm.alpha.kubernetes.io/cri-socket": "/var/run/dockershim.sock", - "node.alpha.kubernetes.io/ttl": "0", - "volumes.kubernetes.io/controller-managed-attach-detach": "true" - }, - "creationTimestamp": "2022-05-16T10:52:32Z", - "labels": { - "beta.kubernetes.io/arch": "amd64", - "beta.kubernetes.io/os": "linux", - "kubernetes.io/arch": "amd64", - "kubernetes.io/hostname": "danielg-minikube", - "kubernetes.io/os": "linux", - "minikube.k8s.io/commit": "3e64b11ed75e56e4898ea85f96b2e4af0301f43d", - "minikube.k8s.io/name": "danielg-minikube", - "minikube.k8s.io/updated_at": "2022_05_16T13_52_35_0700", - "minikube.k8s.io/version": "v1.25.1", - "node-role.kubernetes.io/control-plane": "", - "node-role.kubernetes.io/master": "", - "node.kubernetes.io/exclude-from-external-load-balancers": "" - }, - "name": "danielg-minikube", - "resourceVersion": "9432", - "uid": "fc4afcb6-4ca4-4038-ba54-5e16065a614a" -}, -"spec": { - "podCIDR": "10.244.0.0/24", - "podCIDRs": [ - "10.244.0.0/24" - ] -}, -"status": { - "addresses": [ + noTaintNodeJson := ` { - "address": "192.168.49.2", - "type": "InternalIP" - }, - { - "address": "danielg-minikube", - "type": "Hostname" - } - ], - "allocatable": { - "cpu": "4", - "ephemeral-storage": "94850516Ki", - "hugepages-2Mi": "0", - "memory": "10432976Ki", - "pods": "110" - }, - "capacity": { - "cpu": "4", - "ephemeral-storage": "94850516Ki", - "hugepages-2Mi": "0", - "memory": "10432976Ki", - "pods": "110" - }, - "conditions": [ - { - "lastHeartbeatTime": "2022-05-16T14:14:31Z", - "lastTransitionTime": "2022-05-16T10:52:29Z", - "message": "kubelet has sufficient memory available", - "reason": "KubeletHasSufficientMemory", - "status": "False", - "type": "MemoryPressure" - }, - { - "lastHeartbeatTime": "2022-05-16T14:14:31Z", - "lastTransitionTime": "2022-05-16T10:52:29Z", - "message": "kubelet has no disk pressure", - "reason": "KubeletHasNoDiskPressure", - "status": "False", - "type": "DiskPressure" - }, - { - "lastHeartbeatTime": "2022-05-16T14:14:31Z", - "lastTransitionTime": "2022-05-16T10:52:29Z", - "message": "kubelet has sufficient PID available", - "reason": "KubeletHasSufficientPID", - "status": "False", - "type": "PIDPressure" - }, - { - "lastHeartbeatTime": "2022-05-16T14:14:31Z", - "lastTransitionTime": "2022-05-16T10:52:45Z", - "message": "kubelet is posting ready status", - "reason": "KubeletReady", - "status": "True", - "type": "Ready" + "apiVersion": "v1", + "kind": "Node", + "metadata": { + "annotations": { + "kubeadm.alpha.kubernetes.io/cri-socket": "/var/run/dockershim.sock", + "node.alpha.kubernetes.io/ttl": "0", + "volumes.kubernetes.io/controller-managed-attach-detach": "true" + }, + "creationTimestamp": "2022-05-16T10:52:32Z", + "labels": { + "beta.kubernetes.io/arch": "amd64", + "beta.kubernetes.io/os": "linux", + "kubernetes.io/arch": "amd64", + "kubernetes.io/hostname": "danielg-minikube", + "kubernetes.io/os": "linux", + "minikube.k8s.io/commit": "3e64b11ed75e56e4898ea85f96b2e4af0301f43d", + "minikube.k8s.io/name": "danielg-minikube", + "minikube.k8s.io/updated_at": "2022_05_16T13_52_35_0700", + "minikube.k8s.io/version": "v1.25.1", + "node-role.kubernetes.io/control-plane": "", + "node-role.kubernetes.io/master": "", + "node.kubernetes.io/exclude-from-external-load-balancers": "" + }, + "name": "danielg-minikube", + "resourceVersion": "9432", + "uid": "fc4afcb6-4ca4-4038-ba54-5e16065a614a" + }, + "spec": { + "podCIDR": "10.244.0.0/24", + "podCIDRs": [ + "10.244.0.0/24" + ] + }, + "status": { + "addresses": [ + { + "address": "192.168.49.2", + "type": "InternalIP" + }, + { + "address": "danielg-minikube", + "type": "Hostname" + } + ], + "allocatable": { + "cpu": "4", + "ephemeral-storage": "94850516Ki", + "hugepages-2Mi": "0", + "memory": "10432976Ki", + "pods": "110" + }, + "capacity": { + "cpu": "4", + "ephemeral-storage": "94850516Ki", + "hugepages-2Mi": "0", + "memory": "10432976Ki", + "pods": "110" + }, + "conditions": [ + { + "lastHeartbeatTime": "2022-05-16T14:14:31Z", + "lastTransitionTime": "2022-05-16T10:52:29Z", + "message": "kubelet has sufficient memory available", + "reason": "KubeletHasSufficientMemory", + "status": "False", + "type": "MemoryPressure" + }, + { + "lastHeartbeatTime": "2022-05-16T14:14:31Z", + "lastTransitionTime": "2022-05-16T10:52:29Z", + "message": "kubelet has no disk pressure", + "reason": "KubeletHasNoDiskPressure", + "status": "False", + "type": "DiskPressure" + }, + { + "lastHeartbeatTime": "2022-05-16T14:14:31Z", + "lastTransitionTime": "2022-05-16T10:52:29Z", + "message": "kubelet has sufficient PID available", + "reason": "KubeletHasSufficientPID", + "status": "False", + "type": "PIDPressure" + }, + { + "lastHeartbeatTime": "2022-05-16T14:14:31Z", + "lastTransitionTime": "2022-05-16T10:52:45Z", + "message": "kubelet is posting ready status", + "reason": "KubeletReady", + "status": "True", + "type": "Ready" + } + ], + "daemonEndpoints": { + "kubeletEndpoint": { + "Port": 10250 + } + }, + "images": [ + { + "names": [ + "requarks/wiki@sha256:dd83fff15e77843ff934b25c28c865ac000edf7653e5d11adad1dd51df87439d" + ], + "sizeBytes": 441083858 + }, + { + "names": [ + "mariadb@sha256:821d0411208eaa88f9e1f0daccd1d534f88d19baf724eb9a2777cbedb10b6c66" + ], + "sizeBytes": 400782682 + }, + { + "names": [ + "k8s.gcr.io/etcd@sha256:64b9ea357325d5db9f8a723dcf503b5a449177b17ac87d69481e126bb724c263", + "k8s.gcr.io/etcd:3.5.1-0" + ], + "sizeBytes": 292558922 + }, + { + "names": [ + "kubernetesui/dashboard@sha256:ec27f462cf1946220f5a9ace416a84a57c18f98c777876a8054405d1428cc92e", + "kubernetesui/dashboard:v2.3.1" + ], + "sizeBytes": 220033604 + }, + { + "names": [ + "k8s.gcr.io/kube-apiserver@sha256:f54681a71cce62cbc1b13ebb3dbf1d880f849112789811f98b6aebd2caa2f255", + "k8s.gcr.io/kube-apiserver:v1.23.1" + ], + "sizeBytes": 135162256 + }, + { + "names": [ + "k8s.gcr.io/kube-controller-manager@sha256:a7ed87380108a2d811f0d392a3fe87546c85bc366e0d1e024dfa74eb14468604", + "k8s.gcr.io/kube-controller-manager:v1.23.1" + ], + "sizeBytes": 124971684 + }, + { + "names": [ + "k8s.gcr.io/kube-proxy@sha256:e40f3a28721588affcf187f3f246d1e078157dabe274003eaa2957a83f7170c8", + "k8s.gcr.io/kube-proxy:v1.23.1" + ], + "sizeBytes": 112327826 + }, + { + "names": [ + "quay.io/kubescape/kubescape@sha256:6196f766be50d94b45d903a911f5ee95ac99bc392a1324c3e063bec41efd98ba", + "quay.io/kubescape/kubescape:v2.0.153" + ], + "sizeBytes": 110345054 + }, + { + "names": [ + "nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d" + ], + "sizeBytes": 109129446 + }, + { + "names": [ + "quay.io/armosec/action-trigger@sha256:b93707d10ff86aac8dfa42ad37192d6bcf9aceeb4321b21756e438389c26e07c", + "quay.io/armosec/action-trigger:v0.0.5" + ], + "sizeBytes": 65127067 + }, + { + "names": [ + "quay.io/armosec/images-vulnerabilities-scan@sha256:a5f9ddc04a7fdce6d52ef85a21f0de567d8e04d418c2bc5bf5d72b151c997625", + "quay.io/armosec/images-vulnerabilities-scan:v0.0.7" + ], + "sizeBytes": 61446712 + }, + { + "names": [ + "quay.io/armosec/images-vulnerabilities-scan@sha256:2f879858da89f6542e3223fb18d6d793810cc2ad6e398b66776475e4218b6af5", + "quay.io/armosec/images-vulnerabilities-scan:v0.0.8" + ], + "sizeBytes": 61446528 + }, + { + "names": [ + "quay.io/armosec/cluster-collector@sha256:2c4f733d09f7f4090ace04585230bdfacbbc29a3ade38a2e1233d2c0f730d9b6", + "quay.io/armosec/cluster-collector:v0.0.9" + ], + "sizeBytes": 53699576 + }, + { + "names": [ + "k8s.gcr.io/kube-scheduler@sha256:8be4eb1593cf9ff2d91b44596633b7815a3753696031a1eb4273d1b39427fa8c", + "k8s.gcr.io/kube-scheduler:v1.23.1" + ], + "sizeBytes": 53488305 + }, + { + "names": [ + "k8s.gcr.io/coredns/coredns@sha256:5b6ec0d6de9baaf3e92d0f66cd96a25b9edbce8716f5f15dcd1a616b3abd590e", + "k8s.gcr.io/coredns/coredns:v1.8.6" + ], + "sizeBytes": 46829283 + }, + { + "names": [ + "kubernetesui/metrics-scraper@sha256:36d5b3f60e1a144cc5ada820910535074bdf5cf73fb70d1ff1681537eef4e172", + "kubernetesui/metrics-scraper:v1.0.7" + ], + "sizeBytes": 34446077 + }, + { + "names": [ + "gcr.io/k8s-minikube/storage-provisioner@sha256:18eb69d1418e854ad5a19e399310e52808a8321e4c441c1dddad8977a0d7a944", + "gcr.io/k8s-minikube/storage-provisioner:v5" + ], + "sizeBytes": 31465472 + }, + { + "names": [ + "quay.io/armosec/notification-server@sha256:b6e9b296cd53bd3b2b42c516d8ab43db998acff1124a57aff8d66b3dd7881979", + "quay.io/armosec/notification-server:v0.0.3" + ], + "sizeBytes": 20209940 + }, + { + "names": [ + "quay.io/kubescape/host-scanner@sha256:82139d2561039726be060df2878ef023c59df7c536fbd7f6d766af5a99569fee", + "quay.io/kubescape/host-scanner:latest" + ], + "sizeBytes": 11796788 + }, + { + "names": [ + "k8s.gcr.io/pause@sha256:3d380ca8864549e74af4b29c10f9cb0956236dfb01c40ca076fb6c37253234db", + "k8s.gcr.io/pause:3.6" + ], + "sizeBytes": 682696 + } + ], + "nodeInfo": { + "architecture": "amd64", + "bootID": "828cbe73-120b-43cf-aae0-9e2d15b8c873", + "containerRuntimeVersion": "docker://20.10.12", + "kernelVersion": "5.13.0-40-generic", + "kubeProxyVersion": "v1.23.1", + "kubeletVersion": "v1.23.1", + "machineID": "8de776e053e140d6a14c2d2def3d6bb8", + "operatingSystem": "linux", + "osImage": "Ubuntu 20.04.2 LTS", + "systemUUID": "da12dc19-10bf-4033-a440-2d9aa33d6fe3" + } } - ], - "daemonEndpoints": { - "kubeletEndpoint": { - "Port": 10250 } - }, - "images": [ - { - "names": [ - "requarks/wiki@sha256:dd83fff15e77843ff934b25c28c865ac000edf7653e5d11adad1dd51df87439d" - ], - "sizeBytes": 441083858 - }, - { - "names": [ - "mariadb@sha256:821d0411208eaa88f9e1f0daccd1d534f88d19baf724eb9a2777cbedb10b6c66" - ], - "sizeBytes": 400782682 - }, - { - "names": [ - "k8s.gcr.io/etcd@sha256:64b9ea357325d5db9f8a723dcf503b5a449177b17ac87d69481e126bb724c263", - "k8s.gcr.io/etcd:3.5.1-0" - ], - "sizeBytes": 292558922 - }, - { - "names": [ - "kubernetesui/dashboard@sha256:ec27f462cf1946220f5a9ace416a84a57c18f98c777876a8054405d1428cc92e", - "kubernetesui/dashboard:v2.3.1" - ], - "sizeBytes": 220033604 - }, - { - "names": [ - "k8s.gcr.io/kube-apiserver@sha256:f54681a71cce62cbc1b13ebb3dbf1d880f849112789811f98b6aebd2caa2f255", - "k8s.gcr.io/kube-apiserver:v1.23.1" - ], - "sizeBytes": 135162256 - }, - { - "names": [ - "k8s.gcr.io/kube-controller-manager@sha256:a7ed87380108a2d811f0d392a3fe87546c85bc366e0d1e024dfa74eb14468604", - "k8s.gcr.io/kube-controller-manager:v1.23.1" - ], - "sizeBytes": 124971684 - }, - { - "names": [ - "k8s.gcr.io/kube-proxy@sha256:e40f3a28721588affcf187f3f246d1e078157dabe274003eaa2957a83f7170c8", - "k8s.gcr.io/kube-proxy:v1.23.1" - ], - "sizeBytes": 112327826 - }, - { - "names": [ - "quay.io/kubescape/kubescape@sha256:6196f766be50d94b45d903a911f5ee95ac99bc392a1324c3e063bec41efd98ba", - "quay.io/kubescape/kubescape:v2.0.153" - ], - "sizeBytes": 110345054 - }, - { - "names": [ - "nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d" - ], - "sizeBytes": 109129446 - }, - { - "names": [ - "quay.io/armosec/action-trigger@sha256:b93707d10ff86aac8dfa42ad37192d6bcf9aceeb4321b21756e438389c26e07c", - "quay.io/armosec/action-trigger:v0.0.5" - ], - "sizeBytes": 65127067 - }, - { - "names": [ - "quay.io/armosec/images-vulnerabilities-scan@sha256:a5f9ddc04a7fdce6d52ef85a21f0de567d8e04d418c2bc5bf5d72b151c997625", - "quay.io/armosec/images-vulnerabilities-scan:v0.0.7" - ], - "sizeBytes": 61446712 - }, - { - "names": [ - "quay.io/armosec/images-vulnerabilities-scan@sha256:2f879858da89f6542e3223fb18d6d793810cc2ad6e398b66776475e4218b6af5", - "quay.io/armosec/images-vulnerabilities-scan:v0.0.8" - ], - "sizeBytes": 61446528 - }, - { - "names": [ - "quay.io/armosec/cluster-collector@sha256:2c4f733d09f7f4090ace04585230bdfacbbc29a3ade38a2e1233d2c0f730d9b6", - "quay.io/armosec/cluster-collector:v0.0.9" - ], - "sizeBytes": 53699576 - }, - { - "names": [ - "k8s.gcr.io/kube-scheduler@sha256:8be4eb1593cf9ff2d91b44596633b7815a3753696031a1eb4273d1b39427fa8c", - "k8s.gcr.io/kube-scheduler:v1.23.1" - ], - "sizeBytes": 53488305 - }, - { - "names": [ - "k8s.gcr.io/coredns/coredns@sha256:5b6ec0d6de9baaf3e92d0f66cd96a25b9edbce8716f5f15dcd1a616b3abd590e", - "k8s.gcr.io/coredns/coredns:v1.8.6" - ], - "sizeBytes": 46829283 - }, - { - "names": [ - "kubernetesui/metrics-scraper@sha256:36d5b3f60e1a144cc5ada820910535074bdf5cf73fb70d1ff1681537eef4e172", - "kubernetesui/metrics-scraper:v1.0.7" - ], - "sizeBytes": 34446077 - }, - { - "names": [ - "gcr.io/k8s-minikube/storage-provisioner@sha256:18eb69d1418e854ad5a19e399310e52808a8321e4c441c1dddad8977a0d7a944", - "gcr.io/k8s-minikube/storage-provisioner:v5" - ], - "sizeBytes": 31465472 - }, - { - "names": [ - "quay.io/armosec/notification-server@sha256:b6e9b296cd53bd3b2b42c516d8ab43db998acff1124a57aff8d66b3dd7881979", - "quay.io/armosec/notification-server:v0.0.3" - ], - "sizeBytes": 20209940 - }, - { - "names": [ - "quay.io/kubescape/host-scanner@sha256:82139d2561039726be060df2878ef023c59df7c536fbd7f6d766af5a99569fee", - "quay.io/kubescape/host-scanner:latest" - ], - "sizeBytes": 11796788 - }, - { - "names": [ - "k8s.gcr.io/pause@sha256:3d380ca8864549e74af4b29c10f9cb0956236dfb01c40ca076fb6c37253234db", - "k8s.gcr.io/pause:3.6" - ], - "sizeBytes": 682696 - } - ], - "nodeInfo": { - "architecture": "amd64", - "bootID": "828cbe73-120b-43cf-aae0-9e2d15b8c873", - "containerRuntimeVersion": "docker://20.10.12", - "kernelVersion": "5.13.0-40-generic", - "kubeProxyVersion": "v1.23.1", - "kubeletVersion": "v1.23.1", - "machineID": "8de776e053e140d6a14c2d2def3d6bb8", - "operatingSystem": "linux", - "osImage": "Ubuntu 20.04.2 LTS", - "systemUUID": "da12dc19-10bf-4033-a440-2d9aa33d6fe3" - } -} -} -` - var l v1.Node - _ = json.Unmarshal([]byte(noTaintNode), &l) - assert.False(t, isMasterNodeTaints(l.Spec.Taints)) + ` + var noTaintNode v1.Node + _ = json.Unmarshal([]byte(noTaintNodeJson), &noTaintNode) + assert.False(t, isMasterNodeTaints(noTaintNode.Spec.Taints)) - taintNode := + taintNodeJson := ` { "apiVersion": "v1", @@ -532,8 +532,60 @@ } } ` - _ = json.Unmarshal([]byte(taintNode), &l) - assert.True(t, isMasterNodeTaints(l.Spec.Taints)) + var taintNode v1.Node + _ = json.Unmarshal([]byte(taintNodeJson), &taintNode) + assert.True(t, isMasterNodeTaints(taintNode.Spec.Taints)) + + taintNodeJson1 := + ` + { + "apiVersion": "v1", + "kind": "Node", + "metadata": { + "annotations": { + "kubeadm.alpha.kubernetes.io/cri-socket": "/var/run/dockershim.sock", + "node.alpha.kubernetes.io/ttl": "0", + "volumes.kubernetes.io/controller-managed-attach-detach": "true" + }, + "creationTimestamp": "2022-05-16T10:52:32Z", + "labels": { + "beta.kubernetes.io/arch": "amd64", + "beta.kubernetes.io/os": "linux", + "kubernetes.io/arch": "amd64", + "kubernetes.io/hostname": "danielg-minikube", + "kubernetes.io/os": "linux", + "minikube.k8s.io/commit": "3e64b11ed75e56e4898ea85f96b2e4af0301f43d", + "minikube.k8s.io/name": "danielg-minikube", + "minikube.k8s.io/updated_at": "2022_05_16T13_52_35_0700", + "minikube.k8s.io/version": "v1.25.1", + "node-role.kubernetes.io/control-plane": "", + "node-role.kubernetes.io/master": "", + "node.kubernetes.io/exclude-from-external-load-balancers": "" + }, + "name": "danielg-minikube", + "resourceVersion": "9871", + "uid": "fc4afcb6-4ca4-4038-ba54-5e16065a614a" + }, + "spec": { + "podCIDR": "10.244.0.0/24", + "podCIDRs": [ + "10.244.0.0/24" + ], + "taints": [ + { + "effect": "NoSchedule", + "key": "node-role.kubernetes.io/control-plane", + "value": "true" + } + ] + }, + "status": {} + } + ` + + var taintNode1 v1.Node + _ = json.Unmarshal([]byte(taintNodeJson1), &taintNode1) + assert.True(t, isMasterNodeTaints(taintNode1.Spec.Taints)) } func TestSetMapNamespaceToNumOfResources(t *testing.T) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/core/pkg/resultshandling/results.go new/kubescape-3.0.36/core/pkg/resultshandling/results.go --- old/kubescape-3.0.35/core/pkg/resultshandling/results.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/core/pkg/resultshandling/results.go 2025-07-26 11:08:43.000000000 +0200 @@ -75,7 +75,7 @@ } // HandleResults handles all necessary actions for the scan results -func (rh *ResultsHandler) HandleResults(ctx context.Context) error { +func (rh *ResultsHandler) HandleResults(ctx context.Context, scanInfo *cautils.ScanInfo) error { // Display scan results in the UI first to give immediate value. rh.UiPrinter.ActionPrint(ctx, rh.ScanData, rh.ImageScanData) @@ -92,7 +92,7 @@ // We should submit only after printing results, so a user can see // results at all times, even if submission fails - if rh.ReporterObj != nil { + if rh.ReporterObj != nil && scanInfo.Submit { if err := rh.ReporterObj.Submit(ctx, rh.ScanData); err != nil { return err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/core/pkg/resultshandling/results_test.go new/kubescape-3.0.36/core/pkg/resultshandling/results_test.go --- old/kubescape-3.0.35/core/pkg/resultshandling/results_test.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/core/pkg/resultshandling/results_test.go 2025-07-26 11:08:43.000000000 +0200 @@ -50,7 +50,7 @@ rh := NewResultsHandler(reporter, printers, uiPrinter) rh.SetData(fakeScanData) - err := rh.HandleResults(context.TODO()) + err := rh.HandleResults(context.TODO(), &cautils.ScanInfo{}) assert.NoError(t, err) want := 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/httphandler/handlerequests/v1/requestshandlerutils.go new/kubescape-3.0.36/httphandler/handlerequests/v1/requestshandlerutils.go --- old/kubescape-3.0.35/httphandler/handlerequests/v1/requestshandlerutils.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/httphandler/handlerequests/v1/requestshandlerutils.go 2025-07-26 11:08:43.000000000 +0200 @@ -83,7 +83,7 @@ if err != nil { return nil, writeScanErrorToFile(err, scanID) } - if err := result.HandleResults(ctx); err != nil { + if err := result.HandleResults(ctx, scanInfo); err != nil { return nil, err } storage := storage.GetStorage() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/pkg/imagescan/imagescan.go new/kubescape-3.0.36/pkg/imagescan/imagescan.go --- old/kubescape-3.0.35/pkg/imagescan/imagescan.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/pkg/imagescan/imagescan.go 2025-07-26 11:08:43.000000000 +0200 @@ -115,7 +115,10 @@ // // It performs image scanning and everything needed in between. type Service struct { - dbCfg db.Config + dbCfg db.Config + dbCloser *db.Closer + dbStatus *db.Status + dbStore *store.Store } func getIgnoredMatches(vulnerabilityExceptions []string, store *store.Store, packages []pkg.Package, pkgContext pkg.Context) (*match.Matches, []match.IgnoredMatch, error) { @@ -178,47 +181,51 @@ return filteredMatches } -func (s *Service) Scan(ctx context.Context, userInput string, creds RegistryCredentials, vulnerabilityExceptions, severityExceptions []string) (*models.PresenterConfig, error) { - store, status, dbCloser, err := NewVulnerabilityDB(s.dbCfg, true) - if err = validateDBLoad(err, status); err != nil { - return nil, err - } - +func (s *Service) Scan(_ context.Context, userInput string, creds RegistryCredentials, vulnerabilityExceptions, severityExceptions []string) (*models.PresenterConfig, error) { packages, pkgContext, sbom, err := pkg.Provide(userInput, getProviderConfig(creds)) if err != nil { return nil, err } - if dbCloser != nil { - defer dbCloser.Close() - } - - remainingMatches, ignoredMatches, err := getIgnoredMatches(vulnerabilityExceptions, store, packages, pkgContext) + remainingMatches, ignoredMatches, err := getIgnoredMatches(vulnerabilityExceptions, s.dbStore, packages, pkgContext) if err != nil { return nil, err } - filteredMatches := filterMatchesBasedOnSeverity(severityExceptions, *remainingMatches, store) + filteredMatches := filterMatchesBasedOnSeverity(severityExceptions, *remainingMatches, s.dbStore) pb := models.PresenterConfig{ Matches: filteredMatches, IgnoredMatches: ignoredMatches, Packages: packages, Context: pkgContext, - MetadataProvider: store, + MetadataProvider: s.dbStore, SBOM: sbom, AppConfig: nil, - DBStatus: status, + DBStatus: s.dbStatus, } return &pb, nil } +func (s *Service) Close() { + s.dbCloser.Close() +} + func NewVulnerabilityDB(cfg db.Config, update bool) (*store.Store, *db.Status, *db.Closer, error) { return grype.LoadVulnerabilityDB(cfg, update) } -func NewScanService(dbCfg db.Config) Service { - return Service{dbCfg: dbCfg} +func NewScanService(dbCfg db.Config) (*Service, error) { + dbStore, dbStatus, dbCloser, err := NewVulnerabilityDB(dbCfg, true) + if err = validateDBLoad(err, dbStatus); err != nil { + return nil, err + } + return &Service{ + dbCfg: dbCfg, + dbCloser: dbCloser, + dbStatus: dbStatus, + dbStore: dbStore, + }, nil } // ParseSeverity returns a Grype severity given a severity string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubescape-3.0.35/pkg/imagescan/imagescan_test.go new/kubescape-3.0.36/pkg/imagescan/imagescan_test.go --- old/kubescape-3.0.35/pkg/imagescan/imagescan_test.go 2025-06-24 16:31:45.000000000 +0200 +++ new/kubescape-3.0.36/pkg/imagescan/imagescan_test.go 2025-07-26 11:08:43.000000000 +0200 @@ -17,6 +17,7 @@ syftPkg "github.com/anchore/syft/syft/pkg" "github.com/google/uuid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestVulnerabilityAndSeverityExceptions(t *testing.T) { @@ -27,7 +28,9 @@ DBRootDir: path.Join(xdg.CacheHome, "grype-light", "db"), ListingURL: "http://localhost:8000/listing.json", } - svc := NewScanService(dbCfg) + svc, err := NewScanService(dbCfg) + require.NoError(t, err) + defer svc.Close() creds := RegistryCredentials{} tests := []struct { @@ -338,7 +341,9 @@ func TestNewScanService(t *testing.T) { defaultConfig, _ := NewDefaultDBConfig() - svc := NewScanService(defaultConfig) + svc, err := NewScanService(defaultConfig) + require.NoError(t, err) + defer svc.Close() assert.Equal(t, defaultConfig, svc.dbCfg) } ++++++ kubescape.obsinfo ++++++ --- /var/tmp/diff_new_pack.1tNVFd/_old 2025-07-28 14:59:00.396418839 +0200 +++ /var/tmp/diff_new_pack.1tNVFd/_new 2025-07-28 14:59:00.400419005 +0200 @@ -1,5 +1,5 @@ name: kubescape -version: 3.0.35 -mtime: 1750775505 -commit: 6042818a7178b43d0fa0dbb0bbc07f57036de426 +version: 3.0.36 +mtime: 1753520923 +commit: cd046fa695f5492ea23195604c46f753e92dfb63 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/kubescape/vendor.tar.gz /work/SRC/openSUSE:Factory/.kubescape.new.13279/vendor.tar.gz differ: char 127, line 2