1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-07-13 01:20:24 +02:00

add proc-net-netstat parser and tests

This commit is contained in:
Kelly Brazil
2022-09-25 20:00:44 -07:00
parent ab3dc41358
commit 4a103927cd
6 changed files with 756 additions and 0 deletions

View File

@ -0,0 +1,324 @@
[Home](https://kellyjonbrazil.github.io/jc/)
<a id="jc.parsers.proc_net_netstat"></a>
# jc.parsers.proc\_net\_netstat
jc - JSON Convert `/proc/net/netstat` file parser
Usage (cli):
$ cat /proc/net/netstat | jc --proc
or
$ jc /proc/net/netstat
or
$ cat /proc/net/netstat | jc --proc-net-netstat
Usage (module):
import jc
result = jc.parse('proc', proc_net_netstat_file)
or
import jc
result = jc.parse('proc_net_netstat', proc_net_netstat_file)
Schema:
All values except "type" are integers
[
{
"type": string,
"<key>": integer
}
]
Examples:
$ cat /proc/net/netstat | jc --proc -p
[
{
"SyncookiesSent": 0,
"SyncookiesRecv": 0,
"SyncookiesFailed": 0,
"EmbryonicRsts": 0,
"PruneCalled": 0,
"RcvPruned": 0,
"OfoPruned": 0,
"OutOfWindowIcmps": 0,
"LockDroppedIcmps": 0,
"ArpFilter": 0,
"TW": 3,
"TWRecycled": 0,
"TWKilled": 0,
"PAWSActive": 0,
"PAWSEstab": 0,
"DelayedACKs": 10,
"DelayedACKLocked": 53,
"DelayedACKLost": 0,
"ListenOverflows": 0,
"ListenDrops": 0,
"TCPHPHits": 2387,
"TCPPureAcks": 12711,
"TCPHPAcks": 53535,
"TCPRenoRecovery": 0,
"TCPSackRecovery": 0,
"TCPSACKReneging": 0,
"TCPSACKReorder": 0,
"TCPRenoReorder": 0,
"TCPTSReorder": 0,
"TCPFullUndo": 0,
"TCPPartialUndo": 0,
"TCPDSACKUndo": 0,
"TCPLossUndo": 0,
"TCPLostRetransmit": 0,
"TCPRenoFailures": 0,
"TCPSackFailures": 0,
"TCPLossFailures": 0,
"TCPFastRetrans": 0,
"TCPSlowStartRetrans": 0,
"TCPTimeouts": 0,
"TCPLossProbes": 0,
"TCPLossProbeRecovery": 0,
"TCPRenoRecoveryFail": 0,
"TCPSackRecoveryFail": 0,
"TCPRcvCollapsed": 0,
"TCPBacklogCoalesce": 2883,
"TCPDSACKOldSent": 0,
"TCPDSACKOfoSent": 0,
"TCPDSACKRecv": 0,
"TCPDSACKOfoRecv": 0,
"TCPAbortOnData": 0,
"TCPAbortOnClose": 1,
"TCPAbortOnMemory": 0,
"TCPAbortOnTimeout": 0,
"TCPAbortOnLinger": 0,
"TCPAbortFailed": 0,
"TCPMemoryPressures": 0,
"TCPMemoryPressuresChrono": 0,
"TCPSACKDiscard": 0,
"TCPDSACKIgnoredOld": 0,
"TCPDSACKIgnoredNoUndo": 0,
"TCPSpuriousRTOs": 0,
"TCPMD5NotFound": 0,
"TCPMD5Unexpected": 0,
"TCPMD5Failure": 0,
"TCPSackShifted": 0,
"TCPSackMerged": 0,
"TCPSackShiftFallback": 0,
"TCPBacklogDrop": 0,
"PFMemallocDrop": 0,
"TCPMinTTLDrop": 0,
"TCPDeferAcceptDrop": 0,
"IPReversePathFilter": 0,
"TCPTimeWaitOverflow": 0,
"TCPReqQFullDoCookies": 0,
"TCPReqQFullDrop": 0,
"TCPRetransFail": 0,
"TCPRcvCoalesce": 151,
"TCPOFOQueue": 0,
"TCPOFODrop": 0,
"TCPOFOMerge": 0,
"TCPChallengeACK": 0,
"TCPSYNChallenge": 0,
"TCPFastOpenActive": 0,
"TCPFastOpenActiveFail": 0,
"TCPFastOpenPassive": 0,
"TCPFastOpenPassiveFail": 0,
"TCPFastOpenListenOverflow": 0,
"TCPFastOpenCookieReqd": 0,
"TCPFastOpenBlackhole": 0,
"TCPSpuriousRtxHostQueues": 0,
"BusyPollRxPackets": 0,
"TCPAutoCorking": 28376,
"TCPFromZeroWindowAdv": 0,
"TCPToZeroWindowAdv": 0,
"TCPWantZeroWindowAdv": 0,
"TCPSynRetrans": 0,
"TCPOrigDataSent": 119438,
"TCPHystartTrainDetect": 3,
"TCPHystartTrainCwnd": 60,
"TCPHystartDelayDetect": 0,
"TCPHystartDelayCwnd": 0,
"TCPACKSkippedSynRecv": 0,
"TCPACKSkippedPAWS": 0,
"TCPACKSkippedSeq": 0,
"TCPACKSkippedFinWait2": 0,
"TCPACKSkippedTimeWait": 0,
"TCPACKSkippedChallenge": 0,
"TCPWinProbe": 0,
"TCPKeepAlive": 6,
"TCPMTUPFail": 0,
"TCPMTUPSuccess": 0,
"TCPDelivered": 119453,
"TCPDeliveredCE": 0,
"TCPAckCompressed": 0,
"TCPZeroWindowDrop": 0,
"TCPRcvQDrop": 0,
"TCPWqueueTooBig": 0,
"TCPFastOpenPassiveAltKey": 0,
"TcpTimeoutRehash": 0,
"TcpDuplicateDataRehash": 0,
"type": "TcpExt"
},
...
]
$ cat /proc/net/netstat | jc --proc -p -r
[
{
"SyncookiesSent": "0",
"SyncookiesRecv": "0",
"SyncookiesFailed": "0",
"EmbryonicRsts": "0",
"PruneCalled": "0",
"RcvPruned": "0",
"OfoPruned": "0",
"OutOfWindowIcmps": "0",
"LockDroppedIcmps": "0",
"ArpFilter": "0",
"TW": "3",
"TWRecycled": "0",
"TWKilled": "0",
"PAWSActive": "0",
"PAWSEstab": "0",
"DelayedACKs": "10",
"DelayedACKLocked": "53",
"DelayedACKLost": "0",
"ListenOverflows": "0",
"ListenDrops": "0",
"TCPHPHits": "2387",
"TCPPureAcks": "12711",
"TCPHPAcks": "53535",
"TCPRenoRecovery": "0",
"TCPSackRecovery": "0",
"TCPSACKReneging": "0",
"TCPSACKReorder": "0",
"TCPRenoReorder": "0",
"TCPTSReorder": "0",
"TCPFullUndo": "0",
"TCPPartialUndo": "0",
"TCPDSACKUndo": "0",
"TCPLossUndo": "0",
"TCPLostRetransmit": "0",
"TCPRenoFailures": "0",
"TCPSackFailures": "0",
"TCPLossFailures": "0",
"TCPFastRetrans": "0",
"TCPSlowStartRetrans": "0",
"TCPTimeouts": "0",
"TCPLossProbes": "0",
"TCPLossProbeRecovery": "0",
"TCPRenoRecoveryFail": "0",
"TCPSackRecoveryFail": "0",
"TCPRcvCollapsed": "0",
"TCPBacklogCoalesce": "2883",
"TCPDSACKOldSent": "0",
"TCPDSACKOfoSent": "0",
"TCPDSACKRecv": "0",
"TCPDSACKOfoRecv": "0",
"TCPAbortOnData": "0",
"TCPAbortOnClose": "1",
"TCPAbortOnMemory": "0",
"TCPAbortOnTimeout": "0",
"TCPAbortOnLinger": "0",
"TCPAbortFailed": "0",
"TCPMemoryPressures": "0",
"TCPMemoryPressuresChrono": "0",
"TCPSACKDiscard": "0",
"TCPDSACKIgnoredOld": "0",
"TCPDSACKIgnoredNoUndo": "0",
"TCPSpuriousRTOs": "0",
"TCPMD5NotFound": "0",
"TCPMD5Unexpected": "0",
"TCPMD5Failure": "0",
"TCPSackShifted": "0",
"TCPSackMerged": "0",
"TCPSackShiftFallback": "0",
"TCPBacklogDrop": "0",
"PFMemallocDrop": "0",
"TCPMinTTLDrop": "0",
"TCPDeferAcceptDrop": "0",
"IPReversePathFilter": "0",
"TCPTimeWaitOverflow": "0",
"TCPReqQFullDoCookies": "0",
"TCPReqQFullDrop": "0",
"TCPRetransFail": "0",
"TCPRcvCoalesce": "151",
"TCPOFOQueue": "0",
"TCPOFODrop": "0",
"TCPOFOMerge": "0",
"TCPChallengeACK": "0",
"TCPSYNChallenge": "0",
"TCPFastOpenActive": "0",
"TCPFastOpenActiveFail": "0",
"TCPFastOpenPassive": "0",
"TCPFastOpenPassiveFail": "0",
"TCPFastOpenListenOverflow": "0",
"TCPFastOpenCookieReqd": "0",
"TCPFastOpenBlackhole": "0",
"TCPSpuriousRtxHostQueues": "0",
"BusyPollRxPackets": "0",
"TCPAutoCorking": "28376",
"TCPFromZeroWindowAdv": "0",
"TCPToZeroWindowAdv": "0",
"TCPWantZeroWindowAdv": "0",
"TCPSynRetrans": "0",
"TCPOrigDataSent": "119438",
"TCPHystartTrainDetect": "3",
"TCPHystartTrainCwnd": "60",
"TCPHystartDelayDetect": "0",
"TCPHystartDelayCwnd": "0",
"TCPACKSkippedSynRecv": "0",
"TCPACKSkippedPAWS": "0",
"TCPACKSkippedSeq": "0",
"TCPACKSkippedFinWait2": "0",
"TCPACKSkippedTimeWait": "0",
"TCPACKSkippedChallenge": "0",
"TCPWinProbe": "0",
"TCPKeepAlive": "6",
"TCPMTUPFail": "0",
"TCPMTUPSuccess": "0",
"TCPDelivered": "119453",
"TCPDeliveredCE": "0",
"TCPAckCompressed": "0",
"TCPZeroWindowDrop": "0",
"TCPRcvQDrop": "0",
"TCPWqueueTooBig": "0",
"TCPFastOpenPassiveAltKey": "0",
"TcpTimeoutRehash": "0",
"TcpDuplicateDataRehash": "0",
"type": "TcpExt"
},
...
]
<a id="jc.parsers.proc_net_netstat.parse"></a>
### parse
```python
def parse(data: str, raw: bool = False, quiet: bool = False) -> List[Dict]
```
Main text parsing function
Parameters:
data: (string) text data to parse
raw: (boolean) unprocessed output if True
quiet: (boolean) suppress warning messages if True
Returns:
List of Dictionaries. Raw or processed structured data.
### Parser Information
Compatibility: linux
Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)

View File

@ -129,6 +129,7 @@ parsers = [
'proc-net-igmp6', 'proc-net-igmp6',
'proc-net-ipv6-route', 'proc-net-ipv6-route',
'proc-net-netlink', 'proc-net-netlink',
'proc-net-netstat',
'ps', 'ps',
'route', 'route',
'rpm-qi', 'rpm-qi',

View File

@ -0,0 +1,381 @@
"""jc - JSON Convert `/proc/net/netstat` file parser
Usage (cli):
$ cat /proc/net/netstat | jc --proc
or
$ jc /proc/net/netstat
or
$ cat /proc/net/netstat | jc --proc-net-netstat
Usage (module):
import jc
result = jc.parse('proc', proc_net_netstat_file)
or
import jc
result = jc.parse('proc_net_netstat', proc_net_netstat_file)
Schema:
All values except "type" are integers
[
{
"type": string,
"<key>": integer
}
]
Examples:
$ cat /proc/net/netstat | jc --proc -p
[
{
"SyncookiesSent": 0,
"SyncookiesRecv": 0,
"SyncookiesFailed": 0,
"EmbryonicRsts": 0,
"PruneCalled": 0,
"RcvPruned": 0,
"OfoPruned": 0,
"OutOfWindowIcmps": 0,
"LockDroppedIcmps": 0,
"ArpFilter": 0,
"TW": 3,
"TWRecycled": 0,
"TWKilled": 0,
"PAWSActive": 0,
"PAWSEstab": 0,
"DelayedACKs": 10,
"DelayedACKLocked": 53,
"DelayedACKLost": 0,
"ListenOverflows": 0,
"ListenDrops": 0,
"TCPHPHits": 2387,
"TCPPureAcks": 12711,
"TCPHPAcks": 53535,
"TCPRenoRecovery": 0,
"TCPSackRecovery": 0,
"TCPSACKReneging": 0,
"TCPSACKReorder": 0,
"TCPRenoReorder": 0,
"TCPTSReorder": 0,
"TCPFullUndo": 0,
"TCPPartialUndo": 0,
"TCPDSACKUndo": 0,
"TCPLossUndo": 0,
"TCPLostRetransmit": 0,
"TCPRenoFailures": 0,
"TCPSackFailures": 0,
"TCPLossFailures": 0,
"TCPFastRetrans": 0,
"TCPSlowStartRetrans": 0,
"TCPTimeouts": 0,
"TCPLossProbes": 0,
"TCPLossProbeRecovery": 0,
"TCPRenoRecoveryFail": 0,
"TCPSackRecoveryFail": 0,
"TCPRcvCollapsed": 0,
"TCPBacklogCoalesce": 2883,
"TCPDSACKOldSent": 0,
"TCPDSACKOfoSent": 0,
"TCPDSACKRecv": 0,
"TCPDSACKOfoRecv": 0,
"TCPAbortOnData": 0,
"TCPAbortOnClose": 1,
"TCPAbortOnMemory": 0,
"TCPAbortOnTimeout": 0,
"TCPAbortOnLinger": 0,
"TCPAbortFailed": 0,
"TCPMemoryPressures": 0,
"TCPMemoryPressuresChrono": 0,
"TCPSACKDiscard": 0,
"TCPDSACKIgnoredOld": 0,
"TCPDSACKIgnoredNoUndo": 0,
"TCPSpuriousRTOs": 0,
"TCPMD5NotFound": 0,
"TCPMD5Unexpected": 0,
"TCPMD5Failure": 0,
"TCPSackShifted": 0,
"TCPSackMerged": 0,
"TCPSackShiftFallback": 0,
"TCPBacklogDrop": 0,
"PFMemallocDrop": 0,
"TCPMinTTLDrop": 0,
"TCPDeferAcceptDrop": 0,
"IPReversePathFilter": 0,
"TCPTimeWaitOverflow": 0,
"TCPReqQFullDoCookies": 0,
"TCPReqQFullDrop": 0,
"TCPRetransFail": 0,
"TCPRcvCoalesce": 151,
"TCPOFOQueue": 0,
"TCPOFODrop": 0,
"TCPOFOMerge": 0,
"TCPChallengeACK": 0,
"TCPSYNChallenge": 0,
"TCPFastOpenActive": 0,
"TCPFastOpenActiveFail": 0,
"TCPFastOpenPassive": 0,
"TCPFastOpenPassiveFail": 0,
"TCPFastOpenListenOverflow": 0,
"TCPFastOpenCookieReqd": 0,
"TCPFastOpenBlackhole": 0,
"TCPSpuriousRtxHostQueues": 0,
"BusyPollRxPackets": 0,
"TCPAutoCorking": 28376,
"TCPFromZeroWindowAdv": 0,
"TCPToZeroWindowAdv": 0,
"TCPWantZeroWindowAdv": 0,
"TCPSynRetrans": 0,
"TCPOrigDataSent": 119438,
"TCPHystartTrainDetect": 3,
"TCPHystartTrainCwnd": 60,
"TCPHystartDelayDetect": 0,
"TCPHystartDelayCwnd": 0,
"TCPACKSkippedSynRecv": 0,
"TCPACKSkippedPAWS": 0,
"TCPACKSkippedSeq": 0,
"TCPACKSkippedFinWait2": 0,
"TCPACKSkippedTimeWait": 0,
"TCPACKSkippedChallenge": 0,
"TCPWinProbe": 0,
"TCPKeepAlive": 6,
"TCPMTUPFail": 0,
"TCPMTUPSuccess": 0,
"TCPDelivered": 119453,
"TCPDeliveredCE": 0,
"TCPAckCompressed": 0,
"TCPZeroWindowDrop": 0,
"TCPRcvQDrop": 0,
"TCPWqueueTooBig": 0,
"TCPFastOpenPassiveAltKey": 0,
"TcpTimeoutRehash": 0,
"TcpDuplicateDataRehash": 0,
"type": "TcpExt"
},
...
]
$ cat /proc/net/netstat | jc --proc -p -r
[
{
"SyncookiesSent": "0",
"SyncookiesRecv": "0",
"SyncookiesFailed": "0",
"EmbryonicRsts": "0",
"PruneCalled": "0",
"RcvPruned": "0",
"OfoPruned": "0",
"OutOfWindowIcmps": "0",
"LockDroppedIcmps": "0",
"ArpFilter": "0",
"TW": "3",
"TWRecycled": "0",
"TWKilled": "0",
"PAWSActive": "0",
"PAWSEstab": "0",
"DelayedACKs": "10",
"DelayedACKLocked": "53",
"DelayedACKLost": "0",
"ListenOverflows": "0",
"ListenDrops": "0",
"TCPHPHits": "2387",
"TCPPureAcks": "12711",
"TCPHPAcks": "53535",
"TCPRenoRecovery": "0",
"TCPSackRecovery": "0",
"TCPSACKReneging": "0",
"TCPSACKReorder": "0",
"TCPRenoReorder": "0",
"TCPTSReorder": "0",
"TCPFullUndo": "0",
"TCPPartialUndo": "0",
"TCPDSACKUndo": "0",
"TCPLossUndo": "0",
"TCPLostRetransmit": "0",
"TCPRenoFailures": "0",
"TCPSackFailures": "0",
"TCPLossFailures": "0",
"TCPFastRetrans": "0",
"TCPSlowStartRetrans": "0",
"TCPTimeouts": "0",
"TCPLossProbes": "0",
"TCPLossProbeRecovery": "0",
"TCPRenoRecoveryFail": "0",
"TCPSackRecoveryFail": "0",
"TCPRcvCollapsed": "0",
"TCPBacklogCoalesce": "2883",
"TCPDSACKOldSent": "0",
"TCPDSACKOfoSent": "0",
"TCPDSACKRecv": "0",
"TCPDSACKOfoRecv": "0",
"TCPAbortOnData": "0",
"TCPAbortOnClose": "1",
"TCPAbortOnMemory": "0",
"TCPAbortOnTimeout": "0",
"TCPAbortOnLinger": "0",
"TCPAbortFailed": "0",
"TCPMemoryPressures": "0",
"TCPMemoryPressuresChrono": "0",
"TCPSACKDiscard": "0",
"TCPDSACKIgnoredOld": "0",
"TCPDSACKIgnoredNoUndo": "0",
"TCPSpuriousRTOs": "0",
"TCPMD5NotFound": "0",
"TCPMD5Unexpected": "0",
"TCPMD5Failure": "0",
"TCPSackShifted": "0",
"TCPSackMerged": "0",
"TCPSackShiftFallback": "0",
"TCPBacklogDrop": "0",
"PFMemallocDrop": "0",
"TCPMinTTLDrop": "0",
"TCPDeferAcceptDrop": "0",
"IPReversePathFilter": "0",
"TCPTimeWaitOverflow": "0",
"TCPReqQFullDoCookies": "0",
"TCPReqQFullDrop": "0",
"TCPRetransFail": "0",
"TCPRcvCoalesce": "151",
"TCPOFOQueue": "0",
"TCPOFODrop": "0",
"TCPOFOMerge": "0",
"TCPChallengeACK": "0",
"TCPSYNChallenge": "0",
"TCPFastOpenActive": "0",
"TCPFastOpenActiveFail": "0",
"TCPFastOpenPassive": "0",
"TCPFastOpenPassiveFail": "0",
"TCPFastOpenListenOverflow": "0",
"TCPFastOpenCookieReqd": "0",
"TCPFastOpenBlackhole": "0",
"TCPSpuriousRtxHostQueues": "0",
"BusyPollRxPackets": "0",
"TCPAutoCorking": "28376",
"TCPFromZeroWindowAdv": "0",
"TCPToZeroWindowAdv": "0",
"TCPWantZeroWindowAdv": "0",
"TCPSynRetrans": "0",
"TCPOrigDataSent": "119438",
"TCPHystartTrainDetect": "3",
"TCPHystartTrainCwnd": "60",
"TCPHystartDelayDetect": "0",
"TCPHystartDelayCwnd": "0",
"TCPACKSkippedSynRecv": "0",
"TCPACKSkippedPAWS": "0",
"TCPACKSkippedSeq": "0",
"TCPACKSkippedFinWait2": "0",
"TCPACKSkippedTimeWait": "0",
"TCPACKSkippedChallenge": "0",
"TCPWinProbe": "0",
"TCPKeepAlive": "6",
"TCPMTUPFail": "0",
"TCPMTUPSuccess": "0",
"TCPDelivered": "119453",
"TCPDeliveredCE": "0",
"TCPAckCompressed": "0",
"TCPZeroWindowDrop": "0",
"TCPRcvQDrop": "0",
"TCPWqueueTooBig": "0",
"TCPFastOpenPassiveAltKey": "0",
"TcpTimeoutRehash": "0",
"TcpDuplicateDataRehash": "0",
"type": "TcpExt"
},
...
]
"""
from typing import List, Dict
import jc.utils
from jc.parsers.universal import simple_table_parse
class info():
"""Provides parser metadata (version, author, etc.)"""
version = '1.0'
description = '`/proc/net/netstat` file parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
compatible = ['linux']
hidden = True
__version__ = info.version
def _process(proc_data: List[Dict]) -> List[Dict]:
"""
Final processing to conform to the schema.
Parameters:
proc_data: (List of Dictionaries) raw structured data to process
Returns:
List of Dictionaries. Structured to conform to the schema.
"""
for item in proc_data:
for key, val in item.items():
if key != 'type':
item[key] = int(val)
return proc_data
def parse(
data: str,
raw: bool = False,
quiet: bool = False
) -> List[Dict]:
"""
Main text parsing function
Parameters:
data: (string) text data to parse
raw: (boolean) unprocessed output if True
quiet: (boolean) suppress warning messages if True
Returns:
List of Dictionaries. Raw or processed structured data.
"""
jc.utils.compatibility(__name__, info.compatible, quiet)
jc.utils.input_type_check(data)
raw_output: List = []
rows: List = []
this_row: str = ''
headers: str = ''
if jc.utils.has_data(data):
for line in filter(None, data.splitlines()):
row_name, header_data = line.split(':', maxsplit=1)
if row_name in rows:
# this is data
_, row_data = line.split(':', maxsplit=1)
data_table = headers + row_data
output_line = simple_table_parse(data_table.splitlines())
output_line[0]['type'] = this_row
raw_output.extend(output_line)
continue
else:
# this is a header row
rows.append(row_name)
this_row = row_name
headers = header_data + '\n'
continue
return raw_output if raw else _process(raw_output)

View File

@ -630,6 +630,11 @@ PLIST file parser
\fB--proc-net-netlink\fP \fB--proc-net-netlink\fP
`/proc/net/netlink` file parser `/proc/net/netlink` file parser
.TP
.B
\fB--proc-net-netstat\fP
`/proc/net/netstat` file parser
.TP .TP
.B .B
\fB--ps\fP \fB--ps\fP

View File

@ -0,0 +1 @@
[{"SyncookiesSent":0,"SyncookiesRecv":0,"SyncookiesFailed":0,"EmbryonicRsts":0,"PruneCalled":0,"RcvPruned":0,"OfoPruned":0,"OutOfWindowIcmps":0,"LockDroppedIcmps":0,"ArpFilter":0,"TW":3,"TWRecycled":0,"TWKilled":0,"PAWSActive":0,"PAWSEstab":0,"DelayedACKs":10,"DelayedACKLocked":53,"DelayedACKLost":0,"ListenOverflows":0,"ListenDrops":0,"TCPHPHits":2387,"TCPPureAcks":12711,"TCPHPAcks":53535,"TCPRenoRecovery":0,"TCPSackRecovery":0,"TCPSACKReneging":0,"TCPSACKReorder":0,"TCPRenoReorder":0,"TCPTSReorder":0,"TCPFullUndo":0,"TCPPartialUndo":0,"TCPDSACKUndo":0,"TCPLossUndo":0,"TCPLostRetransmit":0,"TCPRenoFailures":0,"TCPSackFailures":0,"TCPLossFailures":0,"TCPFastRetrans":0,"TCPSlowStartRetrans":0,"TCPTimeouts":0,"TCPLossProbes":0,"TCPLossProbeRecovery":0,"TCPRenoRecoveryFail":0,"TCPSackRecoveryFail":0,"TCPRcvCollapsed":0,"TCPBacklogCoalesce":2883,"TCPDSACKOldSent":0,"TCPDSACKOfoSent":0,"TCPDSACKRecv":0,"TCPDSACKOfoRecv":0,"TCPAbortOnData":0,"TCPAbortOnClose":1,"TCPAbortOnMemory":0,"TCPAbortOnTimeout":0,"TCPAbortOnLinger":0,"TCPAbortFailed":0,"TCPMemoryPressures":0,"TCPMemoryPressuresChrono":0,"TCPSACKDiscard":0,"TCPDSACKIgnoredOld":0,"TCPDSACKIgnoredNoUndo":0,"TCPSpuriousRTOs":0,"TCPMD5NotFound":0,"TCPMD5Unexpected":0,"TCPMD5Failure":0,"TCPSackShifted":0,"TCPSackMerged":0,"TCPSackShiftFallback":0,"TCPBacklogDrop":0,"PFMemallocDrop":0,"TCPMinTTLDrop":0,"TCPDeferAcceptDrop":0,"IPReversePathFilter":0,"TCPTimeWaitOverflow":0,"TCPReqQFullDoCookies":0,"TCPReqQFullDrop":0,"TCPRetransFail":0,"TCPRcvCoalesce":151,"TCPOFOQueue":0,"TCPOFODrop":0,"TCPOFOMerge":0,"TCPChallengeACK":0,"TCPSYNChallenge":0,"TCPFastOpenActive":0,"TCPFastOpenActiveFail":0,"TCPFastOpenPassive":0,"TCPFastOpenPassiveFail":0,"TCPFastOpenListenOverflow":0,"TCPFastOpenCookieReqd":0,"TCPFastOpenBlackhole":0,"TCPSpuriousRtxHostQueues":0,"BusyPollRxPackets":0,"TCPAutoCorking":28376,"TCPFromZeroWindowAdv":0,"TCPToZeroWindowAdv":0,"TCPWantZeroWindowAdv":0,"TCPSynRetrans":0,"TCPOrigDataSent":119438,"TCPHystartTrainDetect":3,"TCPHystartTrainCwnd":60,"TCPHystartDelayDetect":0,"TCPHystartDelayCwnd":0,"TCPACKSkippedSynRecv":0,"TCPACKSkippedPAWS":0,"TCPACKSkippedSeq":0,"TCPACKSkippedFinWait2":0,"TCPACKSkippedTimeWait":0,"TCPACKSkippedChallenge":0,"TCPWinProbe":0,"TCPKeepAlive":6,"TCPMTUPFail":0,"TCPMTUPSuccess":0,"TCPDelivered":119453,"TCPDeliveredCE":0,"TCPAckCompressed":0,"TCPZeroWindowDrop":0,"TCPRcvQDrop":0,"TCPWqueueTooBig":0,"TCPFastOpenPassiveAltKey":0,"TcpTimeoutRehash":0,"TcpDuplicateDataRehash":0,"type":"TcpExt"},{"InNoRoutes":0,"InTruncatedPkts":0,"InMcastPkts":0,"OutMcastPkts":0,"InBcastPkts":366,"OutBcastPkts":0,"InOctets":57734503,"OutOctets":42330709,"InMcastOctets":0,"OutMcastOctets":0,"InBcastOctets":31466,"OutBcastOctets":0,"InCsumErrors":0,"InNoECTPkts":106821,"InECT1Pkts":0,"InECT0Pkts":3273,"InCEPkts":0,"ReasmOverlaps":0,"type":"IpExt"},{"MPCapableSYNRX":0,"MPCapableACKRX":0,"MPCapableFallbackACK":0,"MPCapableFallbackSYNACK":0,"MPTCPRetrans":0,"MPJoinNoTokenFound":0,"MPJoinSynRx":0,"MPJoinSynAckRx":0,"MPJoinSynAckHMacFailure":0,"MPJoinAckRx":0,"MPJoinAckHMacFailure":0,"DSSNotMatching":0,"InfiniteMapRx":0,"type":"MPTcpExt"}]

View File

@ -0,0 +1,44 @@
import os
import unittest
import json
from typing import Dict
import jc.parsers.proc_net_netstat
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
class MyTests(unittest.TestCase):
f_in: Dict = {}
f_json: Dict = {}
@classmethod
def setUpClass(cls):
fixtures = {
'proc_net_netstat': (
'fixtures/linux-proc/net_netstat',
'fixtures/linux-proc/net_netstat.json')
}
for file, filepaths in fixtures.items():
with open(os.path.join(THIS_DIR, filepaths[0]), 'r', encoding='utf-8') as a, \
open(os.path.join(THIS_DIR, filepaths[1]), 'r', encoding='utf-8') as b:
cls.f_in[file] = a.read()
cls.f_json[file] = json.loads(b.read())
def test_proc_net_netstat_nodata(self):
"""
Test 'proc_net_netstat' with no data
"""
self.assertEqual(jc.parsers.proc_net_netstat.parse('', quiet=True), [])
def test_proc_net_netstat(self):
"""
Test '/proc/net/netstat'
"""
self.assertEqual(jc.parsers.proc_net_netstat.parse(self.f_in['proc_net_netstat'], quiet=True),
self.f_json['proc_net_netstat'])
if __name__ == '__main__':
unittest.main()