1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
2018-11-12 01:30:24 -08:00

175 lines
8.1 KiB
Go

package linux
import (
"io/ioutil"
"reflect"
"strconv"
"strings"
)
type NetStat struct {
// TcpExt
SyncookiesSent uint64 `json:"syncookie_sent"`
SyncookiesRecv uint64 `json:"syncookies_recv"`
SyncookiesFailed uint64 `json:"syncookies_failed"`
EmbryonicRsts uint64 `json:"embryonic_rsts"`
PruneCalled uint64 `json:"prune_called"`
RcvPruned uint64 `json:"rcv_pruned"`
OfoPruned uint64 `json:"ofo_pruned"`
OutOfWindowIcmps uint64 `json:"out_of_window_icmps"`
LockDroppedIcmps uint64 `json:"lock_dropped_icmps"`
ArpFilter uint64 `json:"arp_filter"`
TW uint64 `json:"tw"`
TWRecycled uint64 `json:"tw_recycled"`
TWKilled uint64 `json:"tw_killed"`
PAWSPassive uint64 `json:"paws_passive"`
PAWSActive uint64 `json:"paws_active"`
PAWSEstab uint64 `json:"paws_estab"`
DelayedACKs uint64 `json:"delayed_acks"`
DelayedACKLocked uint64 `json:"delayed_ack_locked"`
DelayedACKLost uint64 `json:"delayed_ack_lost"`
ListenOverflows uint64 `json:"listen_overflows"`
ListenDrops uint64 `json:"listen_drops"`
TCPPrequeued uint64 `json:"tcp_prequeued"`
TCPDirectCopyFromBacklog uint64 `json:"tcp_direct_copy_from_backlog"`
TCPDirectCopyFromPrequeue uint64 `json:"tcp_direct_copy_from_prequeue"`
TCPPrequeueDropped uint64 `json:"tcp_prequeue_dropped"`
TCPHPHits uint64 `json:"tcp_hp_hits"`
TCPHPHitsToUser uint64 `json:"tcp_hp_hits_to_user"`
TCPPureAcks uint64 `json:"tcp_pure_acks"`
TCPHPAcks uint64 `json:"tcp_hp_acks"`
TCPRenoRecovery uint64 `json:"tcp_reno_recovery"`
TCPSackRecovery uint64 `json:"tcp_sack_recovery"`
TCPSACKReneging uint64 `json:"tcp_sack_reneging"`
TCPFACKReorder uint64 `json:"tcp_fack_reorder"`
TCPSACKReorder uint64 `json:"tcp_sack_reorder"`
TCPRenoReorder uint64 `json:"tcp_reno_reorder"`
TCPTSReorder uint64 `json:"tcp_ts_reorder"`
TCPFullUndo uint64 `json:"tcp_full_undo"`
TCPPartialUndo uint64 `json:"tcp_partial_undo"`
TCPDSACKUndo uint64 `json:"tcp_dsack_undo"`
TCPLossUndo uint64 `json:"tcp_loss_undo"`
TCPLoss uint64 `json:"tcp_loss"`
TCPLostRetransmit uint64 `json:"tcp_lost_retransmit"`
TCPRenoFailures uint64 `json:"tcp_reno_failures"`
TCPSackFailures uint64 `json:"tcp_sack_failures"`
TCPLossFailures uint64 `json:"tcp_loss_failures"`
TCPFastRetrans uint64 `json:"tcp_fast_retrans"`
TCPForwardRetrans uint64 `json:"tcp_forward_retrans"`
TCPSlowStartRetrans uint64 `json:"tcp_slow_start_retrans"`
TCPTimeouts uint64 `json:"tcp_timeouts"`
TCPLossProbes uint64 `json:"tcp_loss_probes"`
TCPLossProbeRecovery uint64 `json:"tcp_loss_probe_recovery"`
TCPRenoRecoveryFail uint64 `json:"tcp_reno_recovery_fail"`
TCPSackRecoveryFail uint64 `json:"tcp_sack_recovery_fail"`
TCPSchedulerFailed uint64 `json:"tcp_scheduler_failed"`
TCPRcvCollapsed uint64 `json:"tcp_rcv_collapsed"`
TCPDSACKOldSent uint64 `json:"tcp_dsack_old_sent"`
TCPDSACKOfoSent uint64 `json:"tcp_dsack_ofo_sent"`
TCPDSACKRecv uint64 `json:"tcp_dsack_recv"`
TCPDSACKOfoRecv uint64 `json:"tcp_dsack_ofo_recv"`
TCPAbortOnSyn uint64 `json:"tcp_abort_on_syn"`
TCPAbortOnData uint64 `json:"tcp_abort_on_data"`
TCPAbortOnClose uint64 `json:"tcp_abort_on_close"`
TCPAbortOnMemory uint64 `json:"tcp_abort_on_memory"`
TCPAbortOnTimeout uint64 `json:"tcp_abort_on_timeout"`
TCPAbortOnLinger uint64 `json:"tcp_abort_on_linger"`
TCPAbortFailed uint64 `json:"tcp_abort_failed"`
TCPMemoryPressures uint64 `json:"tcp_memory_pressures"`
TCPSACKDiscard uint64 `json:"tcp_sack_discard"`
TCPDSACKIgnoredOld uint64 `json:"tcp_dsack_ignored_old"`
TCPDSACKIgnoredNoUndo uint64 `json:"tcp_dsack_ignored_no_undo"`
TCPSpuriousRTOs uint64 `json:"tcp_spurious_rtos"`
TCPMD5NotFound uint64 `json:"tcp_md5_not_found"`
TCPMD5Unexpected uint64 `json:"tcp_md5_unexpected"`
TCPSackShifted uint64 `json:"tcp_sack_shifted"`
TCPSackMerged uint64 `json:"tcp_sack_merged"`
TCPSackShiftFallback uint64 `json:"tcp_sack_shift_fallback"`
TCPBacklogDrop uint64 `json:"tcp_backlog_drop"`
TCPMinTTLDrop uint64 `json:"tcp_min_ttl_drop"`
TCPDeferAcceptDrop uint64 `json:"tcp_defer_accept_drop"`
IPReversePathFilter uint64 `json:"ip_reverse_path_filter"`
TCPTimeWaitOverflow uint64 `json:"tcp_time_wait_overflow"`
TCPReqQFullDoCookies uint64 `json:"tcp_req_q_full_do_cookies"`
TCPReqQFullDrop uint64 `json:"tcp_req_q_full_drop"`
TCPRetransFail uint64 `json:"tcp_retrans_fail"`
TCPRcvCoalesce uint64 `json:"tcp_rcv_coalesce"`
TCPOFOQueue uint64 `json:"tcp_ofo_drop"`
TCPOFODrop uint64 `json:"tcp_ofo_drop"`
TCPOFOMerge uint64 `json:"tcp_ofo_merge"`
TCPChallengeACK uint64 `json:"tcp_challenge_ack"`
TCPSYNChallenge uint64 `json:"tcp_syn_challenge"`
TCPFastOpenActive uint64 `json:"tcp_fast_open_active"`
TCPFastOpenActiveFail uint64 `json:"tcp_fast_open_active_fail"`
TCPFastOpenPassive uint64 `json:"tcp_fast_open_passive"`
TCPFastOpenPassiveFail uint64 `json:"tcp_fast_open_passive_fail"`
TCPFastOpenListenOverflow uint64 `json:"tcp_fast_open_listen_overflow"`
TCPFastOpenCookieReqd uint64 `json:"tcp_fast_open_cookie_reqd"`
TCPSpuriousRtxHostQueues uint64 `json:"tcp_spurious_rtx_host_queues"`
BusyPollRxPackets uint64 `json:"busy_poll_rx_packets"`
TCPAutoCorking uint64 `json:"tcp_auto_corking"`
TCPFromZeroWindowAdv uint64 `json:"tcp_from_zero_window_adv"`
TCPToZeroWindowAdv uint64 `json:"tcp_to_zero_window_adv"`
TCPWantZeroWindowAdv uint64 `json:"tcp_want_zero_window_adv"`
TCPSynRetrans uint64 `json:"tcp_syn_retrans"`
TCPOrigDataSent uint64 `json:"tcp_orig_data_sent"`
// IpExt
InNoRoutes uint64 `json:"in_no_routes"`
InTruncatedPkts uint64 `json:"in_truncated_pkts"`
InMcastPkts uint64 `json:"in_mcast_pkts"`
OutMcastPkts uint64 `json:"out_mcast_pkts"`
InBcastPkts uint64 `json:"in_bcast_pkts"`
OutBcastPkts uint64 `json:"out_bcast_pkts"`
InOctets uint64 `json:"in_octets"`
OutOctets uint64 `json:"out_octets"`
InMcastOctets uint64 `json:"in_mcast_octets"`
OutMcastOctets uint64 `json:"out_mcast_octets"`
InBcastOctets uint64 `json:"in_bcast_octets"`
OutBcastOctets uint64 `json:"out_bcast_octets"`
InCsumErrors uint64 `json:"in_csum_errors"`
InNoECTPkts uint64 `json:"in_no_ect_pkts"`
InECT1Pkts uint64 `json:"in_ect1_pkts"`
InECT0Pkts uint64 `json:"in_ect0_pkts"`
InCEPkts uint64 `json:"in_ce_pkts"`
}
func ReadNetStat(path string) (*NetStat, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
lines := strings.Split(string(data), "\n")
// Maps a netstat metric to its value (i.e. SyncookiesSent --> 0)
statMap := make(map[string]string)
// patterns
// TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed... <-- header
// TcpExt: 0 0 1764... <-- values
for i := 1; i < len(lines); i = i + 2 {
headers := strings.Fields(lines[i-1][strings.Index(lines[i-1], ":")+1:])
values := strings.Fields(lines[i][strings.Index(lines[i], ":")+1:])
for j, header := range headers {
statMap[header] = values[j]
}
}
var netstat NetStat = NetStat{}
elem := reflect.ValueOf(&netstat).Elem()
typeOfElem := elem.Type()
for i := 0; i < elem.NumField(); i++ {
if val, ok := statMap[typeOfElem.Field(i).Name]; ok {
parsedVal, _ := strconv.ParseUint(val, 10, 64)
elem.Field(i).SetUint(parsedVal)
}
}
return &netstat, nil
}