Aller au contenu

Librairie SNMP en LUA pour QuickApps


Lazer

Messages recommandés

Librairie SNMP v1 en LUA pour QuickApps sur HC3

 

 

 

Cette librairie est déjà utilisée dans mes QuickApps onduleur Eaton (partagée sur le forum), et Ubiquiti EdgeRouter (jamais partagée....)

 

En fait de librairie, il s'agit en réalité d'un fichier à inclure dans un QuickApp, et même plus spécifiquement d'une table au sens LUA du terme.

 

A la demande de @jjacques68, voici les 2 ou 3 trucs à savoir pour l'utiliser, comme toujours avec mes librairies, elles sont conçues pour être facilement réutilisables d'un QuickApp à l'autre. C'est là qu'on voit la force des fichiers dans les QuickApps :)

 

Seule la version 1 du protocole SNMP est supportée, donc trames en clair sur le réseau, pas de sécurité, etc. Pour ce qu'on en fait (usage en réseau local), c'est largement suffisant.

 

A l'exception de la fonction SNMP:configure() qui est synchrone et appelée une seule fois avant d'utiliser la librairie, les autres fonctions sont asynchrones, sur le même modèle de net.HTTPClient(), donc la suite de l'exécution se déroule dans les fonctions success() et error() données en paramètre de chaque fonction appelée :

  • SNMP:get()
  • SNMP:set()
  • SNMP:walk()
  • SNMP:sequence()

 

 

Initialisation

 

Avant d'utiliser la librairie, il faut l'initialiser avec la fonction SNMP:configure(), par exemple dans QuickApp:onInit() :

-- Ici les variables sont définies localement, mais idéalement ce sont des variables du QuickApp obtenues via self:getVariable()
local protocol = "udp"     -- paramètre obligatoire
local host = "192.168.1.1" -- paramètre obligatoire
local port = 161           -- paramètre obligatoire
local community = "public" -- paramètre obligatoire
local version = 1          -- paramètre obligatoire
local language = "en"      -- paramètre facultatif
local timeout = 5000       -- paramètre facultatif

-- Initialize SNMP library
local configured, SNMP_URL = SNMP:configure(protocol, host, port, community, version, language, 5000)
if configured then
	self:debug("SNMP library v" .. (SNMP._VERSION or SNMP.version or "???") , "successfully initialized")
else
	self:error("Error : Can't initialize SNMP library :", SNMP_URL or "<i>nil</i>")
	self:warning("QuickApp stopped")
	return
end

 

Note : on peut activer le mode debug de la librairie de la façon suivante, cela permet d'obtenir des traces très détaillées :

SNMP.isdebug = true

 

 

Lecture d'une valeur - "snmpget"

 

La fonction SNMP:get() permet de lire la valeur d'un OID donné.

L'OID peut être l'index numérique, ou bien un nom prédéfini.

Dans cet exemple, "SNMPv2-MIB::sysDescr.0" est strictement identique à ".1.3.6.1.2.1.1.1", mais en plus lisible :

local oid = "SNMPv2-MIB::sysDescr.0"

SNMP:get(oid, {
	success = function(response)
		if type(response) == "table" and response.errorStatus and response.errorStatus == 0 and response.value then
			self:debug("Value =", response.value)
		else
			self:error("Error : invalid SNMP response :", SNMP.ERROR_STATUS[response.errorStatus] or "???")
		end
	end,
	error = function(response)
		self:error("Error : SNMP get failed :", response or "???")
	end,
})

 

 

Modification d'une valeur - "snmpset"

 

La fonction SNMP:set() permet de modifier la valeur d'un OID donné :

Dans cet exemple on active le port n°5 du switch :

SNMP:set("IF-MIB::ifAdminStatus.5", 1, { -- Enable port 5
	success = function(response)
		if type(response) == "table" and response.errorStatus and response.errorStatus == 0 and response.value then
			self:debug("New value =", response.value)
		else
			self:error("Error : invalid SNMP response :", SNMP.ERROR_STATUS[response.errorStatus] or "???")
		end
	end,
	error = function(response)
		self:error("Error : SNMP set failed :", response or "???")
	end,
})

 

 

Parcours d'un arbre - "snmpwalk"

 

La fonction SNMP:walk() permet de parcourir un arbre à partir d'un OID donné.

Cet exemple liste tous les ports d'un switch/routeur :

SNMP:walk("IF-MIB::ifName", {
	success = function(snmp)
		for j = 1, #snmp do
			local oid = tools:split(snmp[j].oid, ".")
			local index = oid[#oid]
			self:debug("Found interface <b>" .. snmp[j].value .. "</b> with index <b>" .. index .. "</b>")
		end
	end,
	error = function(message)
		self:error("Error : can't get device interface list from router :", message)
	end,
})

 

 

Lecture de plusieurs valeurs

 

La fonction SNMP:sequence() permet de réaliser une série d'instructions (get...).

La différence avec le WALK, qui va parcourir toute une branche de façon récursive (et ramener potentiellement énormément de valeurs), la SEQUENCE permet d'aller chercher plusieurs valeurs à des adresses différentes, en une seule fois. C'est plus facile à écrire en LUA, et plus rapide à l'exécution.

Il faut donner en paramètre un tableau qui contient l'instruction à réaliser et l'OID. Les instructions seront réalisées dans l'ordre indiqué par l'index de chaque élément du tableau :

local instructions = {}
instructions[1] = {
	instruction = "get",
	oid = "SNMPv2-MIB::sysDescr.0",
}
instructions[2] = {
	instruction = "get",
	oid = "SNMPv2-MIB::sysContact.0",
}
instructions[3] = {
	instruction = "get",
	oid = "SNMPv2-MIB::sysLocation.0",
}

SNMP:sequence(instructions, true, {
	success = function()
		self:debug("System : <b>" .. (instructions[1].response or "<i>nil</i>") .. "</b>")
		self:debug("Contact : <b>" .. (instructions[2].response or "<i>nil</i>") .. "</b>")
		self:debug("Location : <b>" .. (instructions[3].response or "<i>nil</i>") .. "</b>")
	end,
	error = function(message)
		self:warning("Can't get router information :", message)
	end,
})

 

 

Téléchargement

 

 

Modifié par Lazer
  • Like 3
Lien vers le commentaire
Partager sur d’autres sites

Héhé tu as lu le code, c'est bien ;)


Alors si, elle est bien utilisée, en fait elle permet de réaliser une série d'instructions (get...).

La différence avec le WALK, qui va parcourir toute une branche de façon récursive (et ramener potentiellement énormément de valeurs), la SEQUENCE permet d'aller chercher plusieurs valeurs à des adresses différentes, en une seule fois. C'est plus facile à écrire en LUA, et plus rapide à l'exécution.


Tu as un exemple d'utilisation dans le QuickApp Onduleur Eaton.

J'ai rajouté dans le 1er post un autre exemple d'utilisation basique.

 

J'ai également rajouté l'information pour activer le mode debug de la librairie, avec SNMP.isdebug = true

 

Modifié par Lazer
  • Like 1
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...