summaryrefslogtreecommitdiffstats
path: root/glances/snmp.py
diff options
context:
space:
mode:
authorAlessio Sergi <al3hex@gmail.com>2015-11-14 15:15:15 +0100
committerAlessio Sergi <al3hex@gmail.com>2015-11-14 15:15:15 +0100
commita271eaf8aea5513115f164473039237a757c69dc (patch)
treed46cd5c936e753eea844fd70643754a33e3a53cd /glances/snmp.py
parent4fb83d156c9501f41e2a77f0f36ec0cd5b151f5a (diff)
Move core at the top of the module tree
Remove 'glances_' prefix from filenames.
Diffstat (limited to 'glances/snmp.py')
-rw-r--r--glances/snmp.py133
1 files changed, 133 insertions, 0 deletions
diff --git a/glances/snmp.py b/glances/snmp.py
new file mode 100644
index 00000000..a9dc25a6
--- /dev/null
+++ b/glances/snmp.py
@@ -0,0 +1,133 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Glances.
+#
+# Copyright (C) 2015 Nicolargo <nicolas@nicolargo.com>
+#
+# Glances is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Glances is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import sys
+
+from glances.logger import logger
+
+# Import mandatory PySNMP lib
+try:
+ from pysnmp.entity.rfc3413.oneliner import cmdgen
+except ImportError:
+ logger.critical("PySNMP library not found. To install it: pip install pysnmp")
+ sys.exit(2)
+
+
+class GlancesSNMPClient(object):
+
+ """SNMP client class (based on pysnmp library)."""
+
+ def __init__(self, host='localhost', port=161, version='2c',
+ community='public', user='private', auth=''):
+
+ super(GlancesSNMPClient, self).__init__()
+ self.cmdGen = cmdgen.CommandGenerator()
+
+ self.version = version
+
+ self.host = host
+ self.port = port
+
+ self.community = community
+ self.user = user
+ self.auth = auth
+
+ def __buid_result(self, varBinds):
+ """Build the results."""
+ ret = {}
+ for name, val in varBinds:
+ if str(val) == '':
+ ret[name.prettyPrint()] = ''
+ else:
+ ret[name.prettyPrint()] = val.prettyPrint()
+ # In Python 3, prettyPrint() return 'b'linux'' instead of 'linux'
+ if ret[name.prettyPrint()].startswith('b\''):
+ ret[name.prettyPrint()] = ret[name.prettyPrint()][2:-1]
+ return ret
+
+ def __get_result__(self, errorIndication, errorStatus, errorIndex, varBinds):
+ """Put results in table."""
+ ret = {}
+ if not errorIndication or not errorStatus:
+ ret = self.__buid_result(varBinds)
+ return ret
+
+ def get_by_oid(self, *oid):
+ """SNMP simple request (list of OID).
+
+ One request per OID list.
+
+ * oid: oid list
+ > Return a dict
+ """
+ if self.version == '3':
+ errorIndication, errorStatus, errorIndex, varBinds = self.cmdGen.getCmd(
+ cmdgen.UsmUserData(self.user, self.auth),
+ cmdgen.UdpTransportTarget((self.host, self.port)),
+ *oid
+ )
+ else:
+ errorIndication, errorStatus, errorIndex, varBinds = self.cmdGen.getCmd(
+ cmdgen.CommunityData(self.community),
+ cmdgen.UdpTransportTarget((self.host, self.port)),
+ *oid
+ )
+ return self.__get_result__(errorIndication, errorStatus, errorIndex, varBinds)
+
+ def __bulk_result__(self, errorIndication, errorStatus, errorIndex, varBindTable):
+ ret = []
+ if not errorIndication or not errorStatus:
+ for varBindTableRow in varBindTable:
+ ret.append(self.__buid_result(varBindTableRow))
+ return ret
+
+ def getbulk_by_oid(self, non_repeaters, max_repetitions, *oid):
+ """SNMP getbulk request.
+
+ In contrast to snmpwalk, this information will typically be gathered in
+ a single transaction with the agent, rather than one transaction per
+ variable found.
+
+ * non_repeaters: This specifies the number of supplied variables that
+ should not be iterated over.
+ * max_repetitions: This specifies the maximum number of iterations over
+ the repeating variables.
+ * oid: oid list
+ > Return a list of dicts
+ """
+ if self.version.startswith('3'):
+ errorIndication, errorStatus, errorIndex, varBinds = self.cmdGen.getCmd(
+ cmdgen.UsmUserData(self.user, self.auth),
+ cmdgen.UdpTransportTarget((self.host, self.port)),
+ non_repeaters,
+ max_repetitions,
+ *oid
+ )
+ if self.version.startswith('2'):
+ errorIndication, errorStatus, errorIndex, varBindTable = self.cmdGen.bulkCmd(
+ cmdgen.CommunityData(self.community),
+ cmdgen.UdpTransportTarget((self.host, self.port)),
+ non_repeaters,
+ max_repetitions,
+ *oid
+ )
+ else:
+ # Bulk request are not available with SNMP version 1
+ return []
+ return self.__bulk_result__(errorIndication, errorStatus, errorIndex, varBindTable)