mirror of
https://github.com/kubeshark/kubeshark.git
synced 2026-05-06 17:27:24 +00:00
* Remove `tcpStreamWrapper` struct * Refactor `tap` module and move some of the code to `tap/api` module * Move `TrafficFilteringOptions` struct to `shared` module * Change the `Dissect` method signature to have `*TcpReader` as an argument * Add `CloseOtherProtocolDissectors` method and use it to synchronously close the other protocol dissectors * Run `go mod tidy` in `cli` module * Rename `SuperIdentifier` struct to `ProtoIdentifier` * Remove `SuperTimer` struct * Bring back `CloseTimedoutTcpStreamChannels` method * Run `go mod tidy` everywhere * Remove `GOGC` environment variable from tapper * Fix the tests * Bring back `debug.FreeOSMemory()` call * Make `CloseOtherProtocolDissectors` method mutexed * Revert "Remove `GOGC` environment variable from tapper" This reverts commitcfc2484bbb. * Bring back the removed `checksum`, `nooptcheck` and `ignorefsmerr` flags * Define a bunch of interfaces and don't export any new structs from `tap/api` * Keep the interfaces in `tap/api` but move the structs to `tap/tcp` * Fix the unit tests by depending on `github.com/up9inc/mizu/tap` * Use the modified `tlsEmitter` * Define `TlsChunk` interface and make `tlsReader` implement `TcpReader` * Remove unused fields in `tlsReader` * Define `ReassemblyStream` interface and separate `gopacket` specififc fields to `tcpReassemblyStream` struct Such that make `tap/api` don't depend on `gopacket` * Remove the unused fields * Make `tlsPoller` implement `TcpStream` interface and remove the call to `NewTcpStreamDummy` method * Remove unused fields from `tlsPoller` * Remove almost all of the setter methods in `TcpReader` and `TcpStream` interface and remove `TlsChunk` interface * Revert "Revert "Remove `GOGC` environment variable from tapper"" This reverts commitab2b9a803b. * Revert "Bring back `debug.FreeOSMemory()` call" This reverts commit1cce863bbb. * Remove excess comment * Fix acceptance tests (`logger` module) #run_acceptance_tests * Bring back `github.com/patrickmn/go-cache` * Fix `NewTcpStream` method signature * Put `tcpReader` and `tcpStream` mocks into protocol dissectors to remove `github.com/up9inc/mizu/tap` dependency * Fix AMQP tests * Revert960ba644cd* Revert `go.mod` and `go.sum` files in protocol dissectors * Fix the comment position * Revert `AppStatsInst` change * Fix indent * Fix CLI build * Fix linter error * Fix error msg * Revert some of the changes in `chunk.go`
103 lines
2.1 KiB
Go
103 lines
2.1 KiB
Go
package tap
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/google/gopacket/reassembly"
|
|
"github.com/up9inc/mizu/logger"
|
|
"github.com/up9inc/mizu/tap/api"
|
|
)
|
|
|
|
type CleanerStats struct {
|
|
flushed int
|
|
closed int
|
|
deleted int
|
|
}
|
|
|
|
type Cleaner struct {
|
|
assembler *reassembly.Assembler
|
|
assemblerMutex *sync.Mutex
|
|
cleanPeriod time.Duration
|
|
connectionTimeout time.Duration
|
|
stats CleanerStats
|
|
statsMutex sync.Mutex
|
|
streamsMap api.TcpStreamMap
|
|
}
|
|
|
|
func (cl *Cleaner) clean() {
|
|
startCleanTime := time.Now()
|
|
|
|
cl.assemblerMutex.Lock()
|
|
logger.Log.Debugf("Assembler Stats before cleaning %s", cl.assembler.Dump())
|
|
flushed, closed := cl.assembler.FlushCloseOlderThan(startCleanTime.Add(-cl.connectionTimeout))
|
|
cl.assemblerMutex.Unlock()
|
|
|
|
cl.streamsMap.Range(func(k, v interface{}) bool {
|
|
reqResMatcher := v.(api.TcpStream).GetReqResMatcher()
|
|
if reqResMatcher == nil {
|
|
return true
|
|
}
|
|
deleted := deleteOlderThan(reqResMatcher.GetMap(), startCleanTime.Add(-cl.connectionTimeout))
|
|
cl.stats.deleted += deleted
|
|
return true
|
|
})
|
|
|
|
cl.statsMutex.Lock()
|
|
logger.Log.Debugf("Assembler Stats after cleaning %s", cl.assembler.Dump())
|
|
cl.stats.flushed += flushed
|
|
cl.stats.closed += closed
|
|
cl.statsMutex.Unlock()
|
|
}
|
|
|
|
func (cl *Cleaner) start() {
|
|
go func() {
|
|
ticker := time.NewTicker(cl.cleanPeriod)
|
|
|
|
for {
|
|
<-ticker.C
|
|
cl.clean()
|
|
}
|
|
}()
|
|
}
|
|
|
|
func (cl *Cleaner) dumpStats() CleanerStats {
|
|
cl.statsMutex.Lock()
|
|
|
|
stats := CleanerStats{
|
|
flushed: cl.stats.flushed,
|
|
closed: cl.stats.closed,
|
|
deleted: cl.stats.deleted,
|
|
}
|
|
|
|
cl.stats.flushed = 0
|
|
cl.stats.closed = 0
|
|
cl.stats.deleted = 0
|
|
|
|
cl.statsMutex.Unlock()
|
|
|
|
return stats
|
|
}
|
|
|
|
func deleteOlderThan(matcherMap *sync.Map, t time.Time) int {
|
|
numDeleted := 0
|
|
|
|
if matcherMap == nil {
|
|
return numDeleted
|
|
}
|
|
|
|
matcherMap.Range(func(key interface{}, value interface{}) bool {
|
|
message, _ := value.(*api.GenericMessage)
|
|
// TODO: Investigate the reason why `request` is `nil` in some rare occasion
|
|
if message != nil {
|
|
if message.CaptureTime.Before(t) {
|
|
matcherMap.Delete(key)
|
|
numDeleted++
|
|
}
|
|
}
|
|
return true
|
|
})
|
|
|
|
return numDeleted
|
|
}
|