diff --git a/build.py b/build.py index e695e811..eeeee049 100644 --- a/build.py +++ b/build.py @@ -49,10 +49,9 @@ def main(): ArmoWebsite = os.getenv("ArmoWebsite") ArmoAuthServer = os.getenv("ArmoAuthServer") - # Create build directory buildDir = getBuildDir() - + ks_file = os.path.join(buildDir, packageName) hash_file = ks_file + ".sha256" @@ -60,13 +59,24 @@ def main(): os.makedirs(buildDir) # Build kubescape - ldflags = "-w -s -X %s=%s -X %s=%s -X %s=%s -X %s=%s -X %s=%s" \ - % (buildUrl, releaseVersion, BE_SERVER_CONST, ArmoBEServer, - ER_SERVER_CONST, ArmoERServer, WEBSITE_CONST, ArmoWebsite, - AUTH_SERVER_CONST, ArmoAuthServer) + ldflags = "-w -s" + if releaseVersion: + ldflags += " -X {}={}".format(buildUrl, releaseVersion) + if ArmoBEServer: + ldflags += " -X {}={}".format(BE_SERVER_CONST, ArmoBEServer) + if ArmoERServer: + ldflags += " -X {}={}".format(ER_SERVER_CONST, ArmoERServer) + if ArmoWebsite: + ldflags += " -X {}={}".format(WEBSITE_CONST, ArmoWebsite) + if ArmoAuthServer: + ldflags += " -X {}={}".format(AUTH_SERVER_CONST, ArmoAuthServer) + + build_command = ["go", "build", "-o", ks_file, "-ldflags" ,ldflags] print("Building kubescape and saving here: {}".format(ks_file)) - status = subprocess.call(["go", "build", "-o", ks_file, "-ldflags" ,ldflags]) + print("Build command: {}".format(" ".join(build_command))) + + status = subprocess.call(build_command) checkStatus(status, "Failed to build kubescape") sha256 = hashlib.sha256() diff --git a/cautils/getter/armoapi.go b/cautils/getter/armoapi.go index 0534f12b..dc482553 100644 --- a/cautils/getter/armoapi.go +++ b/cautils/getter/armoapi.go @@ -27,6 +27,11 @@ var ( armoFEURL = "portal.armo.cloud" armoAUTHURL = "auth.armo.cloud" + armoStageERURL = "report-ks.eustage2.cyberarmorsoft" + armoStageBEURL = "api-stage.armo.cloud" + armoStageFEURL = "armoui.eustage2.cyberarmorsoft.com" + armoStageAUTHURL = "eggauth.eustage2.cyberarmorsoft.com" + armoDevERURL = "report.eudev3.cyberarmorsoft.com" armoDevBEURL = "api-dev.armo.cloud" armoDevFEURL = "armoui-dev.eudev3.cyberarmorsoft.com" @@ -84,6 +89,17 @@ func NewARMOAPIProd() *ArmoAPI { return apiObj } +func NewARMOAPIStaging() *ArmoAPI { + apiObj := newArmoAPI() + + apiObj.apiURL = armoStageBEURL + apiObj.erURL = armoStageERURL + apiObj.feURL = armoStageFEURL + apiObj.authURL = armoStageAUTHURL + + return apiObj +} + func NewARMOAPICustomized(armoERURL, armoBEURL, armoFEURL, armoAUTHURL string) *ArmoAPI { apiObj := newArmoAPI() diff --git a/cautils/getter/getpoliciesutils.go b/cautils/getter/getpoliciesutils.go index 30b82e80..d577234a 100644 --- a/cautils/getter/getpoliciesutils.go +++ b/cautils/getter/getpoliciesutils.go @@ -13,11 +13,7 @@ import ( ) func GetDefaultPath(name string) string { - defaultfilePath := filepath.Join(DefaultLocalStore, name) - if homeDir, err := os.UserHomeDir(); err == nil { - defaultfilePath = filepath.Join(homeDir, defaultfilePath) - } - return defaultfilePath + return filepath.Join(DefaultLocalStore, name) } func SaveInFile(policy interface{}, pathStr string) error { diff --git a/cautils/getter/loadpolicy.go b/cautils/getter/loadpolicy.go index 7ae8c8f5..12d56555 100644 --- a/cautils/getter/loadpolicy.go +++ b/cautils/getter/loadpolicy.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "os" + "path/filepath" "strings" "github.com/armosec/armoapi-go/armotypes" @@ -13,7 +14,15 @@ import ( // ======================================================================================================================= // ============================================== LoadPolicy ============================================================= // ======================================================================================================================= -const DefaultLocalStore = ".kubescape" +var DefaultLocalStore = getCacheDir() + +func getCacheDir() string { + defaultDirPath := ".kubescape" + if homeDir, err := os.UserHomeDir(); err == nil { + defaultDirPath = filepath.Join(homeDir, defaultDirPath) + } + return defaultDirPath +} // Load policies from a local repository type LoadPolicy struct { diff --git a/cautils/logger/methods.go b/cautils/logger/methods.go index e767775e..be208fd2 100644 --- a/cautils/logger/methods.go +++ b/cautils/logger/methods.go @@ -2,6 +2,7 @@ package logger import ( "os" + "strings" "github.com/armosec/kubescape/cautils/logger/helpers" "github.com/armosec/kubescape/cautils/logger/prettylogger" @@ -28,16 +29,23 @@ var l ILogger func L() ILogger { if l == nil { - InitializeLogger() + InitializeLogger("") } return l } -func InitializeLogger() { +func InitializeLogger(loggerName string) { - if isatty.IsTerminal(os.Stdout.Fd()) { - l = prettylogger.NewPrettyLogger() - } else { + switch strings.ToLower(loggerName) { + case "zap": l = zaplogger.NewZapLogger() + case "pretty": + l = prettylogger.NewPrettyLogger() + default: + if isatty.IsTerminal(os.Stdout.Fd()) { + l = prettylogger.NewPrettyLogger() + } else { + l = zaplogger.NewZapLogger() + } } } diff --git a/cautils/scaninfo.go b/cautils/scaninfo.go index eb0c4a4c..128d4ce1 100644 --- a/cautils/scaninfo.go +++ b/cautils/scaninfo.go @@ -73,6 +73,7 @@ type ScanInfo struct { Local bool // Do not submit results Account string // account ID Logger string // logger level + CacheDir string // cached dir KubeContext string // context name FrameworkScan bool // false if scanning control ScanAll bool // true if scan all frameworks diff --git a/clihandler/cmd/root.go b/clihandler/cmd/root.go index 8c20df28..96245611 100644 --- a/clihandler/cmd/root.go +++ b/clihandler/cmd/root.go @@ -3,8 +3,10 @@ package cmd import ( "flag" "fmt" + "os" "strings" + "github.com/armosec/kubescape/cautils" "github.com/armosec/kubescape/cautils/getter" "github.com/armosec/kubescape/cautils/logger" "github.com/armosec/kubescape/cautils/logger/helpers" @@ -31,6 +33,7 @@ var ksExamples = ` var rootCmd = &cobra.Command{ Use: "kubescape", + Version: cautils.BuildNumber, Short: "Kubescape is a tool for testing Kubernetes security posture", Long: `Kubescape is a tool for testing Kubernetes security posture based on NSA \ MITRE ATT&CKĀ® and other frameworks specifications`, Example: ksExamples, @@ -40,20 +43,42 @@ func Execute() { rootCmd.Execute() } func init() { - cobra.OnInitialize(initLogger, initEnvironment) + cobra.OnInitialize(initLogger, initLoggerLevel, initEnvironment, initCacheDir) flag.CommandLine.StringVar(&armoBEURLs, "environment", "", envFlagUsage) rootCmd.PersistentFlags().StringVar(&armoBEURLs, "environment", "", envFlagUsage) rootCmd.PersistentFlags().MarkHidden("environment") - rootCmd.PersistentFlags().StringVar(&scanInfo.Logger, "logger", "info", fmt.Sprintf("Logger level. Supported: %s", strings.Join(helpers.SupportedLevels(), "/"))) + rootCmd.PersistentFlags().StringVarP(&scanInfo.Logger, "logger", "l", helpers.InfoLevel.String(), fmt.Sprintf("Logger level. Supported: %s [$KS_LOGGER]", strings.Join(helpers.SupportedLevels(), "/"))) + rootCmd.PersistentFlags().StringVar(&scanInfo.CacheDir, "cache-dir", getter.DefaultLocalStore, "Cache directory [$KS_CACHE_DIR]") flag.Parse() } func initLogger() { + if l := os.Getenv("KS_LOGGER_NAME"); l != "" { + logger.InitializeLogger(l) + } +} +func initLoggerLevel() { + if scanInfo.Logger != helpers.InfoLevel.String() { + } else if l := os.Getenv("KS_LOGGER"); l != "" { + scanInfo.Logger = l + } if err := logger.L().SetLevel(scanInfo.Logger); err != nil { logger.L().Fatal(fmt.Sprintf("supported levels: %s", strings.Join(helpers.SupportedLevels(), "/")), helpers.Error(err)) } } + +func initCacheDir() { + if scanInfo.CacheDir != getter.DefaultLocalStore { + getter.DefaultLocalStore = scanInfo.CacheDir + } else if cacheDir := os.Getenv("KS_CACHE_DIR"); cacheDir != "" { + getter.DefaultLocalStore = cacheDir + } else { + return // using default cache di location + } + + logger.L().Debug("cache dir updated", helpers.String("path", getter.DefaultLocalStore)) +} func initEnvironment() { urlSlices := strings.Split(armoBEURLs, ",") if len(urlSlices) != 1 && len(urlSlices) < 3 { @@ -62,8 +87,10 @@ func initEnvironment() { switch len(urlSlices) { case 1: switch urlSlices[0] { - case "dev": + case "dev", "development": getter.SetARMOAPIConnector(getter.NewARMOAPIDev()) + case "stage", "staging": + getter.SetARMOAPIConnector(getter.NewARMOAPIStaging()) case "": getter.SetARMOAPIConnector(getter.NewARMOAPIProd()) default: