|
| 1 | +package server |
| 2 | + |
| 3 | +import ( |
| 4 | + "bytes" |
| 5 | + "fmt" |
| 6 | + "log" |
| 7 | + "net" |
| 8 | + "text/tabwriter" |
| 9 | + |
| 10 | + "github.com/kentik/libkflow/chf" |
| 11 | +) |
| 12 | + |
| 13 | +func Print(i int, flow chf.CHF) { |
| 14 | + buf := bytes.Buffer{} |
| 15 | + w := tabwriter.NewWriter(&buf, 0, 4, 1, ' ', 0) |
| 16 | + |
| 17 | + fmt.Fprintf(w, "FLOW #%02d\n", i) |
| 18 | + fmt.Fprintf(w, " timestampNano:\t%v\n", flow.TimestampNano()) |
| 19 | + fmt.Fprintf(w, " dstAs:\t%v\n", flow.DstAs()) |
| 20 | + fmt.Fprintf(w, " dstGeo:\t%v\n", flow.DstGeo()) |
| 21 | + fmt.Fprintf(w, " dstMac:\t%v\n", flow.DstMac()) |
| 22 | + fmt.Fprintf(w, " headerLen:\t%v\n", flow.HeaderLen()) |
| 23 | + fmt.Fprintf(w, " inBytes:\t%v\n", flow.InBytes()) |
| 24 | + fmt.Fprintf(w, " inPkts:\t%v\n", flow.InPkts()) |
| 25 | + fmt.Fprintf(w, " inputPort:\t%v\n", flow.InputPort()) |
| 26 | + fmt.Fprintf(w, " ipSize:\t%v\n", flow.IpSize()) |
| 27 | + fmt.Fprintf(w, " ipv4DstAddr:\t%v\n", ip(flow.Ipv4DstAddr())) |
| 28 | + fmt.Fprintf(w, " ipv4SrcAddr:\t%v\n", ip(flow.Ipv4SrcAddr())) |
| 29 | + fmt.Fprintf(w, " l4DstPort:\t%v\n", flow.L4DstPort()) |
| 30 | + fmt.Fprintf(w, " l4SrcPort:\t%v\n", flow.L4SrcPort()) |
| 31 | + fmt.Fprintf(w, " outputPort:\t%v\n", flow.OutputPort()) |
| 32 | + fmt.Fprintf(w, " protocol:\t%v\n", flow.Protocol()) |
| 33 | + fmt.Fprintf(w, " sampledPacketSize:\t%v\n", flow.SampledPacketSize()) |
| 34 | + fmt.Fprintf(w, " srcAs:\t%v\n", flow.SrcAs()) |
| 35 | + fmt.Fprintf(w, " srcGeo:\t%v\n", flow.SrcGeo()) |
| 36 | + fmt.Fprintf(w, " srcMac:\t%v\n", flow.SrcMac()) |
| 37 | + fmt.Fprintf(w, " tcpFlags:\t%v\n", flow.TcpFlags()) |
| 38 | + fmt.Fprintf(w, " tos:\t%v\n", flow.Tos()) |
| 39 | + fmt.Fprintf(w, " vlanIn:\t%v\n", flow.VlanIn()) |
| 40 | + fmt.Fprintf(w, " vlanOut:\t%v\n", flow.VlanOut()) |
| 41 | + fmt.Fprintf(w, " ipv4NextHop:\t%v\n", ip(flow.Ipv4NextHop())) |
| 42 | + fmt.Fprintf(w, " mplsType:\t%v\n", flow.MplsType()) |
| 43 | + fmt.Fprintf(w, " outBytes:\t%v\n", flow.OutBytes()) |
| 44 | + fmt.Fprintf(w, " outPkts:\t%v\n", flow.OutPkts()) |
| 45 | + fmt.Fprintf(w, " tcpRetransmit:\t%v\n", flow.TcpRetransmit()) |
| 46 | + fmt.Fprintf(w, " srcFlowTags:\t%#v\n", str(flow.SrcFlowTags())) |
| 47 | + fmt.Fprintf(w, " dstFlowTags:\t%#v\n", str(flow.DstFlowTags())) |
| 48 | + fmt.Fprintf(w, " sampleRate:\t%v\n", flow.SampleRate()) |
| 49 | + fmt.Fprintf(w, " deviceId:\t%v\n", flow.DeviceId()) |
| 50 | + fmt.Fprintf(w, " flowTags:\t%#v\n", str(flow.FlowTags())) |
| 51 | + fmt.Fprintf(w, " timestamp:\t%v\n", flow.Timestamp()) |
| 52 | + fmt.Fprintf(w, " dstBgpAsPath:\t%#v\n", str(flow.DstBgpAsPath())) |
| 53 | + fmt.Fprintf(w, " dstBgpCommunity:\t%#v\n", str(flow.DstBgpCommunity())) |
| 54 | + fmt.Fprintf(w, " srcBgpAsPath:\t%#v\n", str(flow.SrcBgpAsPath())) |
| 55 | + fmt.Fprintf(w, " srcBgpCommunity:\t%#v\n", str(flow.SrcBgpCommunity())) |
| 56 | + fmt.Fprintf(w, " srcNextHopAs:\t%v\n", flow.SrcNextHopAs()) |
| 57 | + fmt.Fprintf(w, " dstNextHopAs:\t%v\n", flow.DstNextHopAs()) |
| 58 | + fmt.Fprintf(w, " srcGeoRegion:\t%v\n", flow.SrcGeoRegion()) |
| 59 | + fmt.Fprintf(w, " dstGeoRegion:\t%v\n", flow.DstGeoRegion()) |
| 60 | + fmt.Fprintf(w, " srcGeoCity:\t%v\n", flow.SrcGeoCity()) |
| 61 | + fmt.Fprintf(w, " dstGeoCity:\t%v\n", flow.DstGeoCity()) |
| 62 | + fmt.Fprintf(w, " big:\t%v\n", flow.Big()) |
| 63 | + fmt.Fprintf(w, " sampleAdj:\t%v\n", flow.SampleAdj()) |
| 64 | + fmt.Fprintf(w, " ipv4DstNextHop:\t%v\n", ip(flow.Ipv4DstNextHop())) |
| 65 | + fmt.Fprintf(w, " ipv4SrcNextHop:\t%v\n", ip(flow.Ipv4SrcNextHop())) |
| 66 | + fmt.Fprintf(w, " srcRoutePrefix:\t%v\n", flow.SrcRoutePrefix()) |
| 67 | + fmt.Fprintf(w, " dstRoutePrefix:\t%v\n", flow.DstRoutePrefix()) |
| 68 | + fmt.Fprintf(w, " srcRouteLength:\t%v\n", flow.SrcRouteLength()) |
| 69 | + fmt.Fprintf(w, " dstRouteLength:\t%v\n", flow.DstRouteLength()) |
| 70 | + fmt.Fprintf(w, " srcSecondAsn:\t%v\n", flow.SrcSecondAsn()) |
| 71 | + fmt.Fprintf(w, " dstSecondAsn:\t%v\n", flow.DstSecondAsn()) |
| 72 | + fmt.Fprintf(w, " srcThirdAsn:\t%v\n", flow.SrcThirdAsn()) |
| 73 | + fmt.Fprintf(w, " dstThirdAsn:\t%v\n", flow.DstThirdAsn()) |
| 74 | + fmt.Fprintf(w, " ipv6DstAddr:\t%v\n", ip(flow.Ipv6DstAddr())) |
| 75 | + fmt.Fprintf(w, " ipv6SrcAddr:\t%v\n", ip(flow.Ipv6SrcAddr())) |
| 76 | + fmt.Fprintf(w, " srcEthMac:\t%v\n", flow.SrcEthMac()) |
| 77 | + fmt.Fprintf(w, " dstEthMac:\t%v\n", flow.DstEthMac()) |
| 78 | + w.Flush() |
| 79 | + |
| 80 | + log.Output(0, buf.String()) |
| 81 | +} |
| 82 | + |
| 83 | +func ip(v interface{}, _ ...error) net.IP { |
| 84 | + switch v := v.(type) { |
| 85 | + case uint32: |
| 86 | + return net.IPv4(byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) |
| 87 | + case []byte: |
| 88 | + return net.IP(v) |
| 89 | + default: |
| 90 | + return (net.IP)(nil) |
| 91 | + } |
| 92 | +} |
| 93 | + |
| 94 | +func str(v interface{}, _ error) interface{} { |
| 95 | + return v |
| 96 | +} |
0 commit comments