@@ -4,116 +4,34 @@ import (
44 "encoding/json"
55 "fmt"
66 "text/tabwriter"
7- "text/template"
8- "time"
97
108 "github.com/replicatedhq/replicated/pkg/types"
119)
1210
13- // Table formatting for network reports
14- var (
15- networkReportTmplTableHeaderSrc = `CREATED AT SRC IP DST IP SRC PORT DST PORT PROTOCOL COMMAND PID DNS QUERY SERVICE`
16- networkReportTmplTableRowSrc = `{{ range . -}}
17- {{ padding (printf "%s" (.CreatedAt | localeTime)) 20 }} {{ if .EventData.SrcIP }}{{ padding .EventData.SrcIP 15 }}{{ else }}{{ padding "-" 15 }}{{ end }} {{ if .EventData.DstIP }}{{ padding .EventData.DstIP 15 }}{{ else }}{{ padding "-" 15 }}{{ end }} {{ if .EventData.SrcPort }}{{ padding (printf "%d" .EventData.SrcPort) 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.DstPort }}{{ padding (printf "%d" .EventData.DstPort) 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.Protocol }}{{ padding .EventData.Protocol 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.Command }}{{ padding .EventData.Command 15 }}{{ else }}{{ padding "-" 15 }}{{ end }} {{ if .EventData.PID }}{{ padding (printf "%d" .EventData.PID) 8 }}{{ else }}{{ padding "-" 8 }}{{ end }} {{ if .EventData.DNSQueryName }}{{ padding .EventData.DNSQueryName 20 }}{{ else }}{{ padding "-" 20 }}{{ end }} {{ if .EventData.LikelyService }}{{ padding .EventData.LikelyService 15 }}{{ else }}{{ padding "-" 15 }}{{ end }}
18- {{ end }}`
19- )
20-
21- var (
22- networkReportTmplTableSrc = fmt .Sprintln (networkReportTmplTableHeaderSrc ) + networkReportTmplTableRowSrc
23- networkReportTmplTable = template .Must (template .New ("networkReport" ).Funcs (funcs ).Parse (networkReportTmplTableSrc ))
24- networkReportTmplTableNoHeader = template .Must (template .New ("networkReport" ).Funcs (funcs ).Parse (networkReportTmplTableRowSrc ))
25- )
2611
27- // NetworkEventsWithData represents network events with parsed event data
28- type NetworkEventsWithData struct {
29- CreatedAt time.Time
30- EventData * types.NetworkEventData
31- }
32-
33- // NetworkReport prints network report in various formats
34- func NetworkReport (outputFormat string , w * tabwriter.Writer , report * types.NetworkReport ) error {
35- switch outputFormat {
36- case "table" :
37- if len (report .Events ) == 0 {
38- _ , err := fmt .Fprintln (w , "No network events found." )
39- return err
40- }
41- eventsWithData , err := parseNetworkEventsData (report .Events )
42- if err != nil {
43- return fmt .Errorf ("failed to parse network events: %v" , err )
44- }
45- if err := networkReportTmplTable .Execute (w , eventsWithData ); err != nil {
46- return err
47- }
48- case "json" :
49- reportBytes , err := json .MarshalIndent (report , "" , " " )
50- if err != nil {
51- return fmt .Errorf ("failed to marshal report to json: %v" , err )
52- }
53- if _ , err := fmt .Fprintln (w , string (reportBytes )); err != nil {
54- return err
55- }
56- default :
57- return fmt .Errorf ("unsupported output format: %s" , outputFormat )
12+ // NetworkReport prints network report in JSON format
13+ func NetworkReport (w * tabwriter.Writer , report * types.NetworkReport ) error {
14+ reportBytes , err := json .MarshalIndent (report , "" , " " )
15+ if err != nil {
16+ return fmt .Errorf ("failed to marshal report to json: %v" , err )
17+ }
18+ if _ , err := fmt .Fprintln (w , string (reportBytes )); err != nil {
19+ return err
5820 }
5921 return w .Flush ()
6022}
6123
62- // NetworkEvents prints network events in table format (for watch mode)
63- func NetworkEvents (outputFormat string , w * tabwriter.Writer , events []* types.NetworkEvent , includeHeader bool ) error {
64- switch outputFormat {
65- case "table" :
66- if len (events ) == 0 {
67- return nil
68- }
69- eventsWithData , err := parseNetworkEventsData (events )
24+ // NetworkEvents prints network events in JSON format (for watch mode)
25+ func NetworkEvents (w * tabwriter.Writer , events []* types.NetworkEventData ) error {
26+ for _ , event := range events {
27+ eventBytes , err := json .Marshal (event )
7028 if err != nil {
71- return fmt .Errorf ("failed to parse network events: %v" , err )
72- }
73- if includeHeader {
74- if err := networkReportTmplTable .Execute (w , eventsWithData ); err != nil {
75- return err
76- }
77- } else {
78- if err := networkReportTmplTableNoHeader .Execute (w , eventsWithData ); err != nil {
79- return err
80- }
29+ continue // Skip events that can't be marshaled
8130 }
82- case "json" :
83- for _ , event := range events {
84- eventBytes , err := json .Marshal (event )
85- if err != nil {
86- continue // Skip events that can't be marshaled
87- }
88- if _ , err := fmt .Fprintln (w , string (eventBytes )); err != nil {
89- return err
90- }
31+ if _ , err := fmt .Fprintln (w , string (eventBytes )); err != nil {
32+ return err
9133 }
92- default :
93- return fmt .Errorf ("unsupported output format: %s" , outputFormat )
9434 }
9535 return w .Flush ()
9636}
9737
98- // parseNetworkEventsData parses the JSON event data for template consumption
99- func parseNetworkEventsData (events []* types.NetworkEvent ) ([]* NetworkEventsWithData , error ) {
100- var eventsWithData []* NetworkEventsWithData
101-
102- for _ , event := range events {
103- var eventData types.NetworkEventData
104- if err := json .Unmarshal ([]byte (event .EventData ), & eventData ); err != nil {
105- // For events that can't be parsed, create a minimal entry
106- eventsWithData = append (eventsWithData , & NetworkEventsWithData {
107- CreatedAt : event .CreatedAt ,
108- EventData : & types.NetworkEventData {},
109- })
110- } else {
111- eventsWithData = append (eventsWithData , & NetworkEventsWithData {
112- CreatedAt : event .CreatedAt ,
113- EventData : & eventData ,
114- })
115- }
116- }
117-
118- return eventsWithData , nil
119- }
0 commit comments