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

145 lines
5.6 KiB
Go

package linux
import (
"io/ioutil"
"reflect"
"strconv"
"strings"
)
type Snmp struct {
// Ip
IpForwarding uint64 `json:"ip_forwarding"`
IpDefaultTTL uint64 `json:"ip_default_ttl"`
IpInReceives uint64 `json:"ip_in_receives"`
IpInHdrErrors uint64 `json:"ip_in_hdr_errors"`
IpInAddrErrors uint64 `json:"ip_in_addr_errors"`
IpForwDatagrams uint64 `json:"ip_forw_datagrams"`
IpInUnknownProtos uint64 `json:"ip_in_unknown_protos"`
IpInDiscards uint64 `json:"ip_in_discards"`
IpInDelivers uint64 `json:"ip_in_delivers"`
IpOutRequests uint64 `json:"ip_out_requests"`
IpOutDiscards uint64 `json:"ip_out_discards"`
IpOutNoRoutes uint64 `json:"ip_out_no_routes"`
IpReasmTimeout uint64 `json:"ip_reasm_timeout"`
IpReasmReqds uint64 `json:"ip_reasm_reqds"`
IpReasmOKs uint64 `json:"ip_reasm_oks"`
IpReasmFails uint64 `json:"ip_reasm_fails"`
IpFragOKs uint64 `json:"ip_frag_oks"`
IpFragFails uint64 `json:"ip_frag_fails"`
IpFragCreates uint64 `json:"ip_frag_creates"`
// Icmp
IcmpInMsgs uint64 `json:"icmp_in_msgs"`
IcmpInErrors uint64 `json:"icmp_in_errors"`
IcmpInCsumErrors uint64 `json:"icmp_in_csum_errors"`
IcmpInDestUnreachs uint64 `json:"icmp_in_dest_unreachs"`
IcmpInTimeExcds uint64 `json:"icmp_in_time_excds"`
IcmpInParmProbs uint64 `json:"icmp_in_parm_probs"`
IcmpInSrcQuenchs uint64 `json:"icmp_in_src_quenchs"`
IcmpInRedirects uint64 `json:"icmp_in_redirects"`
IcmpInEchos uint64 `json:"icmp_in_echos"`
IcmpInEchoReps uint64 `json:"icmp_in_echo_reps"`
IcmpInTimestamps uint64 `json:"icmp_in_timestamps"`
IcmpInTimestampReps uint64 `json:"icmp_in_timestamp_reps"`
IcmpInAddrMasks uint64 `json:"icmp_in_addr_masks"`
IcmpInAddrMaskReps uint64 `json:"icmp_in_addr_mask_reps"`
IcmpOutMsgs uint64 `json:"icmp_out_msgs"`
IcmpOutErrors uint64 `json:"icmp_out_errors"`
IcmpOutDestUnreachs uint64 `json:"icmp_out_dest_unreachs"`
IcmpOutTimeExcds uint64 `json:"icmp_out_time_excds"`
IcmpOutParmProbs uint64 `json:"icmp_out_parm_probs"`
IcmpOutSrcQuenchs uint64 `json:"icmp_out_src_quenchs"`
IcmpOutRedirects uint64 `json:"icmp_out_redirects"`
IcmpOutEchos uint64 `json:"icmp_out_echos"`
IcmpOutEchoReps uint64 `json:"icmp_out_echo_reps"`
IcmpOutTimestamps uint64 `json:"icmp_out_timestamps"`
IcmpOutTimestampReps uint64 `json:"icmp_out_timestamp_reps"`
IcmpOutAddrMasks uint64 `json:"icmp_out_addr_masks"`
IcmpOutAddrMaskReps uint64 `json:"icmp_out_addr_mask_reps"`
// IcmpMsg
IcmpMsgInType0 uint64 `json:"icmpmsg_in_type0"`
IcmpMsgInType3 uint64 `json:"icmpmsg_in_type3"`
IcmpMsgInType5 uint64 `json:"icmpmsg_in_type5"`
IcmpMsgInType8 uint64 `json:"icmpmsg_in_type8"`
IcmpMsgInType11 uint64 `json:"icmpmsg_in_type11"`
IcmpMsgInType13 uint64 `json:"icmpmsg_in_type13"`
IcmpMsgOutType0 uint64 `json:"icmpmsg_out_type0"`
IcmpMsgOutType3 uint64 `json:"icmpmsg_out_type3"`
IcmpMsgOutType8 uint64 `json:"icmpmsg_out_type8"`
IcmpMsgOutType14 uint64 `json:"icmpmsg_out_type14"`
IcmpMsgOutType69 uint64 `json:"icmpmsg_out_type69"`
// TCP
TcpRtoAlgorithm uint64 `json:"tcp_rto_algorithm"`
TcpRtoMin uint64 `json:"tcp_rto_min"`
TcpRtoMax uint64 `json:"tcp_rto_max"`
TcpMaxConn uint64 `json:"tcp_max_conn"`
TcpActiveOpens uint64 `json:"tcp_active_opens"`
TcpPassiveOpens uint64 `json:"tcp_passive_opens"`
TcpAttemptFails uint64 `json:"tcp_attempt_fails"`
TcpEstabResets uint64 `json:"tcp_estab_resets"`
TcpCurrEstab uint64 `json:"tcp_curr_estab"`
TcpInSegs uint64 `json:"tcp_in_segs"`
TcpOutSegs uint64 `json:"tcp_out_segs"`
TcpRetransSegs uint64 `json:"tcp_retrans_segs"`
TcpInErrs uint64 `json:"tcp_in_errs"`
TcpOutRsts uint64 `json:"tcp_out_rsts"`
TcpInCsumErrors uint64 `json:"tcp_in_csum_errors"`
// UDP
UdpInDatagrams uint64 `json:"udp_in_datagrams"`
UdpNoPorts uint64 `json:"udp_no_ports"`
UdpInErrors uint64 `json:"udp_in_errors"`
UdpOutDatagrams uint64 `json:"udp_out_datagrams"`
UdpRcvbufErrors uint64 `json:"udp_rcvbuf_errors"`
UdpSndbufErrors uint64 `json:"udp_sndbuf_errors"`
UdpInCsumErrors uint64 `json:"udp_in_csum_errors"`
// UDPLite
UdpLiteInDatagrams uint64 `json:"udp_lite_in_datagrams"`
UdpLiteNoPorts uint64 `json:"udp_lite_no_ports"`
UdpLiteInErrors uint64 `json:"udp_lite_in_errors"`
UdpLiteOutDatagrams uint64 `json:"udp_lite_out_datagrams"`
UdpLiteRcvbufErrors uint64 `json:"udp_lite_rcvbuf_errors"`
UdpLiteSndbufErrors uint64 `json:"udp_lite_sndbuf_errors"`
UdpLiteInCsumErrors uint64 `json:"udp_lite_in_csum_errors"`
}
func ReadSnmp(path string) (*Snmp, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
lines := strings.Split(string(data), "\n")
// Maps an SNMP metric to its value (i.e. SyncookiesSent --> 0)
statMap := make(map[string]string)
// patterns
// Ip: Forwarding DefaultTTL InReceives InHdrErrors... <-- header
// Ip: 2 64 9305753793 0 0 0 0 0... <-- 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:])
protocol := strings.Replace(strings.Fields(lines[i-1])[0], ":", "", -1)
for j, header := range headers {
statMap[protocol+header] = values[j]
}
}
var snmp Snmp = Snmp{}
elem := reflect.ValueOf(&snmp).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 &snmp, nil
}