using logger

This commit is contained in:
dwertent
2022-02-03 18:12:35 +02:00
parent 98dbda696d
commit 4207f3d6d1
17 changed files with 73 additions and 101 deletions
+2 -36
View File
@@ -1,7 +1,6 @@
package cautils
import (
"fmt"
"os"
"time"
@@ -21,9 +20,9 @@ func IsSilent() bool {
}
var FailureDisplay = color.New(color.Bold, color.FgHiRed).FprintfFunc()
var WarningDisplay = color.New(color.Bold, color.FgCyan).FprintfFunc()
var WarningDisplay = color.New(color.Bold, color.FgHiYellow).FprintfFunc()
var FailureTextDisplay = color.New(color.Faint, color.FgHiRed).FprintfFunc()
var InfoDisplay = color.New(color.Bold, color.FgHiYellow).FprintfFunc()
var InfoDisplay = color.New(color.Bold, color.FgCyan).FprintfFunc()
var InfoTextDisplay = color.New(color.Bold, color.FgHiYellow).FprintfFunc()
var SimpleDisplay = color.New().FprintfFunc()
var SuccessDisplay = color.New(color.Bold, color.FgHiGreen).FprintfFunc()
@@ -31,39 +30,6 @@ var DescriptionDisplay = color.New(color.Faint, color.FgWhite).FprintfFunc()
var Spinner *spinner.Spinner
func ScanStartDisplay() {
if IsSilent() {
return
}
InfoDisplay(os.Stderr, "ARMO security scanner starting\n")
}
func SuccessTextDisplay(str string) {
if IsSilent() {
return
}
SuccessDisplay(os.Stderr, "[success] ")
SimpleDisplay(os.Stderr, fmt.Sprintf("%s\n", str))
}
func ErrorDisplay(str string) {
if IsSilent() {
return
}
FailureDisplay(os.Stderr, "[Error] ")
SimpleDisplay(os.Stderr, fmt.Sprintf("%s\n", str))
}
func ProgressTextDisplay(str string) {
if IsSilent() {
return
}
InfoDisplay(os.Stderr, "[progress] ")
SimpleDisplay(os.Stderr, fmt.Sprintf("%s\n", str))
}
func StartSpinner() {
if !IsSilent() && isatty.IsTerminal(os.Stdout.Fd()) {
Spinner = spinner.New(spinner.CharSets[7], 100*time.Millisecond) // Build our new spinner
+2 -2
View File
@@ -8,8 +8,8 @@ import (
"time"
"github.com/armosec/armoapi-go/armotypes"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/opa-utils/reporthandling"
"github.com/golang/glog"
)
// =======================================================================================================================
@@ -47,7 +47,7 @@ func SetARMOAPIConnector(armoAPI *ArmoAPI) {
func GetArmoAPIConnector() *ArmoAPI {
if globalArmoAPIConnector == nil {
glog.Error("returning nil API connector")
logger.L().Error("returning nil API connector")
}
return globalArmoAPIConnector
}
+1 -1
View File
@@ -71,5 +71,5 @@ func (l Level) prefix() func(w io.Writer, format string, a ...interface{}) {
}
func (l Level) skip(l2 Level) bool {
return l > l2
return l < l2
}
+12 -2
View File
@@ -47,8 +47,18 @@ func (pl *PrettyLogger) Success(msg string, details ...helpers.IDetails) {
func (pl *PrettyLogger) print(level Level, msg string, details ...helpers.IDetails) {
if !level.skip(pl.level) {
level.prefix()(pl.writer, "[%s] ", level.string())
message(pl.writer, fmt.Sprintf("%s %+v", msg, details))
os.Exit(1)
message(pl.writer, fmt.Sprintf("%s %s\n", msg, detailsToString(details)))
}
}
func detailsToString(details []helpers.IDetails) string {
s := ""
for i := range details {
s += fmt.Sprintf("%s: %s", details[i].Key(), details[i].Value())
if i < len(details)-1 {
s += ";"
}
}
return s
}
+8 -6
View File
@@ -7,6 +7,8 @@ import (
"os"
"github.com/armosec/kubescape/cautils/getter"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/kubescape/cautils/logger/helpers"
pkgutils "github.com/armosec/utils-go/utils"
)
@@ -22,7 +24,7 @@ type IVersionCheckHandler interface {
func NewIVersionCheckHandler() IVersionCheckHandler {
if BuildNumber == "" {
WarningDisplay(os.Stderr, "Warning: unknown build number, this might affect your scan results. Please make sure you are updated to latest version.\n")
logger.L().Warning("unknown build number, this might affect your scan results. Please make sure you are updated to latest version")
}
if v, ok := os.LookupEnv(SKIP_VERSION_CHECK); ok && pkgutils.StringToBool(v) {
return NewVersionCheckHandlerMock()
@@ -78,14 +80,14 @@ func NewVersionCheckRequest(buildNumber, frameworkName, frameworkVersion, scanni
}
func (v *VersionCheckHandlerMock) CheckLatestVersion(versionData *VersionCheckRequest) error {
fmt.Println("Skipping version check")
logger.L().Info("Skipping version check")
return nil
}
func (v *VersionCheckHandler) CheckLatestVersion(versionData *VersionCheckRequest) error {
defer func() {
if err := recover(); err != nil {
WarningDisplay(os.Stderr, "failed to get latest version\n")
logger.L().Warning("failed to get latest version", helpers.Interface("error", err))
}
}()
@@ -96,7 +98,7 @@ func (v *VersionCheckHandler) CheckLatestVersion(versionData *VersionCheckReques
if latestVersion.ClientUpdate != "" {
if BuildNumber != "" && BuildNumber < latestVersion.ClientUpdate {
WarningDisplay(os.Stderr, warningMessage(latestVersion.Client, latestVersion.ClientUpdate)+"\n")
logger.L().Warning(warningMessage(latestVersion.Client, latestVersion.ClientUpdate))
}
}
@@ -106,7 +108,7 @@ func (v *VersionCheckHandler) CheckLatestVersion(versionData *VersionCheckReques
// }
if latestVersion.Message != "" {
InfoDisplay(os.Stderr, latestVersion.Message+"\n")
logger.L().Info(latestVersion.Message)
}
return nil
@@ -132,5 +134,5 @@ func (v *VersionCheckHandler) getLatestVersion(versionData *VersionCheckRequest)
}
func warningMessage(kind, release string) string {
return fmt.Sprintf("Warning: '%s' is not updated to the latest release: '%s'", kind, release)
return fmt.Sprintf("'%s' is not updated to the latest release: '%s'", kind, release)
}
+4 -8
View File
@@ -2,11 +2,10 @@ package cmd
import (
"flag"
"os"
"strings"
"github.com/armosec/kubescape/cautils/getter"
"github.com/golang/glog"
"github.com/armosec/kubescape/cautils/logger"
"github.com/spf13/cobra"
)
@@ -40,8 +39,7 @@ func init() {
func InitArmoBEConnector() {
urlSlices := strings.Split(armoBEURLs, ",")
if len(urlSlices) > 3 {
glog.Errorf("Too many URLs")
os.Exit(1)
logger.L().Fatal("expected only 3 URLs")
}
switch len(urlSlices) {
case 1:
@@ -51,12 +49,10 @@ func InitArmoBEConnector() {
case "":
getter.SetARMOAPIConnector(getter.NewARMOAPIProd())
default:
glog.Errorf("--environment flag usage: %s", envFlagUsage)
os.Exit(1)
logger.L().Fatal("--environment flag usage: " + envFlagUsage)
}
case 2:
glog.Errorf("--environment flag usage: %s", envFlagUsage)
os.Exit(1)
logger.L().Fatal("--environment flag usage: " + envFlagUsage)
case 3:
getter.SetARMOAPIConnector(getter.NewARMOAPICustomized(urlSlices[0], urlSlices[1], urlSlices[2]))
}
+1 -1
View File
@@ -88,7 +88,7 @@ func getInterfaces(scanInfo *cautils.ScanInfo) componentInterfaces {
}
func ScanCliSetup(scanInfo *cautils.ScanInfo) error {
cautils.ScanStartDisplay()
logger.L().Info("ARMO security scanner starting")
interfaces := getInterfaces(scanInfo)
// setPolicyGetter(scanInfo, interfaces.clusterConfig.GetCustomerGUID())
+3 -2
View File
@@ -7,6 +7,7 @@ import (
"github.com/armosec/k8s-interface/k8sinterface"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/getter"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/kubescape/hostsensorutils"
"github.com/armosec/kubescape/resourcehandler"
"github.com/armosec/kubescape/resultshandling/reporter"
@@ -73,12 +74,12 @@ func getHostSensorHandler(scanInfo *cautils.ScanInfo, k8s *k8sinterface.Kubernet
// we need to determined which controls needs host sensor
if scanInfo.HostSensor.Get() == nil && hasHostSensorControls {
scanInfo.HostSensor.SetBool(askUserForHostSensor())
cautils.WarningDisplay(os.Stderr, "Warning: Kubernetes cluster nodes scanning is disabled. This is required to collect valuable data for certain controls. You can enable it using the --enable-host-scan flag\n")
logger.L().Warning("Kubernetes cluster nodes scanning is disabled. This is required to collect valuable data for certain controls. You can enable it using the --enable-host-scan flag")
}
if hostSensorVal := scanInfo.HostSensor.Get(); hostSensorVal != nil && *hostSensorVal {
hostSensorHandler, err := hostsensorutils.NewHostSensorHandler(k8s)
if err != nil {
cautils.WarningDisplay(os.Stderr, fmt.Sprintf("Warning: failed to create host sensor: %v\n", err.Error()))
logger.L().Warning(fmt.Sprintf("failed to create host sensor: %s", err.Error()))
return &hostsensorutils.HostSensorHandlerMock{}
}
return hostSensorHandler
+1 -1
View File
@@ -14,7 +14,6 @@ require (
github.com/fatih/color v1.13.0
github.com/francoispqt/gojay v1.2.13
github.com/gofrs/uuid v4.1.0+incompatible
github.com/golang/glog v1.0.0
github.com/mattn/go-isatty v0.0.14
github.com/olekukonko/tablewriter v0.0.5
github.com/open-policy-agent/opa v0.33.1
@@ -62,6 +61,7 @@ require (
github.com/go-logr/logr v0.4.0 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/glog v1.0.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-cmp v0.5.6 // indirect
+6 -2
View File
@@ -10,6 +10,8 @@ import (
"github.com/armosec/k8s-interface/k8sinterface"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/kubescape/cautils/logger/helpers"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -60,15 +62,17 @@ func (hsh *HostSensorHandler) Init() error {
// store namespace + port
// store pod names
// make sure all pods are running, after X seconds treat has running anyway, and log an error on the pods not running yet
cautils.ProgressTextDisplay("Installing host sensor")
logger.L().Info("Installing host sensor")
cautils.StartSpinner()
defer cautils.StopSpinner()
if err := hsh.applyYAML(); err != nil {
return fmt.Errorf("in HostSensorHandler init failed to apply YAML: %v", err)
}
hsh.populatePodNamesToNodeNames()
if err := hsh.checkPodForEachNode(); err != nil {
fmt.Printf("failed to validate host-sensor pods status: %v", err)
logger.L().Error("failed to validate host-sensor pods status", helpers.Error(err))
}
return nil
}
+5 -2
View File
@@ -7,6 +7,7 @@ import (
"github.com/armosec/k8s-interface/k8sinterface"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/opa-utils/objectsenvelopes/hostsensor"
"sigs.k8s.io/yaml"
)
@@ -154,7 +155,8 @@ func (hsh *HostSensorHandler) CollectResources() ([]hostsensor.HostSensorDataEnv
if hsh.DaemonSet == nil {
return res, nil
}
cautils.ProgressTextDisplay("Accessing host sensor")
logger.L().Info("Accessing host sensor")
cautils.StartSpinner()
defer cautils.StopSpinner()
kcData, err := hsh.GetKubeletConfigurations()
@@ -193,6 +195,7 @@ func (hsh *HostSensorHandler) CollectResources() ([]hostsensor.HostSensorDataEnv
}
res = append(res, kcData...)
// finish
cautils.SuccessTextDisplay("Read host information from host sensor")
logger.L().Success("Read host information from host sensor")
return res, nil
}
+10 -23
View File
@@ -7,6 +7,7 @@ import (
"github.com/armosec/armoapi-go/armotypes"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
ksscore "github.com/armosec/kubescape/score"
"github.com/armosec/opa-utils/objectsenvelopes"
"github.com/armosec/opa-utils/reporthandling"
@@ -14,8 +15,6 @@ import (
"github.com/armosec/opa-utils/reporthandling/results/v1/resourcesresults"
"github.com/open-policy-agent/opa/storage"
"github.com/golang/glog"
"github.com/armosec/k8s-interface/k8sinterface"
"github.com/armosec/k8s-interface/workloadinterface"
@@ -67,7 +66,7 @@ func (opaHandler *OPAProcessorHandler) ProcessRulesListenner() {
// process
if err := opap.Process(policies); err != nil {
// fmt.Println(err)
logger.L().Error(err.Error())
}
// edit results
@@ -82,8 +81,8 @@ func (opaHandler *OPAProcessorHandler) ProcessRulesListenner() {
}
func (opap *OPAProcessor) Process(policies *cautils.Policies) error {
// glog.Infof(fmt.Sprintf("Starting 'Process'. reportID: %s", opap.PostureReport.ReportID))
cautils.ProgressTextDisplay(fmt.Sprintf("Scanning cluster %s", cautils.ClusterName))
logger.L().Info(fmt.Sprintf("Scanning cluster %s", cautils.ClusterName))
cautils.StartSpinner()
var errs error
@@ -91,7 +90,7 @@ func (opap *OPAProcessor) Process(policies *cautils.Policies) error {
resourcesAssociatedControl, err := opap.processControl(&control)
if err != nil {
appendError(&errs, err)
logger.L().Error(err.Error())
}
// update resources with latest results
if len(resourcesAssociatedControl) != 0 {
@@ -109,21 +108,10 @@ func (opap *OPAProcessor) Process(policies *cautils.Policies) error {
opap.Report.ReportGenerationTime = time.Now().UTC()
cautils.StopSpinner()
cautils.SuccessTextDisplay(fmt.Sprintf("Done scanning cluster %s", cautils.ClusterName))
logger.L().Success(fmt.Sprintf("Done scanning cluster %s", cautils.ClusterName))
return errs
}
func appendError(errs *error, err error) {
if err == nil {
return
}
if errs == nil {
errs = &err
} else {
*errs = fmt.Errorf("%v\n%s", *errs, err.Error())
}
}
func (opap *OPAProcessor) processControl(control *reporthandling.Control) (map[string]resourcesresults.ResourceAssociatedControl, error) {
var errs error
@@ -133,7 +121,7 @@ func (opap *OPAProcessor) processControl(control *reporthandling.Control) (map[s
for i := range control.Rules {
resourceAssociatedRule, err := opap.processRule(&control.Rules[i])
if err != nil {
appendError(&errs, err)
logger.L().Error(err.Error())
continue
}
@@ -192,7 +180,7 @@ func (opap *OPAProcessor) processRule(rule *reporthandling.PolicyRule) (map[stri
ruleResponses, err := opap.runOPAOnSingleRule(rule, inputRawResources, ruleData, postureControlInputs)
if err != nil {
// TODO - Handle error
glog.Error(err)
logger.L().Error(err.Error())
} else {
// ruleResponse to ruleResult
for i := range ruleResponses {
@@ -228,7 +216,6 @@ func (opap *OPAProcessor) runOPAOnSingleRule(rule *reporthandling.PolicyRule, k8
}
func (opap *OPAProcessor) runRegoOnK8s(rule *reporthandling.PolicyRule, k8sObjects []map[string]interface{}, getRuleData func(*reporthandling.PolicyRule) string, postureControlInputs map[string][]string) ([]reporthandling.RuleResponse, error) {
var errs error
// compile modules
modules, err := getRuleDependencies()
@@ -249,10 +236,10 @@ func (opap *OPAProcessor) runRegoOnK8s(rule *reporthandling.PolicyRule, k8sObjec
// Eval
results, err := opap.regoEval(k8sObjects, compiled, &store)
if err != nil {
errs = fmt.Errorf("rule: '%s', %s", rule.Name, err.Error())
logger.L().Error(err.Error())
}
return results, errs
return results, nil
}
func (opap *OPAProcessor) regoEval(inputObj []map[string]interface{}, compiledRego *ast.Compiler, store *storage.Store) ([]reporthandling.RuleResponse, error) {
+5 -5
View File
@@ -1,16 +1,17 @@
package opaprocessor
import (
"fmt"
pkgcautils "github.com/armosec/utils-go/utils"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/k8s-interface/k8sinterface"
"github.com/armosec/k8s-interface/workloadinterface"
"github.com/armosec/opa-utils/reporthandling"
resources "github.com/armosec/opa-utils/resources"
"github.com/golang/glog"
)
// updateResults update the results objects and report objects. This is a critical function - DO NOT CHANGE
@@ -79,8 +80,7 @@ func getKubernetesObjects(k8sResources *cautils.K8SResources, allResources map[s
for _, groupResource := range groupResources {
if k8sObj, ok := (*k8sResources)[groupResource]; ok {
if k8sObj == nil {
continue
// glog.Errorf("Resource '%s' is nil, probably failed to pull the resource", groupResource)
logger.L().Debug(fmt.Sprintf("resource '%s' is nil, probably failed to pull the resource", groupResource))
}
for i := range k8sObj {
k8sObjects = append(k8sObjects, allResources[k8sObj[i]])
@@ -122,7 +122,7 @@ func filterOutChildResources(objects []workloadinterface.IMetadata, match []repo
func getRuleDependencies() (map[string]string, error) {
modules := resources.LoadRegoModules()
if len(modules) == 0 {
glog.Warningf("failed to load rule dependencies")
logger.L().Warning("failed to load rule dependencies")
}
return modules, nil
}
+3 -3
View File
@@ -5,11 +5,12 @@ import (
"strings"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/opa-utils/reporthandling"
)
func (policyHandler *PolicyHandler) getPolicies(notification *reporthandling.PolicyNotification, policiesAndResources *cautils.OPASessionObj) error {
cautils.ProgressTextDisplay("Downloading/Loading policy definitions")
logger.L().Info("Downloading/Loading policy definitions")
frameworks, err := policyHandler.getScanPolicies(notification)
if err != nil {
@@ -32,8 +33,7 @@ func (policyHandler *PolicyHandler) getPolicies(notification *reporthandling.Pol
if err == nil {
policiesAndResources.RegoInputData.PostureControlInputs = controlsInputs
}
cautils.SuccessTextDisplay("Downloaded/Loaded policy")
logger.L().Success("Downloaded/Loaded policy")
return nil
}
+3 -2
View File
@@ -14,6 +14,7 @@ import (
"github.com/armosec/k8s-interface/k8sinterface"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/opa-utils/objectsenvelopes"
"github.com/armosec/opa-utils/reporthandling"
@@ -107,7 +108,7 @@ func (fileHandler *FileResourceHandler) GetClusterAPIServerInfo() *version.Info
func loadResourcesFromFiles(inputPatterns []string) ([]workloadinterface.IMetadata, error) {
files, errs := listFiles(inputPatterns)
if len(errs) > 0 {
cautils.ErrorDisplay(fmt.Sprintf("%v", errs)) // TODO - print error
logger.L().Error(fmt.Sprintf("%v", errs))
}
if len(files) == 0 {
return nil, nil
@@ -115,7 +116,7 @@ func loadResourcesFromFiles(inputPatterns []string) ([]workloadinterface.IMetada
workloads, errs := loadFiles(files)
if len(errs) > 0 {
cautils.ErrorDisplay(fmt.Sprintf("%v", errs)) // TODO - print error
logger.L().Error(fmt.Sprintf("%v", errs))
}
return workloads, nil
}
+5 -3
View File
@@ -7,6 +7,8 @@ import (
"strings"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
"github.com/armosec/kubescape/cautils/logger/helpers"
"github.com/armosec/kubescape/hostsensorutils"
"github.com/armosec/opa-utils/objectsenvelopes"
"github.com/armosec/opa-utils/reporthandling"
@@ -47,7 +49,7 @@ func (k8sHandler *K8sResourceHandler) GetResources(frameworks []reporthandling.F
allResources := map[string]workloadinterface.IMetadata{}
// get k8s resources
cautils.ProgressTextDisplay("Accessing Kubernetes objects")
logger.L().Info("Accessing Kubernetes objects")
cautils.StartSpinner()
@@ -79,15 +81,15 @@ func (k8sHandler *K8sResourceHandler) GetResources(frameworks []reporthandling.F
}
cautils.StopSpinner()
logger.L().Success("Accessed successfully to Kubernetes objects")
cautils.SuccessTextDisplay("Accessed successfully to Kubernetes objects")
return k8sResourcesMap, allResources, nil
}
func (k8sHandler *K8sResourceHandler) GetClusterAPIServerInfo() *version.Info {
clusterAPIServerInfo, err := k8sHandler.k8s.DiscoveryClient.ServerVersion()
if err != nil {
cautils.ErrorDisplay(fmt.Sprintf("Failed to discover API server information: %v", err))
logger.L().Error(fmt.Sprintf("Failed to discover API server information", helpers.Error(err)))
return nil
}
return clusterAPIServerInfo
+2 -2
View File
@@ -8,7 +8,7 @@ import (
"strings"
"github.com/armosec/k8s-interface/workloadinterface"
"github.com/armosec/kubescape/cautils"
"github.com/armosec/kubescape/cautils/logger"
)
func loadResourcesFromUrl(inputPatterns []string) ([]workloadinterface.IMetadata, error) {
@@ -19,7 +19,7 @@ func loadResourcesFromUrl(inputPatterns []string) ([]workloadinterface.IMetadata
workloads, errs := downloadFiles(urls)
if len(errs) > 0 {
cautils.ErrorDisplay(fmt.Sprintf("%v", errs)) // TODO - print error
logger.L().Error(fmt.Sprintf("%v", errs))
}
return workloads, nil
}