JSON serialization implemented for most object classes
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 22 May 2017 06:13:30 +0000 (09:13 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 22 May 2017 06:13:30 +0000 (09:13 +0300)
27 files changed:
include/nxsnmp.h
src/server/core/accesspoint.cpp
src/server/core/agent_policy.cpp
src/server/core/ap_config.cpp
src/server/core/ap_logparser.cpp
src/server/core/chassis.cpp
src/server/core/cluster.cpp
src/server/core/condition.cpp
src/server/core/container.cpp
src/server/core/dashboard.cpp
src/server/core/dctarget.cpp
src/server/core/mobile.cpp
src/server/core/netmap.cpp
src/server/core/netmap_element.cpp
src/server/core/netmap_link.cpp
src/server/core/netsrv.cpp
src/server/core/node.cpp
src/server/core/rack.cpp
src/server/core/subnet.cpp
src/server/core/vpnconn.cpp
src/server/core/zone.cpp
src/server/include/nddrv.h
src/server/include/netxms_maps.h
src/server/include/nms_objects.h
src/server/libnxsrv/Makefile.am
src/snmp/libnxsnmp/Makefile.am
src/snmp/libnxsnmp/security.cpp

index 143efd5..9752cfb 100644 (file)
@@ -505,6 +505,8 @@ public:
        BYTE *getAuthKeySHA1() { return m_authKeySHA1; }
        BYTE *getPrivKey() { return m_privKey; }
 
+       json_t *toJson() const;
+
        void setAuthName(const char *name);
        void setCommunity(const char *community) { setAuthName(community); }
        void setUser(const char *user) { setAuthName(user); }
index 6ed5eb9..496f7a5 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 
 #include "nxcore.h"
 
+/**
+ * Serialize radio interface information to JSON
+ */
+json_t *RadioInterfaceInfo::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "index", json_integer(index));
+   json_object_set_new(root, "name", json_string_t(name));
+   char macAddrText[64];
+   json_object_set_new(root, "macAddr", json_string(BinToStrA(macAddr, MAC_ADDR_LENGTH, macAddrText)));
+   json_object_set_new(root, "channel", json_integer(channel));
+   json_object_set_new(root, "powerDBm", json_integer(powerDBm));
+   json_object_set_new(root, "powerMW", json_integer(powerMW));
+   return root;
+}
+
 /**
  * Default constructor
  */
@@ -609,3 +625,23 @@ void AccessPoint::updatePingData()
       m_pingLastTimeStamp = time(NULL);
    }
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *AccessPoint::toJson()
+{
+   json_t *root = DataCollectionTarget::toJson();
+   json_object_set_new(root, "index", json_integer(m_index));
+   json_object_set_new(root, "ipAddress", m_ipAddress.toJson());
+   json_object_set_new(root, "nodeId", json_integer(m_nodeId));
+   char macAddrText[64];
+   json_object_set_new(root, "macAddr", json_string_a(BinToStrA(m_macAddr, sizeof(m_macAddr), macAddrText)));
+   json_object_set_new(root, "vendor", json_string_t(m_vendor));
+   json_object_set_new(root, "model", json_string_t(m_model));
+   json_object_set_new(root, "serialNumber", json_string_t(m_serialNumber));
+   json_object_set_new(root, "radioInterfaces", json_object_array(m_radioInterfaces));
+   json_object_set_new(root, "state", json_integer(m_state));
+   json_object_set_new(root, "prevState", json_integer(m_prevState));
+   return root;
+}
index 35b9a0a..9e16c25 100644 (file)
@@ -240,3 +240,14 @@ bool AgentPolicy::createUninstallMessage(NXCPMessage *msg)
        msg->setField(VID_GUID, m_guid);
        return true;
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *AgentPolicy::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "version", json_integer(m_version));
+   json_object_set_new(root, "policyType", json_integer(m_policyType));
+   return root;
+}
index cc19752..59543da 100644 (file)
@@ -175,7 +175,6 @@ bool AgentPolicyConfig::createDeploymentMessage(NXCPMessage *msg)
        return true;
 }
 
-
 /**
  * Create uninstall message
  */
@@ -183,3 +182,13 @@ bool AgentPolicyConfig::createUninstallMessage(NXCPMessage *msg)
 {
        return AgentPolicy::createUninstallMessage(msg);
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *AgentPolicyConfig::toJson()
+{
+   json_t *root = AgentPolicy::toJson();
+   json_object_set_new(root, "fileContent", json_string_t(m_fileContent));
+   return root;
+}
index 234404c..7fda153 100644 (file)
@@ -182,3 +182,13 @@ bool AgentPolicyLogParser::createUninstallMessage(NXCPMessage *msg)
 {
        return AgentPolicy::createUninstallMessage(msg);
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *AgentPolicyLogParser::toJson()
+{
+   json_t *root = AgentPolicy::toJson();
+   json_object_set_new(root, "fileContent", json_string_t(m_fileContent));
+   return root;
+}
index ff9f86c..2067618 100644 (file)
@@ -391,3 +391,17 @@ void Chassis::setBindUnderController(bool doBind)
    unlockProperties();
    updateControllerBinding();
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Chassis::toJson()
+{
+   json_t *root = DataCollectionTarget::toJson();
+   json_object_set_new(root, "controllerId", json_integer(m_controllerId));
+   json_object_set_new(root, "rackHeight", json_integer(m_rackHeight));
+   json_object_set_new(root, "rackPosition", json_integer(m_rackPosition));
+   json_object_set_new(root, "rackId", json_integer(m_rackId));
+   json_object_set_new(root, "rackImage", m_rackImage.toJson());
+   return root;
+}
index dfe35a8..c0fc8d2 100644 (file)
@@ -913,3 +913,29 @@ NXSL_Array *Cluster::getNodesForNXSL()
 
    return nodes;
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Cluster::toJson()
+{
+   json_t *root = DataCollectionTarget::toJson();
+   json_object_set_new(root, "clusterType", json_integer(m_dwClusterType));
+   json_object_set_new(root, "syncNetworks", json_object_array(m_syncNetworks));
+   json_object_set_new(root, "lastStatusPoll", json_integer(m_lastStatusPoll));
+   json_object_set_new(root, "lastConfigurationPoll", json_integer(m_lastConfigurationPoll));
+   json_object_set_new(root, "zoneId", json_integer(m_zoneId));
+
+   json_t *resources = json_array();
+   for(UINT32 i = 0; i < m_dwNumResources; i++)
+   {
+      json_t *r = json_object();
+      json_object_set_new(r, "id", json_integer(m_pResourceList[i].dwId));
+      json_object_set_new(r, "name", json_string_t(m_pResourceList[i].szName));
+      json_object_set_new(r, "address", m_pResourceList[i].ipAddr.toJson());
+      json_object_set_new(r, "currentOwner", json_integer(m_pResourceList[i].dwCurrOwner));
+      json_array_append_new(resources, r);
+   }
+   json_object_set_new(root, "resources", resources);
+   return root;
+}
index 184dadf..a0a28c6 100644 (file)
@@ -559,3 +559,31 @@ int ConditionObject::getCacheSizeForDCI(UINT32 itemId, bool noLock)
       unlockProperties();
    return nSize;
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *ConditionObject::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_t *inputs = json_array();
+   for(int i = 0; i < m_dciCount; i++)
+   {
+      json_t *dci = json_object();
+      json_object_set_new(dci, "id", json_integer(m_dciList[i].id));
+      json_object_set_new(dci, "nodeId", json_integer(m_dciList[i].nodeId));
+      json_object_set_new(dci, "function", json_integer(m_dciList[i].function));
+      json_object_set_new(dci, "polls", json_integer(m_dciList[i].polls));
+      json_array_append_new(inputs, dci);
+   }
+   json_object_set_new(root, "inputs", inputs);
+   json_object_set_new(root, "script", json_string_t(m_scriptSource));
+   json_object_set_new(root, "activationEventCode", json_integer(m_activationEventCode));
+   json_object_set_new(root, "deactivationEventCode", json_integer(m_deactivationEventCode));
+   json_object_set_new(root, "sourceObject", json_integer(m_sourceObject));
+   json_object_set_new(root, "activeStatus", json_integer(m_activeStatus));
+   json_object_set_new(root, "inactiveStatus", json_integer(m_inactiveStatus));
+   json_object_set_new(root, "isActive", json_boolean(m_isActive));
+   json_object_set_new(root, "lastPoll", json_integer(m_lastPoll));
+   return root;
+}
index c3dda1c..ab0719c 100644 (file)
@@ -391,3 +391,14 @@ NXSL_Value *Container::createNXSLObject()
 {
    return new NXSL_Value(new NXSL_Object(&g_nxslContainerClass, this));
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Container::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "flags", json_integer(m_flags));
+   json_object_set_new(root, "bindFilter", json_string_t(m_bindFilterSource));
+   return root;
+}
index 6e72816..479dd68 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -22,7 +22,6 @@
 
 #include "nxcore.h"
 
-
 /**
  * Default constructor
  */
@@ -240,3 +239,15 @@ bool Dashboard::showThresholdSummary()
 {
        return false;
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Dashboard::toJson()
+{
+   json_t *root = Container::toJson();
+   json_object_set_new(root, "numColumns", json_integer(m_numColumns));
+   json_object_set_new(root, "options", json_integer(m_options));
+   json_object_set_new(root, "elements", json_object_array(m_elements));
+   return root;
+}
index 37ede84..6d9a87b 100644 (file)
@@ -1194,3 +1194,14 @@ void DataCollectionTarget::updateContainerMembership()
    }
    delete containers;
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *DataCollectionTarget::toJson()
+{
+   json_t *root = Template::toJson();
+   json_object_set_new(root, "pingTime", json_integer(m_pingTime));
+   json_object_set_new(root, "pingLastTimeStamp", json_integer(m_pingLastTimeStamp));
+   return root;
+}
index cfbf4d6..706dc70 100644 (file)
@@ -344,3 +344,22 @@ NXSL_Value *MobileDevice::createNXSLObject()
 {
    return new NXSL_Value(new NXSL_Object(&g_nxslMobileDeviceClass, this));
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *MobileDevice::toJson()
+{
+   json_t *root = DataCollectionTarget::toJson();
+   json_object_set_new(root, "lastReportTime", json_integer(m_lastReportTime));
+   json_object_set_new(root, "deviceId", json_string_t(m_deviceId));
+   json_object_set_new(root, "vendor", json_string_t(m_vendor));
+   json_object_set_new(root, "model", json_string_t(m_model));
+   json_object_set_new(root, "serialNumber", json_string_t(m_serialNumber));
+   json_object_set_new(root, "osName", json_string_t(m_osName));
+   json_object_set_new(root, "osVersion", json_string_t(m_osVersion));
+   json_object_set_new(root, "userId", json_string_t(m_userId));
+   json_object_set_new(root, "batteryLevel", json_integer(m_batteryLevel));
+   json_object_set_new(root, "ipAddress", m_ipAddress.toJson());
+   return root;
+}
index 094df0b..59b286c 100644 (file)
@@ -986,3 +986,28 @@ void NetworkMap::onObjectDelete(UINT32 dwObjectId)
 
    NetObj::onObjectDelete(dwObjectId);
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *NetworkMap::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "mapType", json_integer(m_mapType));
+   json_object_set_new(root, "seedObjects", m_seedObjects->toJson());
+   json_object_set_new(root, "discoveryRadius", json_integer(m_discoveryRadius));
+   json_object_set_new(root, "layout", json_integer(m_layout));
+   json_object_set_new(root, "flags", json_integer(m_flags));
+   json_object_set_new(root, "backgroundColor", json_integer(m_backgroundColor));
+   json_object_set_new(root, "defaultLinkColor", json_integer(m_defaultLinkColor));
+   json_object_set_new(root, "defaultLinkRouting", json_integer(m_defaultLinkRouting));
+   json_object_set_new(root, "objectDisplayMode", json_integer(m_objectDisplayMode));
+   json_object_set_new(root, "background", m_background.toJson());
+   json_object_set_new(root, "backgroundLatitude", json_real(m_backgroundLatitude));
+   json_object_set_new(root, "backgroundLongitude", json_real(m_backgroundLongitude));
+   json_object_set_new(root, "backgroundZoom", json_integer(m_backgroundZoom));
+   json_object_set_new(root, "elements", json_object_array(m_elements));
+   json_object_set_new(root, "links", json_object_array(m_links));
+   json_object_set_new(root, "filter", json_string_t(m_filterSource));
+   return root;
+}
index 7b8b7b8..48745d6 100644 (file)
@@ -79,7 +79,6 @@ void NetworkMapElement::updateConfig(Config *config)
        config->setValue(_T("/posY"), m_posY);
 }
 
-
 /**
  * Fill NXCP message with element's data
  */
@@ -92,7 +91,6 @@ void NetworkMapElement::fillMessage(NXCPMessage *msg, UINT32 baseId)
        msg->setField(baseId + 4, m_flags);
 }
 
-
 /**
  * Set element's position
  */
@@ -102,6 +100,20 @@ void NetworkMapElement::setPosition(LONG x, LONG y)
        m_posY = y;
 }
 
+/**
+ * Serialize object to JSON
+ */
+json_t *NetworkMapElement::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "id", json_integer(m_id));
+   json_object_set_new(root, "type", json_integer(m_type));
+   json_object_set_new(root, "posX", json_integer(m_posX));
+   json_object_set_new(root, "posY", json_integer(m_posY));
+   json_object_set_new(root, "flags", json_integer(m_flags));
+   return root;
+}
+
 /**********************
  * Network Map Object
  **********************/
@@ -109,64 +121,63 @@ void NetworkMapElement::setPosition(LONG x, LONG y)
 /**
  * Object element default constructor
  */
-
 NetworkMapObject::NetworkMapObject(UINT32 id, UINT32 objectId, UINT32 flags) : NetworkMapElement(id, flags)
 {
        m_type = MAP_ELEMENT_OBJECT;
        m_objectId = objectId;
 }
 
-
 /**
  * Object element config constructor
  */
-
 NetworkMapObject::NetworkMapObject(UINT32 id, Config *config, UINT32 flags) : NetworkMapElement(id, config, flags)
 {
        m_objectId = config->getValueAsUInt(_T("/objectId"), 0);
 }
 
-
 /**
  * Object element NXCP constructor
  */
-
 NetworkMapObject::NetworkMapObject(NXCPMessage *msg, UINT32 baseId) : NetworkMapElement(msg, baseId)
 {
        m_objectId = msg->getFieldAsUInt32(baseId + 10);
 }
 
-
 /**
  * Object element destructor
  */
-
 NetworkMapObject::~NetworkMapObject()
 {
 }
 
-
 /**
  * Update element's persistent configuration
  */
-
 void NetworkMapObject::updateConfig(Config *config)
 {
        NetworkMapElement::updateConfig(config);
        config->setValue(_T("/objectId"), m_objectId);
 }
 
-
 /**
  * Fill NXCP message with element's data
  */
-
 void NetworkMapObject::fillMessage(NXCPMessage *msg, UINT32 baseId)
 {
        NetworkMapElement::fillMessage(msg, baseId);
        msg->setField(baseId + 10, m_objectId);
 }
 
+/**
+ * Serialize to JSON
+ */
+json_t *NetworkMapObject::toJson() const
+{
+   json_t *root = NetworkMapElement::toJson();
+   json_object_set_new(root, "objectId", json_integer(m_objectId));
+   return root;
+}
+
 /**************************
  * Network Map Decoration
  **************************/
@@ -174,7 +185,6 @@ void NetworkMapObject::fillMessage(NXCPMessage *msg, UINT32 baseId)
 /**
  * Decoration element default constructor
  */
-
 NetworkMapDecoration::NetworkMapDecoration(UINT32 id, LONG decorationType, UINT32 flags) : NetworkMapElement(id, flags)
 {
        m_type = MAP_ELEMENT_DECORATION;
@@ -214,13 +224,12 @@ NetworkMapDecoration::NetworkMapDecoration(NXCPMessage *msg, UINT32 baseId) : Ne
  */
 NetworkMapDecoration::~NetworkMapDecoration()
 {
-       safe_free(m_title);
+       free(m_title);
 }
 
 /**
  * Update decoration element's persistent configuration
  */
-
 void NetworkMapDecoration::updateConfig(Config *config)
 {
        NetworkMapElement::updateConfig(config);
@@ -231,11 +240,9 @@ void NetworkMapDecoration::updateConfig(Config *config)
        config->setValue(_T("/height"), m_height);
 }
 
-
 /**
  * Fill NXCP message with element's data
  */
-
 void NetworkMapDecoration::fillMessage(NXCPMessage *msg, UINT32 baseId)
 {
        NetworkMapElement::fillMessage(msg, baseId);
@@ -246,6 +253,20 @@ void NetworkMapDecoration::fillMessage(NXCPMessage *msg, UINT32 baseId)
        msg->setField(baseId + 14, (UINT32)m_height);
 }
 
+/**
+ * Serialize to JSON
+ */
+json_t *NetworkMapDecoration::toJson() const
+{
+   json_t *root = NetworkMapElement::toJson();
+   json_object_set_new(root, "decorationType", json_integer(m_decorationType));
+   json_object_set_new(root, "color", json_integer(m_color));
+   json_object_set_new(root, "title", json_string_t(m_title));
+   json_object_set_new(root, "width", json_integer(m_width));
+   json_object_set_new(root, "height", json_integer(m_height));
+   return root;
+}
+
 /*****************************
  * Network Map DCI Container
  *****************************/
@@ -253,65 +274,64 @@ void NetworkMapDecoration::fillMessage(NXCPMessage *msg, UINT32 baseId)
 /**
  * DCI container default constructor
  */
-
 NetworkMapDCIContainer::NetworkMapDCIContainer(UINT32 id, TCHAR* xmlDCIList, UINT32 flags) : NetworkMapElement(id, flags)
 {
        m_type = MAP_ELEMENT_DCI_CONTAINER;
    m_xmlDCIList = _tcsdup(xmlDCIList);
 }
 
-
 /**
  * DCI container config constructor
  */
-
 NetworkMapDCIContainer::NetworkMapDCIContainer(UINT32 id, Config *config, UINT32 flags) : NetworkMapElement(id, config, flags)
 {
    m_xmlDCIList = _tcsdup(config->getValue(_T("/DCIList"), _T("")));
 }
 
-
 /**
  * DCI container NXCP constructor
  */
-
 NetworkMapDCIContainer::NetworkMapDCIContainer(NXCPMessage *msg, UINT32 baseId) : NetworkMapElement(msg, baseId)
 {
    m_xmlDCIList = msg->getFieldAsString(baseId + 10);
 }
 
-
 /**
  * DCI container destructor
  */
-
 NetworkMapDCIContainer::~NetworkMapDCIContainer()
 {
-   safe_free(m_xmlDCIList);
+   free(m_xmlDCIList);
 }
 
-
 /**
  * Update container's persistent configuration
  */
-
 void NetworkMapDCIContainer::updateConfig(Config *config)
 {
        NetworkMapElement::updateConfig(config);
        config->setValue(_T("/DCIList"), m_xmlDCIList);
 }
 
-
 /**
  * Fill NXCP message with container's data
  */
-
 void NetworkMapDCIContainer::fillMessage(NXCPMessage *msg, UINT32 baseId)
 {
        NetworkMapElement::fillMessage(msg, baseId);
        msg->setField(baseId + 10, m_xmlDCIList);
 }
 
+/**
+ * Serialize to JSON
+ */
+json_t *NetworkMapDCIContainer::toJson() const
+{
+   json_t *root = NetworkMapElement::toJson();
+   json_object_set_new(root, "xmlDCIList", json_string_t(m_xmlDCIList));
+   return root;
+}
+
 /**************************
  * Network Map DCI Image
  **************************/
@@ -319,61 +339,60 @@ void NetworkMapDCIContainer::fillMessage(NXCPMessage *msg, UINT32 baseId)
 /**
  * DCI image default constructor
  */
-
 NetworkMapDCIImage::NetworkMapDCIImage(UINT32 id, TCHAR* config, UINT32 flags) : NetworkMapElement(id, flags)
 {
        m_type = MAP_ELEMENT_DCI_IMAGE;
    m_config = _tcsdup(config);
 }
 
-
 /**
  * DCI image config constructor
  */
-
 NetworkMapDCIImage::NetworkMapDCIImage(UINT32 id, Config *config, UINT32 flags) : NetworkMapElement(id, config, flags)
 {
    m_config = _tcsdup(config->getValue(_T("/DCIList"), _T("")));
 }
 
-
 /**
  * DCI image NXCP constructor
  */
-
 NetworkMapDCIImage::NetworkMapDCIImage(NXCPMessage *msg, UINT32 baseId) : NetworkMapElement(msg, baseId)
 {
    m_config = msg->getFieldAsString(baseId + 10);
 }
 
-
 /**
  * DCI image destructor
  */
-
 NetworkMapDCIImage::~NetworkMapDCIImage()
 {
-   safe_free(m_config);
+   free(m_config);
 }
 
-
 /**
  * Update image's persistent configuration
  */
-
 void NetworkMapDCIImage::updateConfig(Config *config)
 {
        NetworkMapElement::updateConfig(config);
        config->setValue(_T("/DCIList"), m_config);
 }
 
-
 /**
  * Fill NXCP message with container's data
  */
-
 void NetworkMapDCIImage::fillMessage(NXCPMessage *msg, UINT32 baseId)
 {
        NetworkMapElement::fillMessage(msg, baseId);
        msg->setField(baseId + 10, m_config);
 }
+
+/**
+ * Serialize to JSON
+ */
+json_t *NetworkMapDCIImage::toJson() const
+{
+   json_t *root = NetworkMapElement::toJson();
+   json_object_set_new(root, "config", json_string_t(m_config));
+   return root;
+}
index 018a648..6450633 100644 (file)
@@ -132,4 +132,19 @@ void NetworkMapLink::fillMessage(NXCPMessage *msg, UINT32 baseId)
    msg->setField(baseId + 7, m_flags);
 }
 
-
+/**
+ * Serialize to JSON
+ */
+json_t *NetworkMapLink::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "element1", json_integer(m_element1));
+   json_object_set_new(root, "element2", json_integer(m_element2));
+   json_object_set_new(root, "type", json_integer(m_type));
+   json_object_set_new(root, "name", json_string_t(m_name));
+   json_object_set_new(root, "connectorName1", json_string_t(m_connectorName1));
+   json_object_set_new(root, "connectorName2", json_string_t(m_connectorName2));
+   json_object_set_new(root, "flags", json_integer(m_flags));
+   json_object_set_new(root, "config", json_string_t(m_config));
+   return root;
+}
index 05d484a..e002b4d 100644 (file)
@@ -429,3 +429,23 @@ void NetworkService::onObjectDelete(UINT32 dwObjectId)
    }
        unlockProperties();
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *NetworkService::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "serviceType", json_integer(m_serviceType));
+   json_object_set_new(root, "pollerNode", json_integer(m_pollerNode));
+   json_object_set_new(root, "proto", json_integer(m_proto));
+   json_object_set_new(root, "port", json_integer(m_port));
+   json_object_set_new(root, "ipAddress", m_ipAddress.toJson());
+   json_object_set_new(root, "request", json_string_t(m_request));
+   json_object_set_new(root, "response", json_string_t(m_response));
+   json_object_set_new(root, "pendingStatus", json_integer(m_pendingStatus));
+   json_object_set_new(root, "pollCount", json_integer(m_pollCount));
+   json_object_set_new(root, "requiredPollCount", json_integer(m_requiredPollCount));
+   json_object_set_new(root, "responseTime", json_integer(m_responseTime));
+   return root;
+}
index a9a1e42..55cfa1b 100644 (file)
@@ -7997,3 +7997,64 @@ void Node::setTunnelId(const uuid& tunnelId)
    TCHAR buffer[128];
    nxlog_debug(4, _T("Tunnel ID for node %s [%d] set to %s"), m_name, m_id, tunnelId.toString(buffer));
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Node::toJson()
+{
+   json_t *root = DataCollectionTarget::toJson();
+   json_object_set_new(root, "ipAddress", m_ipAddress.toJson());
+   json_object_set_new(root, "primaryName", json_string_t(m_primaryName));
+   json_object_set_new(root, "tunnelId", m_tunnelId.toJson());
+   json_object_set_new(root, "runtimeFlags", json_integer(m_dwDynamicFlags));
+   json_object_set_new(root, "type", json_integer(m_type));
+   json_object_set_new(root, "subType", json_string_t(m_subType));
+   json_object_set_new(root, "iPendingStatus", json_integer(m_iPendingStatus));
+   json_object_set_new(root, "iPollCount", json_integer(m_iPollCount));
+   json_object_set_new(root, "iRequiredPollCount", json_integer(m_iRequiredPollCount));
+   json_object_set_new(root, "zoneId", json_integer(m_zoneId));
+   json_object_set_new(root, "agentPort", json_integer(m_agentPort));
+   json_object_set_new(root, "agentAuthMethod", json_integer(m_agentAuthMethod));
+   json_object_set_new(root, "agentCacheMode", json_integer(m_agentCacheMode));
+   json_object_set_new(root, "agentCompressionMode", json_integer(m_agentCompressionMode));
+   json_object_set_new(root, "szSharedSecret", json_string_t(m_szSharedSecret));
+   json_object_set_new(root, "iStatusPollType", json_integer(m_iStatusPollType));
+   json_object_set_new(root, "snmpVersion", json_integer(m_snmpVersion));
+   json_object_set_new(root, "snmpPort", json_integer(m_snmpPort));
+   json_object_set_new(root, "nUseIfXTable", json_integer(m_nUseIfXTable));
+   json_object_set_new(root, "snmpSecurity", (m_snmpSecurity != NULL) ? m_snmpSecurity->toJson() : json_object());
+   json_object_set_new(root, "agentVersion", json_string_t(m_agentVersion));
+   json_object_set_new(root, "platformName", json_string_t(m_platformName));
+   json_object_set_new(root, "snmpObjectId", json_string_t(m_snmpObjectId));
+   json_object_set_new(root, "sysDescription", json_string_t(m_sysDescription));
+   json_object_set_new(root, "sysName", json_string_t(m_sysName));
+   json_object_set_new(root, "sysLocation", json_string_t(m_sysLocation));
+   json_object_set_new(root, "sysContact", json_string_t(m_sysContact));
+   json_object_set_new(root, "lldpNodeId", json_string_t(m_lldpNodeId));
+   json_object_set_new(root, "driverName", (m_driver != NULL) ? json_string_t(m_driver->getName()) : json_null());
+   json_object_set_new(root, "downSince", json_integer(m_downSince));
+   json_object_set_new(root, "bootTime", json_integer(m_bootTime));
+   json_object_set_new(root, "pollerNode", json_integer(m_pollerNode));
+   json_object_set_new(root, "agentProxy", json_integer(m_agentProxy));
+   json_object_set_new(root, "snmpProxy", json_integer(m_snmpProxy));
+   json_object_set_new(root, "icmpProxy", json_integer(m_icmpProxy));
+   json_object_set_new(root, "lastEvents", json_integer_array(m_lastEvents, MAX_LAST_EVENTS));
+   json_object_set_new(root, "adoptedApCount", json_integer(m_adoptedApCount));
+   json_object_set_new(root, "totalApCount", json_integer(m_totalApCount));
+   char baseBridgeAddrText[64];
+   json_object_set_new(root, "baseBridgeAddress", json_string_a(BinToStrA(m_baseBridgeAddress, MAC_ADDR_LENGTH, baseBridgeAddrText)));
+   json_object_set_new(root, "rackHeight", json_integer(m_rackHeight));
+   json_object_set_new(root, "rackPosition", json_integer(m_rackPosition));
+   json_object_set_new(root, "rackId", json_integer(m_rackId));
+   json_object_set_new(root, "rackImage", m_rackImage.toJson());
+   json_object_set_new(root, "chassisId", json_integer(m_chassisId));
+   json_object_set_new(root, "syslogMessageCount", json_integer(m_syslogMessageCount));
+   json_object_set_new(root, "snmpTrapCount", json_integer(m_snmpTrapCount));
+   json_object_set_new(root, "sshLogin", json_string_t(m_sshLogin));
+   json_object_set_new(root, "sshPassword", json_string_t(m_sshPassword));
+   json_object_set_new(root, "sshProxy", json_integer(m_sshProxy));
+   json_object_set_new(root, "portNumberingScheme", json_integer(m_portNumberingScheme));
+   json_object_set_new(root, "portRowCount", json_integer(m_portRowCount));
+   return root;
+}
index 6ad6110..b92ceb1 100644 (file)
@@ -139,3 +139,14 @@ UINT32 Rack::modifyFromMessageInternal(NXCPMessage *pRequest)
 
    return Container::modifyFromMessageInternal(pRequest);
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Rack::toJson()
+{
+   json_t *root = Container::toJson();
+   json_object_set_new(root, "height", json_integer(m_height));
+   json_object_set_new(root, "topBottomNumbering", json_boolean(m_topBottomNumbering));
+   return root;
+}
index 408d2f3..4eb561c 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -296,3 +296,15 @@ void Subnet::prepareForDeletion()
    PostEvent(EVENT_SUBNET_DELETED, g_dwMgmtNode, "isAd", m_id, m_name, &m_ipAddress, m_ipAddress.getMaskBits());
    NetObj::prepareForDeletion();
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Subnet::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "ipAddress", m_ipAddress.toJson());
+   json_object_set_new(root, "zoneId", json_integer(m_zoneId));
+   json_object_set_new(root, "syntheticMask", json_boolean(m_bSyntheticMask));
+   return root;
+}
index 1d1e465..e676cac 100644 (file)
@@ -321,3 +321,15 @@ InetAddress VPNConnector::getPeerGatewayAddr()
    }
    return InetAddress();
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *VPNConnector::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "peerGateway", json_integer(m_dwPeerGateway));
+   json_object_set_new(root, "localNetworks", json_object_array(m_localNetworks));
+   json_object_set_new(root, "remoteNetworks", json_object_array(m_remoteNetworks));
+   return root;
+}
index 8dd8010..d309b2d 100644 (file)
@@ -248,3 +248,14 @@ void Zone::dumpSubnetIndex(CONSOLE_CTX console)
 {
    DumpIndex(console, m_idxSubnetByAddr);
 }
+
+/**
+ * Serialize object to JSON
+ */
+json_t *Zone::toJson()
+{
+   json_t *root = NetObj::toJson();
+   json_object_set_new(root, "zoneId", json_integer(m_zoneId));
+   json_object_set_new(root, "proxyNodeId", json_integer(m_proxyNodeId));
+   return root;
+}
index 8a5dc31..7db91fa 100644 (file)
@@ -116,7 +116,7 @@ typedef struct __ndd_module_layout
 /**
  * Radio interface information
  */
-struct RadioInterfaceInfo
+struct LIBNXSRV_EXPORTABLE RadioInterfaceInfo
 {
        int index;
        TCHAR name[64];
@@ -124,6 +124,8 @@ struct RadioInterfaceInfo
    UINT32 channel;
    INT32 powerDBm;
    INT32 powerMW;
+
+   json_t *toJson() const;
 };
 
 /**
index 8a10de7..847a643 100644 (file)
@@ -152,12 +152,13 @@ public:
 
        virtual void updateConfig(Config *config);
        virtual void fillMessage(NXCPMessage *msg, UINT32 baseId);
+       virtual json_t *toJson() const;
 
-       UINT32 getId() { return m_id; }
-       LONG getType() { return m_type; }
-       LONG getPosX() { return m_posX; }
-       LONG getPosY() { return m_posY; }
-       UINT32 getFlags() { return m_flags; }
+       UINT32 getId() const { return m_id; }
+       LONG getType() const { return m_type; }
+       LONG getPosX() const { return m_posX; }
+       LONG getPosY() const { return m_posY; }
+       UINT32 getFlags() const { return m_flags; }
 
        void setPosition(LONG x, LONG y);
 };
@@ -178,8 +179,9 @@ public:
 
        virtual void updateConfig(Config *config);
        virtual void fillMessage(NXCPMessage *msg, UINT32 baseId);
+   virtual json_t *toJson() const;
 
-       UINT32 getObjectId() { return m_objectId; }
+       UINT32 getObjectId() const { return m_objectId; }
 };
 
 /**
@@ -202,13 +204,14 @@ public:
 
        virtual void updateConfig(Config *config);
        virtual void fillMessage(NXCPMessage *msg, UINT32 baseId);
+   virtual json_t *toJson() const;
 
-       LONG getDecorationType() { return m_decorationType; }
-       UINT32 getColor() { return m_color; }
-       const TCHAR *getTitle() { return CHECK_NULL_EX(m_title); }
+       LONG getDecorationType() const { return m_decorationType; }
+       UINT32 getColor() const { return m_color; }
+       const TCHAR *getTitle() const { return CHECK_NULL_EX(m_title); }
 
-       LONG getWidth() { return m_width; }
-       LONG getHeight() { return m_height; }
+       LONG getWidth() const { return m_width; }
+       LONG getHeight() const { return m_height; }
 };
 
 /**
@@ -217,7 +220,7 @@ public:
 class NetworkMapDCIContainer : public NetworkMapElement
 {
 protected:
-       TCHARm_xmlDCIList;
+       TCHAR *m_xmlDCIList;
 
 public:
        NetworkMapDCIContainer(UINT32 id, TCHAR* objectDCIList, UINT32 flags = 0);
@@ -227,8 +230,9 @@ public:
 
        virtual void updateConfig(Config *config);
        virtual void fillMessage(NXCPMessage *msg, UINT32 baseId);
+   virtual json_t *toJson() const;
 
-       TCHAR* getObjectDCIList() { return m_xmlDCIList; }
+       const TCHAR *getObjectDCIList() const { return m_xmlDCIList; }
 };
 
 /**
@@ -237,7 +241,7 @@ public:
 class NetworkMapDCIImage : public NetworkMapElement
 {
 protected:
-       TCHARm_config;
+       TCHAR *m_config;
 
 public:
        NetworkMapDCIImage(UINT32 id, TCHAR* objectDCIList, UINT32 flags = 0);
@@ -247,8 +251,9 @@ public:
 
        virtual void updateConfig(Config *config);
        virtual void fillMessage(NXCPMessage *msg, UINT32 baseId);
+   virtual json_t *toJson() const;
 
-       TCHAR* getObjectDCIList() { return m_config; }
+       TCHAR *getObjectDCIList() const { return m_config; }
 };
 
 /**
@@ -272,17 +277,18 @@ public:
        virtual ~NetworkMapLink();
 
        void fillMessage(NXCPMessage *msg, UINT32 baseId);
-
-       UINT32 getElement1() { return m_element1; }
-       UINT32 getElement2() { return m_element2; }
-
-       const TCHAR *getName() { return CHECK_NULL_EX(m_name); }
-       const TCHAR *getConnector1Name() { return CHECK_NULL_EX(m_connectorName1); }
-       const TCHAR *getConnector2Name() { return CHECK_NULL_EX(m_connectorName2); }
-       int getType() { return m_type; }
-       UINT32 getFlags() { return m_flags; }
-       const TCHAR *getConfig() { return CHECK_NULL_EX(m_config); }
-       bool checkFlagSet(UINT32 flag) { return (m_flags & flag) != 0; }
+   json_t *toJson() const;
+
+       UINT32 getElement1() const { return m_element1; }
+       UINT32 getElement2() const { return m_element2; }
+
+       const TCHAR *getName() const { return CHECK_NULL_EX(m_name); }
+       const TCHAR *getConnector1Name() const { return CHECK_NULL_EX(m_connectorName1); }
+       const TCHAR *getConnector2Name() const { return CHECK_NULL_EX(m_connectorName2); }
+       int getType() const { return m_type; }
+       UINT32 getFlags() const { return m_flags; }
+       const TCHAR *getConfig() const { return CHECK_NULL_EX(m_config); }
+       bool checkFlagSet(UINT32 flag) const { return (m_flags & flag) != 0; }
 
        void setName(const TCHAR *name);
        void setConnector1Name(const TCHAR *name);
index 2d1efd4..148e973 100644 (file)
@@ -989,6 +989,8 @@ public:
 
    virtual int getObjectClass() const { return OBJECT_NETWORKSERVICE; }
 
+   virtual json_t *toJson();
+
    virtual BOOL saveToDatabase(DB_HANDLE hdb);
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
@@ -1020,6 +1022,8 @@ public:
 
    virtual int getObjectClass() const { return OBJECT_VPNCONNECTOR; }
 
+   virtual json_t *toJson();
+
    virtual BOOL saveToDatabase(DB_HANDLE hdb);
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
@@ -1090,6 +1094,8 @@ public:
 
    virtual UINT32 getEffectiveSourceNode(DCObject *dco);
 
+   virtual json_t *toJson();
+
    UINT32 getListFromScript(const TCHAR *param, StringList **list);
    UINT32 getStringMapFromScript(const TCHAR *param, StringMap **map);
 
@@ -1150,6 +1156,8 @@ public:
 
    virtual NXSL_Value *createNXSLObject();
 
+   virtual json_t *toJson();
+
        void updateSystemInfo(NXCPMessage *msg);
        void updateStatus(NXCPMessage *msg);
 
@@ -1198,6 +1206,8 @@ public:
    virtual BOOL saveToDatabase(DB_HANDLE hdb);
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
 
+   virtual json_t *toJson();
+
    void statusPoll(ClientSession *session, UINT32 rqId, Queue *eventQueue, Node *controller, SNMP_Transport *snmpTransport);
 
    UINT32 getIndex() { return m_index; }
@@ -1252,6 +1262,8 @@ public:
 
    virtual NXSL_Value *createNXSLObject();
 
+   virtual json_t *toJson();
+
        bool isSyncAddr(const InetAddress& addr);
        bool isVirtualAddr(const InetAddress& addr);
        bool isResourceOnNode(UINT32 dwResource, UINT32 dwNode);
@@ -1323,6 +1335,8 @@ public:
 
    virtual NXSL_Value *createNXSLObject();
 
+   virtual json_t *toJson();
+
    UINT32 getControllerId() const { return m_controllerId; }
    UINT32 getRackId() const { return m_rackId; }
    INT16 getRackHeight() const { return m_rackHeight; }
@@ -1578,6 +1592,8 @@ public:
 
    virtual NXSL_Value *createNXSLObject();
 
+   virtual json_t *toJson();
+
        TCHAR *expandText(const TCHAR *textTemplate, StringMap *inputFields, const TCHAR *userName);
 
        Cluster *getMyCluster();
@@ -1950,6 +1966,8 @@ public:
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
 
+   virtual json_t *toJson();
+
    void addNode(Node *node) { addChild(node); node->addParent(this); calculateCompoundStatus(TRUE); }
 
        virtual bool showThresholdSummary();
@@ -2044,6 +2062,8 @@ public:
 
    virtual void calculateCompoundStatus(BOOL bForcedRecalc = FALSE);
 
+   virtual json_t *toJson();
+
    virtual NXSL_Value *createNXSLObject();
 
    void linkObject(NetObj *pObject) { addChild(pObject); pObject->addParent(this); }
@@ -2095,12 +2115,14 @@ public:
    virtual BOOL saveToDatabase(DB_HANDLE hdb);
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
+
+   virtual json_t *toJson();
 };
 
 /**
  * Zone object
  */
-class Zone : public NetObj
+class NXCORE_EXPORTABLE Zone : public NetObj
 {
 protected:
    UINT32 m_zoneId;
@@ -2127,6 +2149,8 @@ public:
 
    virtual NXSL_Value *createNXSLObject();
 
+   virtual json_t *toJson();
+
    UINT32 getZoneId() const { return m_zoneId; }
        UINT32 getProxyNodeId() const { return m_proxyNodeId; }
 
@@ -2208,6 +2232,8 @@ public:
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
 
+   virtual json_t *toJson();
+
    void lockForPoll();
    void doPoll(PollerInfo *poller);
    void check();
@@ -2246,6 +2272,8 @@ public:
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
 
+   virtual json_t *toJson();
+
        virtual bool createDeploymentMessage(NXCPMessage *msg);
        virtual bool createUninstallMessage(NXCPMessage *msg);
 
@@ -2275,6 +2303,8 @@ public:
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
 
+   virtual json_t *toJson();
+
        virtual bool createDeploymentMessage(NXCPMessage *msg);
        virtual bool createUninstallMessage(NXCPMessage *msg);
 };
@@ -2300,6 +2330,8 @@ class NXCORE_EXPORTABLE AgentPolicyLogParser : public AgentPolicy
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
 
+   virtual json_t *toJson();
+
        virtual bool createDeploymentMessage(NXCPMessage *msg);
        virtual bool createUninstallMessage(NXCPMessage *msg);
 };
@@ -2410,6 +2442,8 @@ public:
 
    virtual void onObjectDelete(UINT32 dwObjectId);
 
+   virtual json_t *toJson();
+
    void updateContent();
 
    int getBackgroundColor() { return m_backgroundColor; }
@@ -2434,7 +2468,7 @@ public:
 /**
  * Dashboard element
  */
-class DashboardElement
+class NXCORE_EXPORTABLE DashboardElement
 {
 public:
        int m_type;
@@ -2442,7 +2476,16 @@ public:
        TCHAR *m_layout;
 
        DashboardElement() { m_data = NULL; m_layout = NULL; }
-       ~DashboardElement() { safe_free(m_data); safe_free(m_layout); }
+       ~DashboardElement() { free(m_data); free(m_layout); }
+
+       json_t *toJson()
+       {
+          json_t *root = json_object();
+          json_object_set_new(root, "type", json_integer(m_type));
+          json_object_set_new(root, "data", json_string_t(m_data));
+          json_object_set_new(root, "layout", json_string_t(m_layout));
+          return root;
+       }
 };
 
 /**
@@ -2470,6 +2513,8 @@ public:
    virtual bool deleteFromDatabase(DB_HANDLE hdb);
    virtual bool loadFromDatabase(DB_HANDLE hdb, UINT32 id);
 
+   virtual json_t *toJson();
+
        virtual bool showThresholdSummary();
 };
 
index c7dcce6..670a479 100644 (file)
@@ -7,6 +7,12 @@ libnxsrv_la_LIBADD = \
        ../../snmp/libnxsnmp/libnxsnmp.la \
        ../../libnetxms/libnetxms.la
 
+if USE_INTERNAL_JANSSON
+libnxsrv_la_LIBADD += @top_srcdir@/src/jansson/libnxjansson.la
+else
+libnxsrv_la_LIBADD += -ljansson
+endif
+
 messages.c: messages.h
 
 messages.h: messages.mc
index 54268c4..18f61f1 100644 (file)
@@ -13,6 +13,12 @@ if USE_INTERNAL_ZLIB
 libnxsnmp_la_CPPFLAGS += -I../../zlib
 libnxsnmp_la_LIBADD += ../../zlib/libnxzlib.la
 endif
+if USE_INTERNAL_JANSSON
+libnxsnmp_la_LIBADD += @top_srcdir@/src/jansson/libnxjansson.la
+else
+libnxsnmp_la_LIBADD += -ljansson
+endif
+
 
 EXTRA_DIST = \
        Makefile.w32 \
index 293c92f..e7ffc55 100644 (file)
@@ -225,3 +225,19 @@ void SNMP_SecurityContext::recalculateKeys()
                CalculateSHA1Hash(buffer, m_authoritativeEngine.getIdLen() + 40, m_privKey);
        }
 }
+
+/**
+ * Serialize to JSON
+ */
+json_t *SNMP_SecurityContext::toJson() const
+{
+   json_t *root = json_object();
+   json_object_set_new(root, "securityModel", json_integer(m_securityModel));
+   json_object_set_new(root, "authName", json_string_a(m_authName));
+   json_object_set_new(root, "authPassword", json_string_a(m_authPassword));
+   json_object_set_new(root, "privPassword", json_string_a(m_privPassword));
+   json_object_set_new(root, "contextName", json_string_a(m_contextName));
+   json_object_set_new(root, "authMethod", json_integer(m_authMethod));
+   json_object_set_new(root, "privMethod", json_integer(m_privMethod));
+   return root;
+}