mirror of
https://github.com/kubeshark/kubeshark.git
synced 2026-06-07 08:47:00 +00:00
Compare commits
2 Commits
33.0-dev10
...
33.0-dev11
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ea2dabb34 | ||
|
|
366d34b8d0 |
@@ -5,20 +5,19 @@ import (
|
|||||||
|
|
||||||
basenine "github.com/up9inc/basenine/client/go"
|
basenine "github.com/up9inc/basenine/client/go"
|
||||||
"github.com/up9inc/mizu/agent/pkg/models"
|
"github.com/up9inc/mizu/agent/pkg/models"
|
||||||
"github.com/up9inc/mizu/logger"
|
|
||||||
tapApi "github.com/up9inc/mizu/tap/api"
|
tapApi "github.com/up9inc/mizu/tap/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EntryStreamerSocketConnector interface {
|
type EntryStreamerSocketConnector interface {
|
||||||
SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams)
|
SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams) error
|
||||||
SendMetadata(socketId int, metadata *basenine.Metadata)
|
SendMetadata(socketId int, metadata *basenine.Metadata) error
|
||||||
SendToastError(socketId int, err error)
|
SendToastError(socketId int, err error) error
|
||||||
CleanupSocket(socketId int)
|
CleanupSocket(socketId int)
|
||||||
}
|
}
|
||||||
|
|
||||||
type DefaultEntryStreamerSocketConnector struct{}
|
type DefaultEntryStreamerSocketConnector struct{}
|
||||||
|
|
||||||
func (e *DefaultEntryStreamerSocketConnector) SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams) {
|
func (e *DefaultEntryStreamerSocketConnector) SendEntry(socketId int, entry *tapApi.Entry, params *WebSocketParams) error {
|
||||||
var message []byte
|
var message []byte
|
||||||
if params.EnableFullEntries {
|
if params.EnableFullEntries {
|
||||||
message, _ = models.CreateFullEntryWebSocketMessage(entry)
|
message, _ = models.CreateFullEntryWebSocketMessage(entry)
|
||||||
@@ -29,26 +28,32 @@ func (e *DefaultEntryStreamerSocketConnector) SendEntry(socketId int, entry *tap
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := SendToSocket(socketId, message); err != nil {
|
if err := SendToSocket(socketId, message); err != nil {
|
||||||
logger.Log.Error(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *DefaultEntryStreamerSocketConnector) SendMetadata(socketId int, metadata *basenine.Metadata) {
|
func (e *DefaultEntryStreamerSocketConnector) SendMetadata(socketId int, metadata *basenine.Metadata) error {
|
||||||
metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata)
|
metadataBytes, _ := models.CreateWebsocketQueryMetadataMessage(metadata)
|
||||||
if err := SendToSocket(socketId, metadataBytes); err != nil {
|
if err := SendToSocket(socketId, metadataBytes); err != nil {
|
||||||
logger.Log.Error(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *DefaultEntryStreamerSocketConnector) SendToastError(socketId int, err error) {
|
func (e *DefaultEntryStreamerSocketConnector) SendToastError(socketId int, err error) error {
|
||||||
toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{
|
toastBytes, _ := models.CreateWebsocketToastMessage(&models.ToastMessage{
|
||||||
Type: "error",
|
Type: "error",
|
||||||
AutoClose: 5000,
|
AutoClose: 5000,
|
||||||
Text: fmt.Sprintf("Syntax error: %s", err.Error()),
|
Text: fmt.Sprintf("Syntax error: %s", err.Error()),
|
||||||
})
|
})
|
||||||
if err := SendToSocket(socketId, toastBytes); err != nil {
|
if err := SendToSocket(socketId, toastBytes); err != nil {
|
||||||
logger.Log.Error(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *DefaultEntryStreamerSocketConnector) CleanupSocket(socketId int) {
|
func (e *DefaultEntryStreamerSocketConnector) CleanupSocket(socketId int) {
|
||||||
|
|||||||
@@ -34,14 +34,18 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
|
|||||||
meta := make(chan []byte)
|
meta := make(chan []byte)
|
||||||
|
|
||||||
query := params.Query
|
query := params.Query
|
||||||
err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query)
|
if err = basenine.Validate(shared.BasenineHost, shared.BaseninePort, query); err != nil {
|
||||||
if err != nil {
|
if err := entryStreamerSocketConnector.SendToastError(socketId, err); err != nil {
|
||||||
entryStreamerSocketConnector.SendToastError(socketId, err)
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
entryStreamerSocketConnector.CleanupSocket(socketId)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
leftOff, err := e.fetch(socketId, params, entryStreamerSocketConnector)
|
leftOff, err := e.fetch(socketId, params, entryStreamerSocketConnector)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Log.Errorf("Fetch error: %v", err.Error())
|
logger.Log.Errorf("Fetch error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
handleDataChannel := func(c *basenine.Connection, data chan []byte) {
|
handleDataChannel := func(c *basenine.Connection, data chan []byte) {
|
||||||
@@ -53,13 +57,15 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
|
|||||||
}
|
}
|
||||||
|
|
||||||
var entry *tapApi.Entry
|
var entry *tapApi.Entry
|
||||||
err = json.Unmarshal(bytes, &entry)
|
if err = json.Unmarshal(bytes, &entry); err != nil {
|
||||||
if err != nil {
|
logger.Log.Debugf("Error unmarshalling entry: %v", err)
|
||||||
logger.Log.Debugf("Error unmarshalling entry: %v", err.Error())
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
entryStreamerSocketConnector.SendEntry(socketId, entry, params)
|
if err := entryStreamerSocketConnector.SendEntry(socketId, entry, params); err != nil {
|
||||||
|
logger.Log.Errorf("Error sending entry to socket, err: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,13 +78,15 @@ func (e *BasenineEntryStreamer) Get(ctx context.Context, socketId int, params *W
|
|||||||
}
|
}
|
||||||
|
|
||||||
var metadata *basenine.Metadata
|
var metadata *basenine.Metadata
|
||||||
err = json.Unmarshal(bytes, &metadata)
|
if err = json.Unmarshal(bytes, &metadata); err != nil {
|
||||||
if err != nil {
|
logger.Log.Debugf("Error unmarshalling metadata: %v", err)
|
||||||
logger.Log.Debugf("Error unmarshalling metadata: %v", err.Error())
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
entryStreamerSocketConnector.SendMetadata(socketId, metadata)
|
if err := entryStreamerSocketConnector.SendMetadata(socketId, metadata); err != nil {
|
||||||
|
logger.Log.Errorf("Error sending metadata to socket, err: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,28 +133,31 @@ func (e *BasenineEntryStreamer) fetch(socketId int, params *WebSocketParams, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
var firstMetadata *basenine.Metadata
|
var firstMetadata *basenine.Metadata
|
||||||
err = json.Unmarshal(firstMeta, &firstMetadata)
|
if err = json.Unmarshal(firstMeta, &firstMetadata); err != nil {
|
||||||
if err != nil {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
leftOff = firstMetadata.LeftOff
|
leftOff = firstMetadata.LeftOff
|
||||||
|
|
||||||
var lastMetadata *basenine.Metadata
|
var lastMetadata *basenine.Metadata
|
||||||
err = json.Unmarshal(lastMeta, &lastMetadata)
|
if err = json.Unmarshal(lastMeta, &lastMetadata); err != nil {
|
||||||
if err != nil {
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = connector.SendMetadata(socketId, lastMetadata); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
connector.SendMetadata(socketId, lastMetadata)
|
|
||||||
|
|
||||||
data = e.reverseBytesSlice(data)
|
data = e.reverseBytesSlice(data)
|
||||||
for _, row := range data {
|
for _, row := range data {
|
||||||
var entry *tapApi.Entry
|
var entry *tapApi.Entry
|
||||||
err = json.Unmarshal(row, &entry)
|
if err = json.Unmarshal(row, &entry); err != nil {
|
||||||
if err != nil {
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
connector.SendEntry(socketId, entry, params)
|
if err = connector.SendEntry(socketId, entry, params); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,6 @@
|
|||||||
height: 100%
|
height: 100%
|
||||||
display: flex
|
display: flex
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
margin-right: 10px
|
|
||||||
width: 100%
|
width: 100%
|
||||||
border-radius: 4px
|
border-radius: 4px
|
||||||
|
|
||||||
@@ -82,17 +81,18 @@
|
|||||||
margin-top: 10px
|
margin-top: 10px
|
||||||
margin-right: 10px
|
margin-right: 10px
|
||||||
|
|
||||||
.protocolsFilterList, .servicesFilter
|
.card
|
||||||
background: white
|
background: white
|
||||||
padding: 10px
|
padding: 10px
|
||||||
border-radius: 4px
|
border-radius: 4px
|
||||||
user-select: none
|
user-select: none
|
||||||
|
box-shadow: 0px 1px 5px #979797
|
||||||
|
|
||||||
.servicesFilter
|
.servicesFilterWrapper
|
||||||
margin-top: 10px
|
margin-top: 20px
|
||||||
|
margin-bottom: 3px
|
||||||
height: 100%
|
height: 100%
|
||||||
overflow: hidden
|
overflow: hidden
|
||||||
border-radius: 4px
|
|
||||||
|
|
||||||
& .servicesFilterList
|
.servicesFilterList
|
||||||
height: calc(100% - 30px - 52px)
|
height: calc(100% - 30px - 52px)
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ export const ServiceMapModal: React.FC<ServiceMapModalProps> = ({ isOpen, onClos
|
|||||||
if (checkedProtocols.length === 0) {
|
if (checkedProtocols.length === 0) {
|
||||||
setCheckedProtocols(getProtocolsForFilter.map(x => x.key))
|
setCheckedProtocols(getProtocolsForFilter.map(x => x.key))
|
||||||
}
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [getProtocolsForFilter])
|
}, [getProtocolsForFilter])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -217,13 +218,13 @@ export const ServiceMapModal: React.FC<ServiceMapModalProps> = ({ isOpen, onClos
|
|||||||
<div className={styles.filterSection + ` ${isFilterClicked ? styles.show : ""}`}>
|
<div className={styles.filterSection + ` ${isFilterClicked ? styles.show : ""}`}>
|
||||||
<Resizeable minWidth={170} maxWidth={320}>
|
<Resizeable minWidth={170} maxWidth={320}>
|
||||||
<div className={styles.filterWrapper}>
|
<div className={styles.filterWrapper}>
|
||||||
<div className={styles.protocolsFilterList}>
|
<div className={styles.card}>
|
||||||
<SelectList items={getProtocolsForFilter} checkBoxWidth="5%" tableName={"PROTOCOLS"} multiSelect={true}
|
<SelectList items={getProtocolsForFilter} checkBoxWidth="5%" tableName={"PROTOCOLS"} multiSelect={true}
|
||||||
checkedValues={checkedProtocols} setCheckedValues={onProtocolsChange} tableClassName={styles.filters}
|
checkedValues={checkedProtocols} setCheckedValues={onProtocolsChange} tableClassName={styles.filters}
|
||||||
inputSearchClass={styles.servicesFilterSearch} isFilterable={false}/>
|
inputSearchClass={styles.servicesFilterSearch} isFilterable={false}/>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.servicesFilter}>
|
<div className={styles.servicesFilterWrapper + ` ${styles.card}`}>
|
||||||
<div className={styles.servicesFilterList}>
|
<div className={styles.servicesFilterList}>
|
||||||
<SelectList items={getServicesForFilter} tableName={"SERVICES"} tableClassName={styles.filters} multiSelect={true}
|
<SelectList items={getServicesForFilter} tableName={"SERVICES"} tableClassName={styles.filters} multiSelect={true}
|
||||||
checkBoxWidth="5%" checkedValues={checkedServices} setCheckedValues={onServiceChanges} inputSearchClass={styles.servicesFilterSearch}/>
|
checkBoxWidth="5%" checkedValues={checkedServices} setCheckedValues={onServiceChanges} inputSearchClass={styles.servicesFilterSearch}/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ const SelectList: React.FC<Props> = ({ items, tableName, checkedValues = [], mul
|
|||||||
|
|
||||||
const tableBody = filteredValues.length === 0 ?
|
const tableBody = filteredValues.length === 0 ?
|
||||||
<tr>
|
<tr>
|
||||||
<td colSpan={2}>
|
<td colSpan={2} className={styles.displayBlock}>
|
||||||
<NoDataMessage messageText={noItemsMessage} />
|
<NoDataMessage messageText={noItemsMessage} />
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -1,44 +1,70 @@
|
|||||||
@import '../../../variables.module'
|
@import '../../../variables.module'
|
||||||
@import '../../../components'
|
@import '../../../components'
|
||||||
|
|
||||||
|
|
||||||
.selectListTable
|
.selectListTable
|
||||||
overflow: auto
|
|
||||||
height: 100%
|
|
||||||
user-select: none // when resizble moved we get unwanted beheviour
|
user-select: none // when resizble moved we get unwanted beheviour
|
||||||
|
height: 100%
|
||||||
|
|
||||||
table
|
table
|
||||||
width: 100%
|
width: 100%
|
||||||
margin-top: 20px
|
|
||||||
border-collapse: collapse
|
border-collapse: collapse
|
||||||
|
table-layout: fixed
|
||||||
|
height: 100%
|
||||||
|
display: flex
|
||||||
|
flex-flow: column
|
||||||
|
height: 100%
|
||||||
|
|
||||||
th
|
thead
|
||||||
color: $blue-gray
|
display: table
|
||||||
text-align: left
|
table-layout: fixed
|
||||||
padding: 10px
|
flex: 0 0 auto
|
||||||
position: sticky
|
width: calc(100% - 0.9em)
|
||||||
top: 0
|
|
||||||
background: $main-background-color
|
|
||||||
font-size: 12px
|
|
||||||
|
|
||||||
tr
|
tbody
|
||||||
border-bottom-width: 1px
|
display: block
|
||||||
border-bottom-color: $data-background-color
|
overflow: auto
|
||||||
border-bottom-style: solid
|
width: 100%
|
||||||
width: 100%
|
height: 100%
|
||||||
|
flex: 1 1 auto
|
||||||
|
|
||||||
td
|
tbody tr:hover
|
||||||
color: $light-gray
|
background: $header-background-color
|
||||||
padding: 10px
|
|
||||||
font-size: 11px
|
th
|
||||||
font-weight: 600
|
color: $blue-gray
|
||||||
padding-top: 5px
|
text-align: left
|
||||||
padding-bottom: 5px
|
padding: 10px
|
||||||
|
background: $main-background-color
|
||||||
|
font-size: 12px
|
||||||
|
|
||||||
|
tr
|
||||||
|
border-bottom-width: 1px
|
||||||
|
border-bottom-color: $data-background-color
|
||||||
|
border-bottom-style: solid
|
||||||
|
width: 100%
|
||||||
|
display: block
|
||||||
|
position: relative
|
||||||
|
display: table
|
||||||
|
table-layout: fixed
|
||||||
|
|
||||||
|
td
|
||||||
|
color: $light-gray
|
||||||
|
padding: 10px
|
||||||
|
font-size: 11px
|
||||||
|
font-weight: 600
|
||||||
|
padding-top: 5px
|
||||||
|
padding-bottom: 5px
|
||||||
|
|
||||||
.nowrap
|
.nowrap
|
||||||
white-space: nowrap
|
white-space: nowrap
|
||||||
|
|
||||||
.totalSelected
|
.totalSelected
|
||||||
font-size: 12px
|
font-size: 12px
|
||||||
color: $light-blue-color
|
color: $light-blue-color
|
||||||
font-weight: 700
|
font-weight: 700
|
||||||
|
|
||||||
|
.displayBlock
|
||||||
|
display: block
|
||||||
|
|
||||||
|
.filterInput
|
||||||
|
margin-bottom: 20px
|
||||||
|
|||||||
Reference in New Issue
Block a user