44 votes

Quelle est la meilleure implémentation de SNMP pour Python ?

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.

61voto

Nick Craig-Wood Points 18742

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

11voto

James Harr Points 368

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.

2voto

gimel Points 30150

Net-Snmp a des liens avec python. Accès très simple (fonctions de type ligne de commande) à la fonctionnalité SNMP. Si vous utilisez le démon de capture Net-Snmp, vous pouvez diriger les informations de capture vers des scripts python (ou tout autre langage).

2voto

Armin Ronacher Points 16894

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.

1voto

Gregor Points 2305

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/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X