Je suis en train de faire du prototypage d'interface graphique avec Python pour une application SNMP. En regardant autour de moi, il semble y avoir un certain nombre de bibliothèques Python que je pourrais utiliser. Comme je fais du prototypage, j'accorde plus d'importance à une API simple et propre qu'à la vitesse, et de préférence à une bibliothèque communément packagée. Il est évident que le paquetage doit être open source. Jusqu'à présent, j'ai étudié PySNMP, Twisted-Snmp, pynetsnmp et libsnmp de Seafelt.
Réponses
Trop de publicités?Parmi les bibliothèques que vous mentionnez, je citerais la bibliothèque python net-snmp et pysnmp. Un de mes critères pour choisir des bibliothèques bien supportées est de savoir si elles sont dans debian/ubuntu et ces deux-là passent ce test.
Net-snmp est accompagné de liaisons python . Net-snmp est en quelque sorte la bibliothèque snmp de facto (pour linux au moins), c'est donc probablement un bon choix à cet égard. Cependant, Net-snmp est une bibliothèque C extrêmement grande et touffue (sur laquelle j'ai passé pas mal de temps à bidouiller et à lire le code source), ce qui est un inconvénient.
L'autre alternative est un bibliothèque snmp en python pur - pysnmp ce qui semble être un choix judicieux, bien que je n'aie pas encore essayé cette solution. L'emballage torsadé de ce produit pourrait s'avérer utile.
Si je commençais un nouveau développement SNMP, j'essaierais pysnmp pour voir s'il fonctionne bien, mais le bon vieux (py)net-snmp est toujours là si vous en avez besoin.
Si vous souhaitez simplement utiliser snmp de manière légère, vous pouvez utiliser les outils de ligne de commande net-snmp très facilement, par exemple
snmpget -c password host -v1 enterprises.318.1.1.12.2.3.1.1.2.1
Pour lire l'utilisation de l'énergie d'une barre d'alimentation APC, qui fonctionnerait bien pour le prototypage, j'aurais pensé.
[edit : un an plus tard]
J'ai maintenant eu l'occasion d'essayer la bibliothèque pysnmp.
Je n'étais pas satisfait de la branche stable 2.x, mais la branche de développement 4.x fonctionne et comporte un grand nombre de fonctionnalités intéressantes, dont les suivantes
- Chargement des MIB
- Raisonnablement simple interface oneliner
- Prise en charge complète de set/get/walk avec des versions en vrac de ceux-ci
- Interface synchrone et asynchrone
- Support pour le serveur (agent) et le client (manager)
Je l'ai trouvé modérément compliqué à utiliser, mais j'ai réussi à m'en sortir avec l'aide de la documentation et du code source.
Meilleur conseil : set os.environ['PYSNMP_MIB_DIR']
pour pointer vers les répertoires dans lesquels se trouvent vos propres mibs convertis, et utilisez build-pysnmp-mib
pour les faire, ou si ça ne marche pas
smidump -k -f python My-MIB.txt | libsmi2pysnmp > My-MIB.py
Il ne s'agit pas tant d'une réponse que de partager mon expérience en testant ces bibliothèques.
J'ai effectué quelques tests de benchmarks snmpwalk sur PySNMP 4.x et net-snmp en utilisant les fonctions de python multiprocessing.pool . Les benchmarks étaient assez sales (en gros, j'ai augmenté le pool de threads jusqu'à ce que je n'obtienne plus aucun gain de performance), donc attention au lecteur. Voici quelques observations :
Les liaisons python de netsnmp :
- Il a pu tirer 11958 oids/sec sur la boîte de test quadruple cœur.
- Il n'a pas consommé beaucoup de CPU. Il semblait attendre les E/S du réseau la plupart du temps (continuez à lire).
- Il ne supporte pas snmpbulkwalk, malheureusement. Cela génère donc plus de trafic réseau et un seul fil d'exécution a tendance à être lent.
- Il a un comportement ennuyeux de recherche de MIB. Je devais spécifier 'ifName' au lieu de 'IF-MIB::ifName', ce qui pouvait conduire à une certaine ambiguïté. Je n'ai pas non plus réussi à trouver un moyen de contrôler les recherches de MIB.
- Bibliothèque n'est pas sans fil. Il peut être utilisé sur plusieurs processus.
PySNMP4 :
- Il est arrivé à 5560 oids/sec sur la même boîte.
- Très gourmand en ressources CPU. Je l'attribue au fait que l'analyse des paquets est effectuée en Python.
- J'ai trouvé que les recherches de MIB étaient vraiment bien.
- snmpwalks ferait fuir certains OIDs sans rapport. Par exemple, j'ai parcouru IF-MIB::ifXTable et à la fin j'ai obtenu IF-MIB::ifStackTable. Dépôt IF-MIB .
- Il est presque certain que j'adapterais un wrapper pour mon application au lieu d'utiliser directement cette bibliothèque. Plus précisément, j'envelopperais toute la gestion des erreurs pour utiliser les Exceptions.
- Je ne suis pas un grand fan de l'écriture/lecture de code asynchrone, donc j'ignorerais simplement tous les bits asynchrones et exécuterais les grosses opérations SNMP dans un processus séparé.
Dans l'ensemble, je suis vraiment déçu. Il n'y a pas vraiment de bibliothèque "meilleure dans son ensemble". En dehors de l'API et des performances, PySNMP4 est formidable. En dehors d'un comportement étrange dans la gestion de la recherche de MIB/oid et du fait qu'ils ne supportent pas beaucoup d'opérations de masse, les liens python de NetSNMP sont excellents.
Le projet le plus actif de "Security not my Problem" semble être le suivant pycopia SNMP . Je n'ai aucune expérience avec l'une d'entre elles, mais si vous avez des difficultés à trouver la bonne, jetez un œil aux archives des listes de diffusion des bibliothèques pour trouver la plus active. Celles-ci ont généralement une meilleure API/implémentation ou au moins plus d'utilisateurs.
J'ai cherché des implémentations SNMP aujourd'hui, et ma préférée est la suivante http://pysnmp.sourceforge.net
Ils proposent des "one-liners" (qui sont en fait un peu plus longs qu'une ligne normale, mais je ne suis pas difficile) :
from pysnmp.entity.rfc3413.oneliner import cmdgen
errorIndication, errorStatus, \
errorIndex, varBinds = cmdgen.CommandGenerator().getCmd(
# SNMP v1
# cmdgen.CommunityData('test-agent', 'public', 0),
# SNMP v2
cmdgen.CommunityData('test-agent', 'public'),
# SNMP v3
# cmdgen.UsmUserData('test-user', 'authkey1', 'privkey1'),
cmdgen.UdpTransportTarget(('localhost', 161)),
# Plain OID
(1,3,6,1,2,1,1,1,0),
# ((mib-name, mib-symbol), instance-id)
(('SNMPv2-MIB', 'sysObjectID'), 0)
)
J'ai écrit ici un court script de récupération d'interface SNMP qui gère les valeurs Counter32 débordantes sur les commutateurs HP 1810G bon marché : http://blog.lagentz.com/python/handling-snmp-counter32-overflows-on-hp1810-g-correctly/