1
1
package probe
2
2
3
3
import (
4
+ "fmt"
5
+ "io"
6
+ "log"
4
7
"os"
5
8
"strconv"
6
9
7
10
"github.com/fatih/color"
8
11
"github.com/olekukonko/tablewriter"
9
12
)
10
13
11
- func renderOutputInTableWithNoBorders (data [][]string ) {
12
- table := tablewriter .NewWriter (os . Stdout )
14
+ func ( o * Options ) renderOutputInTableWithNoBorders (data [][]string ) {
15
+ table := tablewriter .NewWriter (o . getWriter () )
13
16
table .SetAutoWrapText (false )
14
17
table .SetAutoFormatHeaders (true )
15
18
table .SetHeaderAlignment (tablewriter .ALIGN_LEFT )
@@ -25,87 +28,117 @@ func renderOutputInTableWithNoBorders(data [][]string) {
25
28
table .Render ()
26
29
}
27
30
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
+ }
31
37
32
- color .Green ("\n Found 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
36
41
}
37
- data = append (data , []string {" " , "kubearmor " , "Desired: " + daemonsetStatus .Desired , "Ready: " + daemonsetStatus .Ready , "Available: " + daemonsetStatus .Available })
38
- renderOutputInTableWithNoBorders (data )
42
+ return o .Writer
39
43
}
40
44
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
+ }
43
51
44
- _ , err := boldWhite .Printf ("Deployments : \n " )
52
+ func (o * Options ) printF (format string , a ... interface {}) {
53
+ _ , err := fmt .Fprintf (o .getWriter (), format , a ... )
45
54
if err != nil {
46
- color . Red ( " Error while printing" )
55
+ log . Println ( " Error in printing: " , err . Error () )
47
56
}
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 , "\n Found 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 " )
48
91
var data [][]string
49
92
for depName , depStatus := range deploymentData {
50
93
data = append (data , []string {" " , depName , "Desired: " + depStatus .Desired , "Ready: " + depStatus .Ready , "Available: " + depStatus .Available })
51
94
}
52
95
53
- renderOutputInTableWithNoBorders (data )
96
+ o . renderOutputInTableWithNoBorders (data )
54
97
}
55
98
56
99
// printKubeArmorContainers function
57
- func printKubeArmorContainers (containerData map [string ]* KubeArmorPodSpec ) {
100
+ func ( o * Options ) printKubeArmorContainers (containerData map [string ]* KubeArmorPodSpec ) {
58
101
var data [][]string
59
102
60
- _ , err := boldWhite .Printf ("Containers : \n " )
61
- if err != nil {
62
- color .Red (" Error while printing" )
63
- }
103
+ o .printToOutput (boldWhite , "Containers : \n " )
64
104
for name , spec := range containerData {
65
105
66
106
data = append (data , []string {" " , name , "Running: " + spec .Running , "Image Version: " + spec .Image_Version })
67
107
}
68
- renderOutputInTableWithNoBorders (data )
108
+ o . renderOutputInTableWithNoBorders (data )
69
109
}
70
110
71
111
// printKubeArmorprobe function
72
- func printKubeArmorprobe (probeData []KubeArmorProbeData ) {
112
+ func ( o * Options ) printKubeArmorprobe (probeData []KubeArmorProbeData ) {
73
113
74
114
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 )
80
117
}
81
118
82
119
}
83
120
84
121
// printKubeArmorProbeOutput function
85
- func printKubeArmorProbeOutput (kd KubeArmorProbeData ) {
122
+ func ( o * Options ) printKubeArmorProbeOutput (kd KubeArmorProbeData ) {
86
123
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 )
98
135
}
99
136
100
137
// 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 ) {
107
139
108
- table := tablewriter .NewWriter (os .Stdout )
140
+ o .printToOutput (boldWhite , "Armored Up pods : \n " )
141
+ table := tablewriter .NewWriter (o .getWriter ())
109
142
table .SetHeader ([]string {"NAMESPACE" , "DEFAULT POSTURE" , "VISIBILITY" , "NAME" , "POLICY" })
110
143
for _ , v := range podData {
111
144
table .Append (v )
@@ -114,13 +147,10 @@ func printAnnotatedPods(podData [][]string) {
114
147
table .SetAutoMergeCellsByColumnIndex ([]int {0 , 1 , 2 })
115
148
table .Render ()
116
149
}
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 " )
122
152
123
- table := tablewriter .NewWriter (os . Stdout )
153
+ table := tablewriter .NewWriter (o . getWriter () )
124
154
table .SetHeader ([]string {"CONTAINER NAME" , "POLICY" })
125
155
for _ , v := range podData {
126
156
table .Append (v )
@@ -130,13 +160,10 @@ func printContainersSystemd(podData [][]string) {
130
160
table .Render ()
131
161
132
162
}
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 " )
138
165
139
- table := tablewriter .NewWriter (os . Stdout )
166
+ table := tablewriter .NewWriter (o . getWriter () )
140
167
table .SetHeader ([]string {"HOST NAME " , "POLICY" })
141
168
for _ , v := range hostPolicy {
142
169
table .Append (v )
0 commit comments