"""
snmpd parser
============
Parsers provided by this module are:
TcpIpStats - file ``/proc/net/snmp``
------------------------------------
The ``TcpIpStats`` class implements the parsing of ``/proc/net/snmp``
file, which contains TCP/IP stats of individual layer.
TcpIpStatsIPV6 - file ``/proc/net/snmp6``
-----------------------------------------
The ``TcpIpStatsIPV6`` class implements the parsing of ``/proc/net/snmp6``
file, which contains TCP/IP stats of individual layer.
SnmpdConf - file ``/etc/snmp/snmpd.conf``
-----------------------------------------
The ``SnmpdConf`` class implements the parsing of ``/etc/snmp/snmpd.conf``
file, which is the configuration file for the Net-SNMP SNMP agent.
"""
from insights.core import LegacyItemAccess, Parser
from insights.core.exceptions import ParseException
from insights.core.plugins import parser
from insights.parsers import get_active_lines
from insights.specs import Specs
[docs]
@parser(Specs.proc_snmp_ipv4)
class TcpIpStats(Parser, LegacyItemAccess):
"""
Parser for ``/proc/net/snmp`` file.
Sample input is provided in the *Examples*.
Examples:
>>> SNMP_CONTENT = '''
... Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
... Ip: 2 64 43767 0 0 0 0 0 41807 18407 12 73 0 0 0 10 0 0 0
... Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps
... Icmp: 34 0 0 34 0 0 0 0 0 0 0 0 0 0 44 0 44 0 0 0 0 0 0 0 0 0 0
... IcmpMsg: InType3 OutType3
... IcmpMsg: 34 44
... Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts InCsumErrors
... Tcp: 1 200 120000 -1 444 0 0 6 7 19269 17050 5 4 234 0
... Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
... Udp: 18905 34 0 1348 0 0 0 3565
... UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
... UdpLite: 0 0 0 0 0 0 0 0
... '''.strip()
>>> type(proc_snmp_ipv4)
<class 'insights.parsers.snmp.TcpIpStats'>
>>> snmp_stats = proc_snmp_ipv4.get("Ip")
>>> snmp_stats["DefaultTTL"]
64
>>> snmp_stats = proc_snmp_ipv4.get("Udp")
>>> snmp_stats["InDatagrams"]
18905
Resultant Data::
{
'Ip':
{
'FragCreates': 0,
'ReasmFails': 10,
'Forwarding': 2,
'ReasmOKs': 0,
'ReasmReqds': 0,
'ReasmTimeout': 0,
...
...
},
'Icmp':
{
'InRedirects': 0,
'InMsgs': 34,
'InSrcQuenchs': 0,
...
...
}
...
...
}
"""
[docs]
def parse_content(self, content):
snmp_stats = {}
data_id = []
for line in content:
line_split = line.split()
if line_split[1].isdigit():
snmp_stats[line_split[0].replace(":", "")] = dict(zip(data_id, map(int, line_split[1:])))
else:
data_id = line_split[1:]
self.data = snmp_stats
[docs]
@parser(Specs.proc_snmp_ipv6)
class TcpIpStatsIPV6(Parser, LegacyItemAccess):
"""
Parser for ``/proc/net/snmp6`` file.
Sample input is provided in the *Examples*.
Examples:
>>> SNMP_CONTENT = '''
... Ip6InReceives 757
... Ip6InHdrErrors 0
... Ip6InTooBigErrors 0
... Ip6InNoRoutes 0
... Ip6InAddrErrors 0
... Ip6InDiscards 10
... Ip6OutForwDatagrams 0
... Ip6OutDiscards 0
... Ip6OutNoRoutes 0
... Ip6InOctets 579410
... Icmp6OutErrors 0
... Icmp6InCsumErrors 0
... '''.strip()
>>> type(proc_snmp_ipv6)
<class 'insights.parsers.snmp.TcpIpStatsIPV6'>
>>> IP6_RX_stats = proc_snmp_ipv6.get("Ip6InReceives")
>>> IP6_RX_stats
757
>>> IP6_In_Disc = proc_snmp_ipv6.get("Ip6InDiscards")
>>> IP6_In_Disc
10
Resultant Data::
{
'Ip6InReceives': 757,
'Ip6InHdrErrors': 0,
'Ip6InTooBigErrors': 0,
'Ip6InNoRoutes': 0,
'Ip6InAddrErrors': 0,
'Ip6InDiscards': 10,
...
...
}
"""
[docs]
def parse_content(self, content):
snmp6_stats = {}
for line in content:
line_split = line.split()
snmp6_stats[line_split[0]] = int(line_split[1]) if len(line_split) > 1 and line_split[1] else None
self.data = snmp6_stats
[docs]
@parser(Specs.snmpd_conf)
class SnmpdConf(Parser, dict):
"""
Class for parsing the file ``/etc/snmp/snmpd.conf``
Sample file content::
# sec.name source community
com2sec notConfigUser default public
# groupName securityModel securityName
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
# Make at least snmpwalk -v 1 localhost -c public system fast again.
# name incl/excl subtree mask(optional)
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1
# group context sec.model sec.level prefix read write notif
access notConfigGroup "" any noauth exact systemview none none
dontLogTCPWrappersConnects yes
include_ifmib_iface_prefix eth enp1s0
Examples:
>>> type(snmpd_conf)
<class 'insights.parsers.snmp.SnmpdConf'>
>>> snmpd_conf['dontLogTCPWrappersConnects']
['yes']
>>> snmpd_conf['include_ifmib_iface_prefix']
['eth enp1s0']
"""
[docs]
def parse_content(self, content):
content = get_active_lines(content)
if not content:
raise ParseException('Empty Content')
for line in content:
parts = line.split(None, 1)
key = parts[0].strip()
self.setdefault(key, [])
if len(parts) > 1:
value = parts[1].strip()
self[key].append(value)