2 ** NetXMS - Network Management System
3 ** Copyright (C) 2003-2016 Victor Kirhenshtein
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 Chassis::Chassis() : DataCollectionTarget()
37 * Create new chassis object
39 Chassis::Chassis(const TCHAR
*name
, UINT32 controllerId
) : DataCollectionTarget(name
)
41 m_controllerId
= controllerId
;
55 * Called by client session handler to check if threshold summary should be shown for this object.
57 bool Chassis::showThresholdSummary()
65 void Chassis::updateRackBinding()
67 bool rackFound
= false;
68 ObjectArray
<NetObj
> deleteList(16, 16, false);
71 for(int i
= 0; i
< m_parentList
->size(); i
++)
73 NetObj
*object
= m_parentList
->get(i
);
74 if (object
->getObjectClass() != OBJECT_RACK
)
76 if (object
->getId() == m_rackId
)
81 object
->incRefCount();
82 deleteList
.add(object
);
86 for(int n
= 0; n
< deleteList
.size(); n
++)
88 NetObj
*rack
= deleteList
.get(n
);
89 DbgPrintf(5, _T("Chassis::updateRackBinding(%s [%d]): delete incorrect rack binding %s [%d]"), m_name
, m_id
, rack
->getName(), rack
->getId());
90 rack
->deleteChild(this);
95 if (!rackFound
&& (m_rackId
!= 0))
97 Rack
*rack
= (Rack
*)FindObjectById(m_rackId
, OBJECT_RACK
);
100 DbgPrintf(5, _T("Chassis::updateRackBinding(%s [%d]): add rack binding %s [%d]"), m_name
, m_id
, rack
->getName(), rack
->getId());
101 rack
->addChild(this);
106 DbgPrintf(5, _T("Chassis::updateRackBinding(%s [%d]): rack object [%d] not found"), m_name
, m_id
, m_rackId
);
112 * Update controller binding
114 void Chassis::updateControllerBinding()
116 bool controllerFound
= false;
118 lockParentList(true);
119 for(int i
= 0; i
< m_parentList
->size(); i
++)
121 NetObj
*object
= m_parentList
->get(i
);
122 if (object
->getId() == m_controllerId
)
124 controllerFound
= true;
130 if ((m_flags
& CHF_BIND_UNDER_CONTROLLER
) && !controllerFound
)
132 NetObj
*controller
= FindObjectById(m_controllerId
);
133 if (controller
!= NULL
)
135 controller
->addChild(this);
136 addParent(controller
);
140 nxlog_debug(4, _T("Chassis::updateControllerBinding(%s [%d]): controller object with ID %d not found"), m_name
, m_id
, m_controllerId
);
143 else if (!(m_flags
& CHF_BIND_UNDER_CONTROLLER
) && controllerFound
)
145 NetObj
*controller
= FindObjectById(m_controllerId
);
146 if (controller
!= NULL
)
148 controller
->deleteChild(this);
149 deleteParent(controller
);
155 * Create NXCP message with object's data
157 void Chassis::fillMessageInternal(NXCPMessage
*msg
)
159 DataCollectionTarget::fillMessageInternal(msg
);
160 msg
->setField(VID_CONTROLLER_ID
, m_controllerId
);
161 msg
->setField(VID_RACK_ID
, m_rackId
);
162 msg
->setField(VID_RACK_IMAGE
, m_rackImage
);
163 msg
->setField(VID_RACK_POSITION
, m_rackPosition
);
164 msg
->setField(VID_RACK_HEIGHT
, m_rackHeight
);
168 * Modify object from NXCP message
170 UINT32
Chassis::modifyFromMessageInternal(NXCPMessage
*request
)
172 if (request
->isFieldExist(VID_CONTROLLER_ID
))
173 m_controllerId
= request
->getFieldAsUInt32(VID_CONTROLLER_ID
);
174 if (request
->isFieldExist(VID_RACK_ID
))
176 m_rackId
= request
->getFieldAsUInt32(VID_RACK_ID
);
179 if (request
->isFieldExist(VID_RACK_IMAGE
))
180 m_rackImage
= request
->getFieldAsGUID(VID_RACK_IMAGE
);
181 if (request
->isFieldExist(VID_RACK_POSITION
))
182 m_rackPosition
= request
->getFieldAsInt16(VID_RACK_POSITION
);
183 if (request
->isFieldExist(VID_RACK_HEIGHT
))
184 m_rackHeight
= request
->getFieldAsInt16(VID_RACK_HEIGHT
);
186 return DataCollectionTarget::modifyFromMessageInternal(request
);
192 BOOL
Chassis::saveToDatabase(DB_HANDLE hdb
)
195 bool success
= saveCommonProperties(hdb
);
199 if (IsDatabaseRecordExist(hdb
, _T("chassis"), _T("id"), m_id
))
200 hStmt
= DBPrepare(hdb
, _T("UPDATE chassis SET controller_id=?,rack_id=?,rack_image=?,rack_position=?,rack_height=?,flags=? WHERE id=?"));
202 hStmt
= DBPrepare(hdb
, _T("INSERT INTO chassis (controller_id,rack_id,rack_image,rack_position,rack_height,flags,id) VALUES (?,?,?,?,?,?,?)"));
205 DBBind(hStmt
, 1, DB_SQLTYPE_INTEGER
, m_controllerId
);
206 DBBind(hStmt
, 2, DB_SQLTYPE_INTEGER
, m_rackId
);
207 DBBind(hStmt
, 3, DB_SQLTYPE_VARCHAR
, m_rackImage
);
208 DBBind(hStmt
, 4, DB_SQLTYPE_INTEGER
, m_rackPosition
);
209 DBBind(hStmt
, 5, DB_SQLTYPE_INTEGER
, m_rackHeight
);
210 DBBind(hStmt
, 6, DB_SQLTYPE_INTEGER
, m_flags
);
211 DBBind(hStmt
, 7, DB_SQLTYPE_INTEGER
, m_id
);
212 success
= DBExecute(hStmt
);
213 DBFreeStatement(hStmt
);
224 lockDciAccess(false);
225 for(int i
= 0; (i
< m_dcObjects
->size()) && success
; i
++)
226 success
= m_dcObjects
->get(i
)->saveToDatabase(hdb
);
232 success
= saveACLToDB(hdb
);
238 * Delete from database
240 bool Chassis::deleteFromDatabase(DB_HANDLE hdb
)
242 bool success
= DataCollectionTarget::deleteFromDatabase(hdb
);
245 success
= executeQueryOnObject(hdb
, _T("DELETE FROM chassis WHERE id=?"));
253 bool Chassis::loadFromDatabase(DB_HANDLE hdb
, UINT32 id
)
256 if (!loadCommonProperties(hdb
))
258 nxlog_debug(2, _T("Cannot load common properties for chassis object %d"), id
);
262 DB_STATEMENT hStmt
= DBPrepare(hdb
, _T("SELECT controller_id,rack_id,rack_image,rack_position,rack_height,flags FROM chassis WHERE id=?"));
266 DBBind(hStmt
, 1, DB_SQLTYPE_INTEGER
, id
);
267 DB_RESULT hResult
= DBSelectPrepared(hStmt
);
270 DBFreeStatement(hStmt
);
274 m_controllerId
= DBGetFieldULong(hResult
, 0, 0);
275 m_rackId
= DBGetFieldULong(hResult
, 0, 1);
276 m_rackImage
= DBGetFieldGUID(hResult
, 0, 2);
277 m_rackPosition
= DBGetFieldULong(hResult
, 0, 3);
278 m_rackHeight
= DBGetFieldULong(hResult
, 0, 4);
279 m_flags
= DBGetFieldULong(hResult
, 0, 5);
281 DBFreeResult(hResult
);
282 DBFreeStatement(hStmt
);
285 loadItemsFromDB(hdb
);
286 for(int i
= 0; i
< m_dcObjects
->size(); i
++)
287 if (!m_dcObjects
->get(i
)->loadThresholdsFromDB(hdb
))
296 * Link related objects after loading from database
298 void Chassis::linkObjects()
300 DataCollectionTarget::linkObjects();
301 updateControllerBinding();
305 * Called when data collection configuration changed
307 void Chassis::onDataCollectionChange()
309 Node
*controller
= (Node
*)FindObjectById(m_controllerId
, OBJECT_NODE
);
310 if (controller
== NULL
)
312 nxlog_debug(4, _T("Chassis::onDataCollectionChange(%s [%d]): cannot find controller node object with id %d"), m_name
, m_id
, m_controllerId
);
315 controller
->relatedNodeDataCollectionChanged();
319 * Collect info for SNMP proxy and DCI source (proxy) nodes
321 void Chassis::collectProxyInfo(ProxyInfo
*info
)
323 Node
*controller
= (Node
*)FindObjectById(m_controllerId
, OBJECT_NODE
);
324 if (controller
== NULL
)
326 nxlog_debug(4, _T("Chassis::collectProxyInfo(%s [%d]): cannot find controller node object with id %d"), m_name
, m_id
, m_controllerId
);
330 bool snmpProxy
= (controller
->getEffectiveSnmpProxy() == info
->proxyId
);
331 bool isTarget
= false;
333 lockDciAccess(false);
334 for(int i
= 0; i
< m_dcObjects
->size(); i
++)
336 DCObject
*dco
= m_dcObjects
->get(i
);
337 if (dco
->getStatus() == ITEM_STATUS_DISABLED
)
340 if (((snmpProxy
&& (dco
->getDataSource() == DS_SNMP_AGENT
) && (dco
->getSourceNode() == 0)) ||
341 ((dco
->getDataSource() == DS_NATIVE_AGENT
) && (dco
->getSourceNode() == info
->proxyId
))) &&
342 dco
->hasValue() && (dco
->getAgentCacheMode() == AGENT_CACHE_ON
))
344 addProxyDataCollectionElement(info
, dco
);
345 if (dco
->getDataSource() == DS_SNMP_AGENT
)
352 addProxySnmpTarget(info
, controller
);
356 * Create NXSL object for this object
358 NXSL_Value
*Chassis::createNXSLObject()
360 return new NXSL_Value(new NXSL_Object(&g_nxslChassisClass
, this));
364 * Get effective source node for given data collection object
366 UINT32
Chassis::getEffectiveSourceNode(DCObject
*dco
)
368 if (dco
->getSourceNode() != 0)
369 return dco
->getSourceNode();
370 if ((dco
->getDataSource() == DS_NATIVE_AGENT
) ||
371 (dco
->getDataSource() == DS_SMCLP
) ||
372 (dco
->getDataSource() == DS_SNMP_AGENT
) ||
373 (dco
->getDataSource() == DS_WINPERF
))
375 return m_controllerId
;
381 * Update controller binding flag
383 void Chassis::setBindUnderController(bool doBind
)
387 m_flags
|= CHF_BIND_UNDER_CONTROLLER
;
389 m_flags
&= ~CHF_BIND_UNDER_CONTROLLER
;
392 updateControllerBinding();