mirror of
https://github.com/kubeshark/kubeshark.git
synced 2025-08-16 23:51:29 +00:00
265 lines
6.4 KiB
Go
265 lines
6.4 KiB
Go
package api
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/up9inc/mizu/tap/dbgctl"
|
|
)
|
|
|
|
const UnknownNamespace = ""
|
|
|
|
var UnknownIp = net.IP{0, 0, 0, 0}
|
|
var UnknownPort uint16 = 0
|
|
|
|
type ProtocolSummary struct {
|
|
Name string `json:"name"`
|
|
Version string `json:"version"`
|
|
Abbreviation string `json:"abbr"`
|
|
}
|
|
|
|
func (protocol *ProtocolSummary) ToString() string {
|
|
return fmt.Sprintf("%s?%s?%s", protocol.Name, protocol.Version, protocol.Abbreviation)
|
|
}
|
|
|
|
func GetProtocolSummary(inputString string) *ProtocolSummary {
|
|
splitted := strings.SplitN(inputString, "?", 3)
|
|
return &ProtocolSummary{
|
|
Name: splitted[0],
|
|
Version: splitted[1],
|
|
Abbreviation: splitted[2],
|
|
}
|
|
}
|
|
|
|
type Protocol struct {
|
|
ProtocolSummary
|
|
LongName string `json:"longName"`
|
|
Macro string `json:"macro"`
|
|
BackgroundColor string `json:"backgroundColor"`
|
|
ForegroundColor string `json:"foregroundColor"`
|
|
FontSize int8 `json:"fontSize"`
|
|
ReferenceLink string `json:"referenceLink"`
|
|
Ports []string `json:"ports"`
|
|
Priority uint8 `json:"priority"`
|
|
}
|
|
|
|
type TCP struct {
|
|
IP string `json:"ip"`
|
|
Port string `json:"port"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type Extension struct {
|
|
Protocol *Protocol
|
|
Path string
|
|
Dissector Dissector
|
|
}
|
|
|
|
type Capture string
|
|
|
|
const (
|
|
UndefinedCapture Capture = ""
|
|
Pcap Capture = "pcap"
|
|
Envoy Capture = "envoy"
|
|
Linkerd Capture = "linkerd"
|
|
Ebpf Capture = "ebpf"
|
|
)
|
|
|
|
type ConnectionInfo struct {
|
|
ClientIP string
|
|
ClientPort string
|
|
ServerIP string
|
|
ServerPort string
|
|
IsOutgoing bool
|
|
}
|
|
|
|
type TcpID struct {
|
|
SrcIP string
|
|
DstIP string
|
|
SrcPort string
|
|
DstPort string
|
|
Ident string
|
|
}
|
|
|
|
type CounterPair struct {
|
|
Request uint
|
|
Response uint
|
|
sync.Mutex
|
|
}
|
|
|
|
type GenericMessage struct {
|
|
IsRequest bool `json:"isRequest"`
|
|
CaptureTime time.Time `json:"captureTime"`
|
|
CaptureSize int `json:"captureSize"`
|
|
Payload interface{} `json:"payload"`
|
|
}
|
|
|
|
type RequestResponsePair struct {
|
|
Request GenericMessage `json:"request"`
|
|
Response GenericMessage `json:"response"`
|
|
}
|
|
|
|
type OutputChannelItem struct {
|
|
// `Protocol` is modified in later stages of data propagation. Therefore, it's not a pointer.
|
|
Protocol Protocol
|
|
Capture Capture
|
|
Timestamp int64
|
|
ConnectionInfo *ConnectionInfo
|
|
Pair *RequestResponsePair
|
|
Namespace string
|
|
}
|
|
|
|
type ReadProgress struct {
|
|
readBytes int
|
|
lastCurrent int
|
|
}
|
|
|
|
func (p *ReadProgress) Feed(n int) {
|
|
p.readBytes += n
|
|
}
|
|
|
|
func (p *ReadProgress) Current() (n int) {
|
|
p.lastCurrent = p.readBytes - p.lastCurrent
|
|
return p.lastCurrent
|
|
}
|
|
|
|
func (p *ReadProgress) Reset() {
|
|
p.readBytes = 0
|
|
p.lastCurrent = 0
|
|
}
|
|
|
|
type Dissector interface {
|
|
Register(*Extension)
|
|
GetProtocols() map[string]*Protocol
|
|
Ping()
|
|
Dissect(b *bufio.Reader, reader TcpReader, options *TrafficFilteringOptions) error
|
|
Analyze(item *OutputChannelItem, resolvedSource string, resolvedDestination string, namespace string) *Entry
|
|
Summarize(entry *Entry) *BaseEntry
|
|
Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, err error)
|
|
Macros() map[string]string
|
|
NewResponseRequestMatcher() RequestResponseMatcher
|
|
}
|
|
|
|
type RequestResponseMatcher interface {
|
|
GetMap() *sync.Map
|
|
SetMaxTry(value int)
|
|
}
|
|
|
|
type Emitting struct {
|
|
AppStats *AppStats
|
|
OutputChannel chan *OutputChannelItem
|
|
}
|
|
|
|
type Emitter interface {
|
|
Emit(item *OutputChannelItem)
|
|
}
|
|
|
|
func (e *Emitting) Emit(item *OutputChannelItem) {
|
|
e.AppStats.IncMatchedPairs()
|
|
|
|
if dbgctl.MizuTapperDisableEmitting {
|
|
return
|
|
}
|
|
|
|
e.OutputChannel <- item
|
|
}
|
|
|
|
type Entry struct {
|
|
Id string `json:"id"`
|
|
Protocol ProtocolSummary `json:"protocol"`
|
|
Capture Capture `json:"capture"`
|
|
Source *TCP `json:"src"`
|
|
Destination *TCP `json:"dst"`
|
|
Namespace string `json:"namespace"`
|
|
Outgoing bool `json:"outgoing"`
|
|
Timestamp int64 `json:"timestamp"`
|
|
StartTime time.Time `json:"startTime"`
|
|
Request map[string]interface{} `json:"request"`
|
|
Response map[string]interface{} `json:"response"`
|
|
RequestSize int `json:"requestSize"`
|
|
ResponseSize int `json:"responseSize"`
|
|
ElapsedTime int64 `json:"elapsedTime"`
|
|
}
|
|
|
|
type EntryWrapper struct {
|
|
Protocol Protocol `json:"protocol"`
|
|
Representation string `json:"representation"`
|
|
Data *Entry `json:"data"`
|
|
Base *BaseEntry `json:"base"`
|
|
}
|
|
|
|
type BaseEntry struct {
|
|
Id string `json:"id"`
|
|
Protocol Protocol `json:"proto,omitempty"`
|
|
Capture Capture `json:"capture"`
|
|
Summary string `json:"summary,omitempty"`
|
|
SummaryQuery string `json:"summaryQuery,omitempty"`
|
|
Status int `json:"status"`
|
|
StatusQuery string `json:"statusQuery"`
|
|
Method string `json:"method,omitempty"`
|
|
MethodQuery string `json:"methodQuery,omitempty"`
|
|
Timestamp int64 `json:"timestamp,omitempty"`
|
|
Source *TCP `json:"src"`
|
|
Destination *TCP `json:"dst"`
|
|
IsOutgoing bool `json:"isOutgoing,omitempty"`
|
|
Latency int64 `json:"latency"`
|
|
}
|
|
|
|
const (
|
|
TABLE string = "table"
|
|
BODY string = "body"
|
|
)
|
|
|
|
type SectionData struct {
|
|
Type string `json:"type"`
|
|
Title string `json:"title"`
|
|
Data string `json:"data"`
|
|
Encoding string `json:"encoding,omitempty"`
|
|
MimeType string `json:"mimeType,omitempty"`
|
|
Selector string `json:"selector,omitempty"`
|
|
}
|
|
|
|
type TableData struct {
|
|
Name string `json:"name"`
|
|
Value interface{} `json:"value"`
|
|
Selector string `json:"selector"`
|
|
}
|
|
|
|
type TcpReaderDataMsg interface {
|
|
GetBytes() []byte
|
|
GetTimestamp() time.Time
|
|
}
|
|
|
|
type TcpReader interface {
|
|
Read(p []byte) (int, error)
|
|
GetReqResMatcher() RequestResponseMatcher
|
|
GetIsClient() bool
|
|
GetReadProgress() *ReadProgress
|
|
GetParent() TcpStream
|
|
GetTcpID() *TcpID
|
|
GetCounterPair() *CounterPair
|
|
GetCaptureTime() time.Time
|
|
GetEmitter() Emitter
|
|
GetIsClosed() bool
|
|
}
|
|
|
|
type TcpStream interface {
|
|
SetProtocol(protocol *Protocol)
|
|
GetOrigin() Capture
|
|
GetReqResMatchers() []RequestResponseMatcher
|
|
GetIsTapTarget() bool
|
|
GetIsClosed() bool
|
|
}
|
|
|
|
type TcpStreamMap interface {
|
|
Range(f func(key, value interface{}) bool)
|
|
Store(key, value interface{})
|
|
Delete(key interface{})
|
|
NextId() int64
|
|
CloseTimedoutTcpStreamChannels()
|
|
}
|