mirror of
https://github.com/kubescape/kubescape.git
synced 2026-04-15 06:58:11 +00:00
156 lines
4.2 KiB
Go
156 lines
4.2 KiB
Go
package printer
|
|
|
|
import (
|
|
"fmt"
|
|
"kube-escape/cautils"
|
|
"os"
|
|
"strings"
|
|
|
|
"kube-escape/cautils/k8sinterface"
|
|
"kube-escape/cautils/opapolicy"
|
|
|
|
"github.com/enescakir/emoji"
|
|
"github.com/golang/glog"
|
|
"github.com/olekukonko/tablewriter"
|
|
)
|
|
|
|
var INDENT = " "
|
|
|
|
type Printer struct {
|
|
opaSessionObj *chan *cautils.OPASessionObj
|
|
summery Summery
|
|
}
|
|
|
|
func NewPrinter(opaSessionObj *chan *cautils.OPASessionObj) *Printer {
|
|
return &Printer{
|
|
opaSessionObj: opaSessionObj,
|
|
summery: NewSummery(),
|
|
}
|
|
}
|
|
|
|
func (printer *Printer) ActionPrint() {
|
|
|
|
// recover
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
glog.Errorf("RECOVER in ActionSendReportListenner, reason: %v", err)
|
|
}
|
|
}()
|
|
for {
|
|
opaSessionObj := <-*printer.opaSessionObj
|
|
|
|
printer.SummerySetup(opaSessionObj.PostureReport)
|
|
printer.PrintResults()
|
|
printer.PrintSummaryTable()
|
|
|
|
if !k8sinterface.RunningIncluster {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func (printer *Printer) SummerySetup(postureReport *opapolicy.PostureReport) {
|
|
for _, fr := range postureReport.FrameworkReports {
|
|
for _, cr := range fr.ControlReports {
|
|
if len(cr.RuleReports) == 0 {
|
|
continue
|
|
}
|
|
workloadsSummery := listResultSummery(cr.RuleReports)
|
|
mapResources := groupByNamespace(workloadsSummery)
|
|
|
|
printer.summery[cr.Name] = ControlSummery{
|
|
TotalResources: cr.GetNumberOfResources(),
|
|
TotalFailed: len(workloadsSummery),
|
|
WorkloadSummery: mapResources,
|
|
Description: strings.ReplaceAll(cr.Description, ". ", fmt.Sprintf(".\n%s%s", INDENT, INDENT)),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (printer *Printer) PrintResults() {
|
|
for control, controlSummery := range printer.summery {
|
|
printer.printTitle(control, &controlSummery)
|
|
printer.printResult(control, &controlSummery)
|
|
}
|
|
}
|
|
|
|
func (printer *Printer) printTitle(controlName string, controlSummery *ControlSummery) {
|
|
cautils.InfoDisplay(os.Stdout, "[control: %s] ", controlName)
|
|
if controlSummery.TotalResources == 0 {
|
|
cautils.InfoDisplay(os.Stdout, "resources not found %v\n", emoji.ConfusedFace)
|
|
} else if controlSummery.TotalFailed == 0 {
|
|
cautils.SuccessDisplay(os.Stdout, "passed %v\n", emoji.ThumbsUp)
|
|
} else {
|
|
cautils.FailureDisplay(os.Stdout, "failed %v\n", emoji.SadButRelievedFace)
|
|
}
|
|
|
|
cautils.SimpleDisplay(os.Stdout, "%sDescription: %s\n", INDENT, controlSummery.Description)
|
|
|
|
}
|
|
func (printer *Printer) printResult(controlName string, controlSummery *ControlSummery) {
|
|
|
|
indent := INDENT
|
|
for ns, rsc := range controlSummery.WorkloadSummery {
|
|
preIndent := indent
|
|
indent += indent
|
|
cautils.SimpleDisplay(os.Stdout, "%sNamespace %s\n", indent, ns)
|
|
preIndent2 := indent
|
|
for r := range rsc {
|
|
indent += indent
|
|
cautils.SimpleDisplay(os.Stdout, fmt.Sprintf("%s%s - %s\n", indent, rsc[r].Kind, rsc[r].Name))
|
|
indent = preIndent2
|
|
}
|
|
indent = preIndent
|
|
}
|
|
|
|
}
|
|
|
|
func generateRow(control string, cs ControlSummery) []string {
|
|
row := []string{control}
|
|
row = append(row, cs.ToSlice()...)
|
|
row = append(row, fmt.Sprintf("%d%s", percentage(cs.TotalResources, cs.TotalFailed), "%"))
|
|
return row
|
|
}
|
|
|
|
func generateHeader() []string {
|
|
return []string{"Control Name", "Failed Resources", "All Resources", "% success"}
|
|
}
|
|
|
|
func percentage(big, small int) int {
|
|
if big == 0 {
|
|
if small == 0 {
|
|
return 100
|
|
}
|
|
return 0
|
|
}
|
|
return int(float64(float64(big-small)/float64(big)) * 100)
|
|
}
|
|
func generateFooter(numControlers, sumFailed, sumTotal int) []string {
|
|
// Control name | # failed resources | all resources | % success
|
|
row := []string{}
|
|
row = append(row, fmt.Sprintf("%d", numControlers))
|
|
row = append(row, fmt.Sprintf("%d", sumFailed))
|
|
row = append(row, fmt.Sprintf("%d", sumTotal))
|
|
row = append(row, fmt.Sprintf("%d%s", percentage(sumTotal, sumFailed), "%"))
|
|
return row
|
|
}
|
|
|
|
func (printer *Printer) PrintSummaryTable() {
|
|
summaryTable := tablewriter.NewWriter(os.Stdout)
|
|
summaryTable.SetAutoWrapText(false)
|
|
summaryTable.SetHeader(generateHeader())
|
|
summaryTable.SetHeaderLine(true)
|
|
summaryTable.SetAlignment(tablewriter.ALIGN_LEFT)
|
|
sumTotal := 0
|
|
sumFailed := 0
|
|
|
|
for k, v := range printer.summery {
|
|
summaryTable.Append(generateRow(k, v))
|
|
sumFailed += v.TotalFailed
|
|
sumTotal += v.TotalResources
|
|
}
|
|
summaryTable.SetFooter(generateFooter(len(printer.summery), sumFailed, sumTotal))
|
|
summaryTable.Render()
|
|
}
|