demande de rappel immédiat

SNMP : Programmation en C# avec un Assembly Open Source.

Posted by Jean-Paul Blanc Tuesday, March 30, 2010 6:58:00 AM
Rate this Content 0 Votes

 

 

SNMP SHARP .NET est une Assembly .NET Open Source qui permet de programmer rapidement des utilitaires basés sur SNMP. Il offre deux niveaux de mise en oeuvre :

  1. Il y a d'une part les classes 'oid', "varbindlist" etc. qui permettent de coder et de décoder des PDU SNMPv1, v2c, v3 depuis et vers de l'ASN1. Le programmeur n'a plus qu'a écrire la partie socket.

    /* Fabrication d'une requête SNMPV2
     */
    SnmpV2Packet packet = new SnmpV2Packet();
    // Positionne le nom de la communauté
    packet.Community.Set(sNodeCommunity);
    // Positionne le type de PDU
    packet.Pdu.Type = PduType.Get;
    // Positionne l'identifiant de requête
    packet.Pdu.RequestId = 100;
    // Ajoute un Oid à la VarBindList de récupération
    // iso(1).org(3).dod(6).internet(1).mgmt(2).mib-2(1).interfaces(2).ifNumber(1)
    Oid oidifNumber = new Oid(".1.3.6.1.2.1.2.1.0");
    packet.Pdu.VbList.Add(oidifNumber);
    
    /* Encodage pour transmission
     */
    byte[] outBuffer = packet.encode();
    
    /* Envoie - Réception du paquet
     */
    Socket sSnmp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    sSnmp.Connect(sNodeAddr, iNodePort);
    sSnmp.Send(outBuffer);
    byte[] inBuffer = new byte[2048];
    int inLength = sSnmp.Receive(inBuffer);
    
    
    /* Décodage du Packet reçu
     */
    SnmpV2Packet result = new SnmpV2Packet();
    result.decode(inBuffer, inLength);
    
    int rcNbInterfaces = 0;
    foreach (Vb vbTemp in result.Pdu.VbList)
    {
      if (vbTemp.Oid.Compare(oidifNumber) == 0)
        rcNbInterfaces = int.Parse(vbTemp.Value.ToString());
    }
    
    return rcNbInterfaces;
  2. D'autre part des classes simples "SimpleSNMP" permettent de programmer rapidement autour des verbes de base..
    static void Main(string[] args)
    {
      /* Prend un objet SNMP
       */
      SimpleSnmp snmpVerb = new SimpleSnmp("192.168.234.128", 161, "public");
      if (!snmpVerb.Valid)
      {
        Console.WriteLine("A priori le format de l'adresse IP ou de la communauté ne vont pas");
        return;
      }
    
      /* Utilise un verbe simple
       */
      Oid oidNbInterfaces = new Oid(".1.3.6.1.2.1.2.1.0");
      Dictionary<Oid, AsnType> snmpData = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidNbInterfaces .ToString()});
      if (snmpData != null)
        Console.WriteLine("Nombre d'interfaces \"{0}\" : {1}", oidNbInterfaces.ToString(), snmpData[oidNbInterfaces].ToString());
      else
        Console.WriteLine("Pas Glop!");
    }

Cette mise en oeuvre est certe moins ellaborée que celle de librairies commerciales, mais elle est assez pratique. Il serait notamment assez intéressant de la coupler avec un outil qui permette de transformer une MIB en en bibliothèque de classes C# de sorte à récupérer ou modifier simplement un "objet" SNMP. Une autre extension possible serait d’habiller cet Assembly de sorte à fournir des Cmdlets Powershell.

Comments are closed on this post.