private void loadAttributeGroupList(final WmiCollection collection) { for (final Wpm wpm : collection.getWpms().getWpm()) { final AttributeGroupType attribGroupType1 = new AttributeGroupType(wpm.getName(), wpm.getIfType()); m_groupTypeList.put(wpm.getName(), attribGroupType1); } }
private void loadAttributeTypeList(final WmiCollection collection) { for (final Wpm wpm : collection.getWpms().getWpm()) { for (final Attrib attrib : wpm.getAttrib()) { final AttributeGroupType attribGroupType = m_groupTypeList.get(wpm.getName()); final WmiCollectionAttributeType attribType = new WmiCollectionAttributeType(attrib, attribGroupType); m_attribTypeList.put(attrib.getName(), attribType); } } }
private boolean isGroupAvailable(final WmiAgentState agentState, final Wpm wpm) { LOG.debug( "Checking availability of group {} via object {} of class {} in namespace {}", wpm.getName(), wpm.getKeyvalue(), wpm.getWmiClass(), wpm.getWmiNamespace()); WmiManager manager = null; /* * We provide a bogus comparison value and use an operator of "NOOP" * to ensure that, regardless of results, we receive a result and perform * no logic. We're only validating that the agent is reachable and gathering * the result objects. */ try { // Get and initialize the WmiManager manager = agentState.getManager(); manager.setNamespace(wpm.getWmiNamespace()); manager.init(); final WmiParams params = new WmiParams( WmiParams.WMI_OPERATION_INSTANCEOF, "not-applicable", "NOOP", wpm.getWmiClass(), wpm.getKeyvalue()); final WmiResult result = manager.performOp(params); final boolean isAvailable = (result.getResultCode() == WmiResult.RES_STATE_OK); agentState.setGroupIsAvailable(wpm.getName(), isAvailable); LOG.debug("Group {} is {}{}.", wpm.getName(), (isAvailable ? "" : "not "), "available"); } catch (final WmiException e) { // Log a warning signifying that this group is unavailable. LOG.warn("Error checking group ({}) availability.", wpm.getName(), e); // Set the group as unavailable. agentState.setGroupIsAvailable(wpm.getName(), false); // And then continue on to check the next wpm entry. return false; } finally { if (manager != null) { try { manager.close(); } catch (WmiException e) { LOG.warn("An error occurred closing the WMI Manager", e); } } } return true; }
/** {@inheritDoc} */ @Override public CollectionSet collect( final CollectionAgent agent, final EventProxy eproxy, final Map<String, Object> parameters) { String collectionName = ParameterMap.getKeyedString( parameters, "collection", ParameterMap.getKeyedString(parameters, "wmi-collection", null)); // Find attributes to collect - check groups in configuration. For each, // check scheduled nodes to see if that group should be collected final WmiCollection collection = WmiDataCollectionConfigFactory.getInstance().getWmiCollection(collectionName); final WmiAgentState agentState = m_scheduledNodes.get(agent.getNodeId()); // Load the attribute group types. loadAttributeGroupList(collection); // Load the attribute types. loadAttributeTypeList(collection); // Create a new collection set. final WmiCollectionSet collectionSet = new WmiCollectionSet(); collectionSet.setCollectionTimestamp(new Date()); final WmiSingleInstanceCollectionResource nodeResource = new WmiSingleInstanceCollectionResource(agent); // Iterate through the WMI collection groups. for (final Wpm wpm : collection.getWpms().getWpm()) { // A wpm consists of a list of attributes, identified by name if (agentState.shouldCheckAvailability(wpm.getName(), wpm.getRecheckInterval())) { if (!isGroupAvailable(agentState, wpm)) { continue; } } if (agentState.groupIsAvailable(wpm.getName())) { WmiClient client = null; // Collect the data try { // Tell the agent to connect agentState.connect(wpm.getWmiNamespace()); // And retrieve the client object for working. client = (WmiClient) agentState.getWmiClient(); // Retrieve the WbemObjectSet from the class defined on the group. final OnmsWbemObjectSet wOS = client.performInstanceOf(wpm.getWmiClass()); // If we received a WbemObjectSet result, lets go through it and collect it. if (wOS != null) { // Go through each object (class instance) in the object set. for (int i = 0; i < wOS.count(); i++) { // Create a new collection resource. WmiCollectionResource resource = null; // Fetch our WBEM Object final OnmsWbemObject obj = wOS.get(i); // If this is multi-instance, fetch the instance name and store it. if (wOS.count() > 1) { // Fetch the value of the key value. e.g. Name. final OnmsWbemProperty prop = obj.getWmiProperties().getByName(wpm.getKeyvalue()); final Object propVal = prop.getWmiValue(); String instance = null; if (propVal instanceof String) { instance = (String) propVal; } else { instance = propVal.toString(); } resource = new WmiMultiInstanceCollectionResource(agent, instance, wpm.getResourceType()); } else { resource = nodeResource; } for (final Attrib attrib : wpm.getAttrib()) { final OnmsWbemProperty prop = obj.getWmiProperties().getByName(attrib.getWmiObject()); final WmiCollectionAttributeType attribType = m_attribTypeList.get(attrib.getName()); resource.setAttributeValue(attribType, prop.getWmiValue().toString()); } collectionSet.getCollectionResources().add(resource); } } } catch (final WmiException e) { LOG.info("unable to collect params for wpm '{}'", wpm.getName(), e); } finally { if (client != null) { try { client.disconnect(); } catch (final WmiException e) { LOG.warn("An error occurred disconnecting while collecting from WMI.", e); } } } } } collectionSet.setStatus(ServiceCollector.COLLECTION_SUCCEEDED); return collectionSet; }