Skip to content

Commit e7b1e60

Browse files
Merge pull request #449 from Manik2708/sysdump
probe added to sysdump
2 parents 217e88d + 073bb1e commit e7b1e60

File tree

5 files changed

+180
-129
lines changed

5 files changed

+180
-129
lines changed

cmd/probe.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ func init() {
3434
probeCmd.Flags().StringVarP(&probeInstallOptions.Namespace, "namespace", "n", "kubearmor", "Namespace for resources")
3535
probeCmd.Flags().BoolVar(&probeInstallOptions.Full, "full", false, `If KubeArmor is not running, it deploys a daemonset to have access to more
3636
information on KubeArmor support in the environment and deletes daemonset after probing`)
37-
probeCmd.Flags().StringVarP(&probeInstallOptions.Output, "format", "f", "text", " Format: json or text ")
37+
probeCmd.Flags().StringVarP(&probeInstallOptions.Output, "format", "f", "text", "Format: json or text or no-color")
3838
probeCmd.Flags().StringVar(&probeInstallOptions.GRPC, "gRPC", "", "GRPC port ")
3939
}

probe/print.go

+86-59
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package probe
22

33
import (
4+
"fmt"
5+
"io"
6+
"log"
47
"os"
58
"strconv"
69

710
"github.com/fatih/color"
811
"github.com/olekukonko/tablewriter"
912
)
1013

11-
func renderOutputInTableWithNoBorders(data [][]string) {
12-
table := tablewriter.NewWriter(os.Stdout)
14+
func (o *Options) renderOutputInTableWithNoBorders(data [][]string) {
15+
table := tablewriter.NewWriter(o.getWriter())
1316
table.SetAutoWrapText(false)
1417
table.SetAutoFormatHeaders(true)
1518
table.SetHeaderAlignment(tablewriter.ALIGN_LEFT)
@@ -25,87 +28,117 @@ func renderOutputInTableWithNoBorders(data [][]string) {
2528
table.Render()
2629
}
2730

28-
// printDaemonsetData function
29-
func printDaemonsetData(daemonsetStatus *Status) {
30-
var data [][]string
31+
func (o *Options) getPrintableString(c *color.Color, s string) string {
32+
if o.Output == "no-color" || c == nil {
33+
return s
34+
}
35+
return c.SprintFunc()(s)
36+
}
3137

32-
color.Green("\nFound KubeArmor running in Kubernetes\n\n")
33-
_, err := boldWhite.Printf("Daemonset :\n")
34-
if err != nil {
35-
color.Red(" Error while printing")
38+
func (o *Options) getWriter() io.Writer {
39+
if o.Writer == nil {
40+
return os.Stdout
3641
}
37-
data = append(data, []string{" ", "kubearmor ", "Desired: " + daemonsetStatus.Desired, "Ready: " + daemonsetStatus.Ready, "Available: " + daemonsetStatus.Available})
38-
renderOutputInTableWithNoBorders(data)
42+
return o.Writer
3943
}
4044

41-
// printKubeArmorDeployments function
42-
func printKubearmorDeployments(deploymentData map[string]*Status) {
45+
func (o *Options) printLn(a ...any) {
46+
_, err := fmt.Fprintln(o.getWriter(), a...)
47+
if err != nil {
48+
log.Println("Error in printing: ", err.Error())
49+
}
50+
}
4351

44-
_, err := boldWhite.Printf("Deployments : \n")
52+
func (o *Options) printF(format string, a ...interface{}) {
53+
_, err := fmt.Fprintf(o.getWriter(), format, a...)
4554
if err != nil {
46-
color.Red(" Error while printing")
55+
log.Println("Error in printing: ", err.Error())
4756
}
57+
}
58+
59+
func (o *Options) printToOutput(c *color.Color, s string) {
60+
if o.Output == "no-color" || c == nil {
61+
_, err := fmt.Fprint(o.getWriter(), s)
62+
if err != nil {
63+
_, printErr := red.Printf(" error while printing to os.Stdout %s ", err.Error())
64+
if printErr != nil {
65+
fmt.Printf("printing error %s", printErr.Error())
66+
}
67+
}
68+
} else {
69+
_, err := c.Fprintf(o.getWriter(), s)
70+
if err != nil {
71+
_, printErr := red.Printf(" error while printing to os.Stdout %s ", err.Error())
72+
if printErr != nil {
73+
fmt.Printf("printing error %s", printErr.Error())
74+
}
75+
}
76+
}
77+
}
78+
79+
// printDaemonsetData function
80+
func (o *Options) printDaemonsetData(daemonsetStatus *Status) {
81+
var data [][]string
82+
o.printToOutput(green, "\nFound KubeArmor running in Kubernetes\n\n")
83+
o.printToOutput(boldWhite, "Daemonset :\n")
84+
data = append(data, []string{" ", "kubearmor ", "Desired: " + daemonsetStatus.Desired, "Ready: " + daemonsetStatus.Ready, "Available: " + daemonsetStatus.Available})
85+
o.renderOutputInTableWithNoBorders(data)
86+
}
87+
88+
// printKubeArmorDeployments function
89+
func (o *Options) printKubearmorDeployments(deploymentData map[string]*Status) {
90+
o.printToOutput(boldWhite, "Deployments : \n")
4891
var data [][]string
4992
for depName, depStatus := range deploymentData {
5093
data = append(data, []string{" ", depName, "Desired: " + depStatus.Desired, "Ready: " + depStatus.Ready, "Available: " + depStatus.Available})
5194
}
5295

53-
renderOutputInTableWithNoBorders(data)
96+
o.renderOutputInTableWithNoBorders(data)
5497
}
5598

5699
// printKubeArmorContainers function
57-
func printKubeArmorContainers(containerData map[string]*KubeArmorPodSpec) {
100+
func (o *Options) printKubeArmorContainers(containerData map[string]*KubeArmorPodSpec) {
58101
var data [][]string
59102

60-
_, err := boldWhite.Printf("Containers : \n")
61-
if err != nil {
62-
color.Red(" Error while printing")
63-
}
103+
o.printToOutput(boldWhite, "Containers : \n")
64104
for name, spec := range containerData {
65105

66106
data = append(data, []string{" ", name, "Running: " + spec.Running, "Image Version: " + spec.Image_Version})
67107
}
68-
renderOutputInTableWithNoBorders(data)
108+
o.renderOutputInTableWithNoBorders(data)
69109
}
70110

71111
// printKubeArmorprobe function
72-
func printKubeArmorprobe(probeData []KubeArmorProbeData) {
112+
func (o *Options) printKubeArmorprobe(probeData []KubeArmorProbeData) {
73113

74114
for i, pd := range probeData {
75-
_, err := boldWhite.Printf("Node %d : \n", i+1)
76-
if err != nil {
77-
color.Red(" Error")
78-
}
79-
printKubeArmorProbeOutput(pd)
115+
o.printToOutput(boldWhite, "Node "+fmt.Sprint(i+1)+" : \n")
116+
o.printKubeArmorProbeOutput(pd)
80117
}
81118

82119
}
83120

84121
// printKubeArmorProbeOutput function
85-
func printKubeArmorProbeOutput(kd KubeArmorProbeData) {
122+
func (o *Options) printKubeArmorProbeOutput(kd KubeArmorProbeData) {
86123
var data [][]string
87-
data = append(data, []string{" ", "OS Image:", green(kd.OSImage)})
88-
data = append(data, []string{" ", "Kernel Version:", green(kd.KernelVersion)})
89-
data = append(data, []string{" ", "Kubelet Version:", green(kd.KubeletVersion)})
90-
data = append(data, []string{" ", "Container Runtime:", green(kd.ContainerRuntime)})
91-
data = append(data, []string{" ", "Active LSM:", green(kd.ActiveLSM)})
92-
data = append(data, []string{" ", "Host Security:", green(strconv.FormatBool(kd.HostSecurity))})
93-
data = append(data, []string{" ", "Container Security:", green(strconv.FormatBool(kd.ContainerSecurity))})
94-
data = append(data, []string{" ", "Container Default Posture:", green(kd.ContainerDefaultPosture.FileAction) + itwhite("(File)"), green(kd.ContainerDefaultPosture.CapabilitiesAction) + itwhite("(Capabilities)"), green(kd.ContainerDefaultPosture.NetworkAction) + itwhite("(Network)")})
95-
data = append(data, []string{" ", "Host Default Posture:", green(kd.HostDefaultPosture.FileAction) + itwhite("(File)"), green(kd.HostDefaultPosture.CapabilitiesAction) + itwhite("(Capabilities)"), green(kd.HostDefaultPosture.NetworkAction) + itwhite("(Network)")})
96-
data = append(data, []string{" ", "Host Visibility:", green(kd.HostVisibility)})
97-
renderOutputInTableWithNoBorders(data)
124+
data = append(data, []string{" ", "OS Image:", o.getPrintableString(green, kd.OSImage)})
125+
data = append(data, []string{" ", "Kernel Version:", o.getPrintableString(green, kd.KernelVersion)})
126+
data = append(data, []string{" ", "Kubelet Version:", o.getPrintableString(green, kd.KubeletVersion)})
127+
data = append(data, []string{" ", "Container Runtime:", o.getPrintableString(green, kd.ContainerRuntime)})
128+
data = append(data, []string{" ", "Active LSM:", o.getPrintableString(green, kd.ActiveLSM)})
129+
data = append(data, []string{" ", "Host Security:", o.getPrintableString(green, strconv.FormatBool(kd.HostSecurity))})
130+
data = append(data, []string{" ", "Container Security:", o.getPrintableString(green, strconv.FormatBool(kd.ContainerSecurity))})
131+
data = append(data, []string{" ", "Container Default Posture:", o.getPrintableString(green, kd.ContainerDefaultPosture.FileAction) + o.getPrintableString(itwhite, "(File)"), o.getPrintableString(green, kd.ContainerDefaultPosture.CapabilitiesAction) + o.getPrintableString(itwhite, "(Capabilities)"), o.getPrintableString(green, kd.ContainerDefaultPosture.NetworkAction) + o.getPrintableString(itwhite, "(Network)")})
132+
data = append(data, []string{" ", "Host Default Posture:", o.getPrintableString(green, kd.HostDefaultPosture.FileAction) + o.getPrintableString(itwhite, "(File)"), o.getPrintableString(green, kd.HostDefaultPosture.CapabilitiesAction) + o.getPrintableString(itwhite, "(Capabilities)"), o.getPrintableString(green, kd.HostDefaultPosture.NetworkAction) + o.getPrintableString(itwhite, "(Network)")})
133+
data = append(data, []string{" ", "Host Visibility:", o.getPrintableString(green, kd.HostVisibility)})
134+
o.renderOutputInTableWithNoBorders(data)
98135
}
99136

100137
// printAnnotatedPods function
101-
func printAnnotatedPods(podData [][]string) {
102-
103-
_, err := boldWhite.Printf("Armored Up pods : \n")
104-
if err != nil {
105-
color.Red(" Error printing bold text")
106-
}
138+
func (o *Options) printAnnotatedPods(podData [][]string) {
107139

108-
table := tablewriter.NewWriter(os.Stdout)
140+
o.printToOutput(boldWhite, "Armored Up pods : \n")
141+
table := tablewriter.NewWriter(o.getWriter())
109142
table.SetHeader([]string{"NAMESPACE", "DEFAULT POSTURE", "VISIBILITY", "NAME", "POLICY"})
110143
for _, v := range podData {
111144
table.Append(v)
@@ -114,13 +147,10 @@ func printAnnotatedPods(podData [][]string) {
114147
table.SetAutoMergeCellsByColumnIndex([]int{0, 1, 2})
115148
table.Render()
116149
}
117-
func printContainersSystemd(podData [][]string) {
118-
_, err := boldWhite.Printf("Armored Up Containers : \n")
119-
if err != nil {
120-
color.Red(" Error printing bold text")
121-
}
150+
func (o *Options) printContainersSystemd(podData [][]string) {
151+
o.printToOutput(boldWhite, "Armored Up Containers : \n")
122152

123-
table := tablewriter.NewWriter(os.Stdout)
153+
table := tablewriter.NewWriter(o.getWriter())
124154
table.SetHeader([]string{"CONTAINER NAME", "POLICY"})
125155
for _, v := range podData {
126156
table.Append(v)
@@ -130,13 +160,10 @@ func printContainersSystemd(podData [][]string) {
130160
table.Render()
131161

132162
}
133-
func printHostPolicy(hostPolicy [][]string) {
134-
_, err := boldWhite.Printf("Host Policies : \n")
135-
if err != nil {
136-
color.Red(" Error printing bold text")
137-
}
163+
func (o *Options) printHostPolicy(hostPolicy [][]string) {
164+
o.printToOutput(boldWhite, "Host Policies : \n")
138165

139-
table := tablewriter.NewWriter(os.Stdout)
166+
table := tablewriter.NewWriter(o.getWriter())
140167
table.SetHeader([]string{"HOST NAME ", "POLICY"})
141168
for _, v := range hostPolicy {
142169
table.Append(v)

0 commit comments

Comments
 (0)