improved Juniper driver
authorVictor Kirhenshtein <victor@netxms.org>
Wed, 15 Mar 2017 15:47:54 +0000 (17:47 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Wed, 15 Mar 2017 15:47:54 +0000 (17:47 +0200)
include/nxsnmp.h
src/server/drivers/juniper/juniper.cpp
src/server/drivers/juniper/juniper.h
src/snmp/libnxsnmp/snapshot.cpp

index 4b5ce1f..143efd5 100644 (file)
@@ -734,24 +734,24 @@ public:
    EnumerationCallbackResult walk(const TCHAR *baseOid, EnumerationCallbackResult (*handler)(const SNMP_Variable *, const SNMP_Snapshot *, void *), void *userArg) const;
    EnumerationCallbackResult walk(const UINT32 *baseOid, size_t baseOidLen, EnumerationCallbackResult (*handler)(const SNMP_Variable *, const SNMP_Snapshot *, void *), void *userArg) const;
 
-   SNMP_Variable *get(const TCHAR *oid) const;
-   SNMP_Variable *get(const SNMP_ObjectId& oid) const;
-   SNMP_Variable *get(const UINT32 *oid, size_t oidLen) const;
-   SNMP_Variable *getNext(const TCHAR *oid) const;
-   SNMP_Variable *getNext(const SNMP_ObjectId& oid) const;
-   SNMP_Variable *getNext(const UINT32 *oid, size_t oidLen) const;
-   SNMP_Variable *first() const { return m_values->get(0); }
-   SNMP_Variable *last() const { return m_values->get(m_values->size() - 1); }
-
-   UINT32 getAsInt32(const TCHAR *oid) const { SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsInt() : 0; }
-   UINT32 getAsInt32(const SNMP_ObjectId& oid) const { SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsInt() : 0; }
-   UINT32 getAsInt32(const UINT32 *oid, size_t oidLen) const { SNMP_Variable *v = get(oid, oidLen); return (v != NULL) ? v->getValueAsInt() : 0; }
-   UINT32 getAsUInt32(const TCHAR *oid) const { SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsUInt() : 0; }
-   UINT32 getAsUInt32(const SNMP_ObjectId& oid) const { SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsUInt() : 0; }
-   UINT32 getAsUInt32(const UINT32 *oid, size_t oidLen) const { SNMP_Variable *v = get(oid, oidLen); return (v != NULL) ? v->getValueAsUInt() : 0; }
-   TCHAR *getAsString(const TCHAR *oid, TCHAR *buffer, size_t bufferSize) const { SNMP_Variable *v = get(oid); if (v != NULL) { v->getValueAsString(buffer, bufferSize); return buffer; } return NULL; }
-   TCHAR *getAsString(const SNMP_ObjectId& oid, TCHAR *buffer, size_t bufferSize) const { SNMP_Variable *v = get(oid); if (v != NULL) { v->getValueAsString(buffer, bufferSize); return buffer; } return NULL; }
-   TCHAR *getAsString(const UINT32 *oid, size_t oidLen, TCHAR *buffer, size_t bufferSize) const { SNMP_Variable *v = get(oid, oidLen); if (v != NULL) { v->getValueAsString(buffer, bufferSize); return buffer; } return NULL; }
+   const SNMP_Variable *get(const TCHAR *oid) const;
+   const SNMP_Variable *get(const SNMP_ObjectId& oid) const;
+   const SNMP_Variable *get(const UINT32 *oid, size_t oidLen) const;
+   const SNMP_Variable *getNext(const TCHAR *oid) const;
+   const SNMP_Variable *getNext(const SNMP_ObjectId& oid) const;
+   const SNMP_Variable *getNext(const UINT32 *oid, size_t oidLen) const;
+   const SNMP_Variable *first() const { return m_values->get(0); }
+   const SNMP_Variable *last() const { return m_values->get(m_values->size() - 1); }
+
+   UINT32 getAsInt32(const TCHAR *oid) const { const SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsInt() : 0; }
+   UINT32 getAsInt32(const SNMP_ObjectId& oid) const { const SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsInt() : 0; }
+   UINT32 getAsInt32(const UINT32 *oid, size_t oidLen) const { const SNMP_Variable *v = get(oid, oidLen); return (v != NULL) ? v->getValueAsInt() : 0; }
+   UINT32 getAsUInt32(const TCHAR *oid) const { const SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsUInt() : 0; }
+   UINT32 getAsUInt32(const SNMP_ObjectId& oid) const { const SNMP_Variable *v = get(oid); return (v != NULL) ? v->getValueAsUInt() : 0; }
+   UINT32 getAsUInt32(const UINT32 *oid, size_t oidLen) const { const SNMP_Variable *v = get(oid, oidLen); return (v != NULL) ? v->getValueAsUInt() : 0; }
+   TCHAR *getAsString(const TCHAR *oid, TCHAR *buffer, size_t bufferSize) const { const SNMP_Variable *v = get(oid); if (v != NULL) { v->getValueAsString(buffer, bufferSize); return buffer; } return NULL; }
+   TCHAR *getAsString(const SNMP_ObjectId& oid, TCHAR *buffer, size_t bufferSize) const { const SNMP_Variable *v = get(oid); if (v != NULL) { v->getValueAsString(buffer, bufferSize); return buffer; } return NULL; }
+   TCHAR *getAsString(const UINT32 *oid, size_t oidLen, TCHAR *buffer, size_t bufferSize) const { const SNMP_Variable *v = get(oid, oidLen); if (v != NULL) { v->getValueAsString(buffer, bufferSize); return buffer; } return NULL; }
 
    int size() const { return m_values->size(); }
    bool isEmpty() const { return m_values->size() == 0; }
index 362e5de..bfbcd17 100644 (file)
@@ -96,34 +96,90 @@ InterfaceList *JuniperDriver::getInterfaces(SNMP_Transport *snmp, StringMap *att
 
        // Update physical port locations
        SNMP_Snapshot *chassisTable = SNMP_Snapshot::create(snmp, _T(".1.3.6.1.4.1.2636.3.3.2.1"));
-       for(int i = 0; i < ifList->size(); i++)
+       if (chassisTable != NULL)
        {
-          InterfaceInfo *iface = ifList->get(i);
-          if (iface->type != IFTYPE_ETHERNET_CSMACD)
-             continue;
-
-          SNMP_ObjectId oid = SNMP_ObjectId::parse(_T(".1.3.6.1.4.1.2636.3.3.2.1.1"));
-          oid.extend(iface->index);
-          int slot = chassisTable->getAsInt32(oid);
-
-      oid.changeElement(oid.length() - 2, 2);
-      int pic = chassisTable->getAsInt32(oid);
-
-          oid.changeElement(oid.length() - 2, 3);
-      int port = chassisTable->getAsInt32(oid);
-
-      if ((slot == 0) || (pic != 1) || (port == 0))   // FIXME: support for multiple PICs in one slot
-         continue;
-
-      iface->isPhysicalPort = true;
-      iface->slot = slot - 1;  // Juniper numbers slots from 0 but reports in SNMP as n + 1
-      iface->port = port - 1;  // Juniper numbers ports from 0 but reports in SNMP as n + 1
+      for(int i = 0; i < ifList->size(); i++)
+      {
+         InterfaceInfo *iface = ifList->get(i);
+         if (iface->type != IFTYPE_ETHERNET_CSMACD)
+            continue;
+
+         SNMP_ObjectId oid = SNMP_ObjectId::parse(_T(".1.3.6.1.4.1.2636.3.3.2.1.1"));
+         oid.extend(iface->index);
+         int slot = chassisTable->getAsInt32(oid);
+
+         oid.changeElement(oid.length() - 2, 2);
+         int pic = chassisTable->getAsInt32(oid);
+
+         oid.changeElement(oid.length() - 2, 3);
+         int port = chassisTable->getAsInt32(oid);
+
+         if ((slot == 0) || (pic != 1) || (port == 0))   // FIXME: support for multiple PICs in one slot
+            continue;
+
+         iface->isPhysicalPort = true;
+         iface->slot = slot - 1;  // Juniper numbers slots from 0 but reports in SNMP as n + 1
+         iface->port = port - 1;  // Juniper numbers ports from 0 but reports in SNMP as n + 1
+      }
+      delete chassisTable;
        }
-
        return ifList;
 }
 
 /**
+ * Get VLANs
+ */
+VlanList *JuniperDriver::getVlans(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData)
+{
+   SNMP_Snapshot *vlanTable = SNMP_Snapshot::create(snmp, _T(".1.3.6.1.4.1.2636.3.40.1.5.1.5.1"));
+   if (vlanTable == NULL)
+      return NetworkDeviceDriver::getVlans(snmp, attributes, driverData);
+
+   SNMP_Snapshot *portTable = SNMP_Snapshot::create(snmp, _T(".1.3.6.1.4.1.2636.3.40.1.5.1.7.1"));
+   if (portTable == NULL)
+   {
+      delete vlanTable;
+      return NetworkDeviceDriver::getVlans(snmp, attributes, driverData);
+   }
+
+   VlanList *vlans = new VlanList();
+   SNMP_ObjectId oid = SNMP_ObjectId::parse(_T(".1.3.6.1.4.1.2636.3.40.1.5.1.5.1.5"));
+   const SNMP_Variable *v;
+   while((v = vlanTable->getNext(oid)) != NULL)
+   {
+      VlanInfo *vlan = new VlanInfo(v->getValueAsInt(), VLAN_PRM_IFINDEX);
+      vlans->add(vlan);
+
+      oid = v->getName();
+      oid.changeElement(oid.length() - 2, 2);   // VLAN name
+      const SNMP_Variable *name = vlanTable->get(oid);
+      if (name != NULL)
+      {
+         TCHAR buffer[256];
+         vlan->setName(name->getValueAsString(buffer, 256));
+      }
+
+      // VLAN ports
+      UINT32 vlanId = oid.getElement(oid.length() - 1);
+      SNMP_ObjectId baseOid = SNMP_ObjectId::parse(_T(".1.3.6.1.4.1.2636.3.40.1.5.1.7.1.5"));
+      baseOid.extend(vlanId);
+      const SNMP_Variable *p = NULL;
+      while((p = portTable->getNext((p != NULL) ? p->getName() : baseOid)) != NULL)
+      {
+         if (p->getName().compare(baseOid) != OID_LONGER)
+            break;
+         vlan->add(p->getName().getElement(p->getName().length() - 1));
+      }
+
+      oid = v->getName();
+   }
+
+   delete vlanTable;
+   delete portTable;
+   return vlans;
+}
+
+/**
  * Get orientation of the modules in the device
  *
  * @param snmp SNMP transport
index 2e654cc..986f8cb 100644 (file)
@@ -40,6 +40,7 @@ public:
        virtual bool isDeviceSupported(SNMP_Transport *snmp, const TCHAR *oid);
        virtual void analyzeDevice(SNMP_Transport *snmp, const TCHAR *oid, StringMap *attributes, DriverData **driverData);
        virtual InterfaceList *getInterfaces(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData, int useAliases, bool useIfXTable);
+   virtual VlanList *getVlans(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData);
    virtual int getModulesOrientation(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData);
    virtual void getModuleLayout(SNMP_Transport *snmp, StringMap *attributes, DriverData *driverData, int module, NDD_MODULE_LAYOUT *layout);
 };
index 22ec7a5..6e5293d 100644 (file)
@@ -143,7 +143,7 @@ SNMP_Snapshot *SNMP_Snapshot::create(SNMP_Transport *transport, const UINT32 *ba
 /**
  * Get variable
  */
-SNMP_Variable *SNMP_Snapshot::get(const TCHAR *oid) const
+const SNMP_Variable *SNMP_Snapshot::get(const TCHAR *oid) const
 {
    SNMP_SnapshotIndexEntry *entry = find(oid);
    return (entry != NULL) ? entry->var : NULL;
@@ -152,7 +152,7 @@ SNMP_Variable *SNMP_Snapshot::get(const TCHAR *oid) const
 /**
  * Get variable
  */
-SNMP_Variable *SNMP_Snapshot::get(const SNMP_ObjectId& oid) const
+const SNMP_Variable *SNMP_Snapshot::get(const SNMP_ObjectId& oid) const
 {
    SNMP_SnapshotIndexEntry *entry = find(oid);
    return (entry != NULL) ? entry->var : NULL;
@@ -161,7 +161,7 @@ SNMP_Variable *SNMP_Snapshot::get(const SNMP_ObjectId& oid) const
 /**
  * Get variable
  */
-SNMP_Variable *SNMP_Snapshot::get(const UINT32 *oid, size_t oidLen) const
+const SNMP_Variable *SNMP_Snapshot::get(const UINT32 *oid, size_t oidLen) const
 {
    SNMP_SnapshotIndexEntry *entry = find(oid, oidLen);
    return (entry != NULL) ? entry->var : NULL;
@@ -170,7 +170,7 @@ SNMP_Variable *SNMP_Snapshot::get(const UINT32 *oid, size_t oidLen) const
 /**
  * Get next variable for given OID
  */
-SNMP_Variable *SNMP_Snapshot::getNext(const TCHAR *oid) const
+const SNMP_Variable *SNMP_Snapshot::getNext(const TCHAR *oid) const
 {
    UINT32 binOid[MAX_OID_LEN];
    size_t oidLen = SNMPParseOID(oid, binOid, MAX_OID_LEN);
@@ -182,7 +182,7 @@ SNMP_Variable *SNMP_Snapshot::getNext(const TCHAR *oid) const
 /**
  * Get next variable for given OID
  */
-SNMP_Variable *SNMP_Snapshot::getNext(const SNMP_ObjectId& oid) const
+const SNMP_Variable *SNMP_Snapshot::getNext(const SNMP_ObjectId& oid) const
 {
    return getNext(oid.value(), oid.length());
 }
@@ -190,7 +190,7 @@ SNMP_Variable *SNMP_Snapshot::getNext(const SNMP_ObjectId& oid) const
 /**
  * Get next variable for given OID
  */
-SNMP_Variable *SNMP_Snapshot::getNext(const UINT32 *oid, size_t oidLen) const
+const SNMP_Variable *SNMP_Snapshot::getNext(const UINT32 *oid, size_t oidLen) const
 {
    SNMP_SnapshotIndexEntry *entry = find(oid, oidLen);
    if (entry != NULL)
@@ -224,7 +224,7 @@ EnumerationCallbackResult SNMP_Snapshot::walk(const TCHAR *baseOid, EnumerationC
 EnumerationCallbackResult SNMP_Snapshot::walk(const UINT32 *baseOid, size_t baseOidLen, EnumerationCallbackResult (*handler)(const SNMP_Variable *, const SNMP_Snapshot *, void *), void *userArg) const
 {
    EnumerationCallbackResult result = _CONTINUE;
-   SNMP_Variable *curr = getNext(baseOid, baseOidLen);
+   const SNMP_Variable *curr = getNext(baseOid, baseOidLen);
    while(curr->getName().compare(baseOid, baseOidLen) == OID_LONGER)
    {
       result = handler(curr, this, userArg);