/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2006-2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.netmgt.threshd; import java.io.File; import java.net.InetAddress; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.opennms.core.utils.ThreadCategory; import org.opennms.netmgt.config.ThresholdingConfigFactory; import org.opennms.netmgt.config.threshd.Basethresholddef; import org.opennms.netmgt.config.threshd.Expression; import org.opennms.netmgt.config.threshd.ResourceFilter; import org.opennms.netmgt.config.threshd.Threshold; import org.opennms.netmgt.dao.support.ResourceTypeUtils; import org.opennms.netmgt.dao.support.RrdFileConstants; import org.opennms.netmgt.model.events.EventProxy; import org.opennms.netmgt.model.events.EventProxyException; import org.opennms.netmgt.poller.NetworkInterface; import org.opennms.netmgt.rrd.RrdException; import org.opennms.netmgt.rrd.RrdUtils; import org.opennms.netmgt.xml.event.Event; import org.opennms.netmgt.xml.event.Events; import org.opennms.netmgt.xml.event.Log; import org.opennms.netmgt.xml.event.Parm; import org.opennms.netmgt.xml.event.Value; import org.springframework.dao.DataAccessException; import org.springframework.util.Assert; /** * <P> * The SnmpThresholder class ... * </P> * * @author <A HREF="mailto:mike@opennms.org">Mike Davidson </A> * @author <A HREF="http://www.opennms.org/">OpenNMS </A> * @deprecated No longer used - see ThresholdingVisitor */ public final class SnmpThresholder implements ServiceThresholder { private String m_serviceName; private ThresholdsDao m_thresholdsDao; private Map<NetworkInterface<InetAddress>, SnmpThresholdNetworkInterface> m_snmpThresholdNetworkInterfaces; private IfInfoGetter m_ifInfoGetter; /** * <P> * Returns the name of the service that the plug-in collects ("SNMP"). * </P> * * @return The service that the plug-in collects. */ public String serviceName() { return m_serviceName; } /** * {@inheritDoc} * * <P> * Initialize the service thresholder. * </P> * @exception RuntimeException * Thrown if an unrecoverable error occurs that prevents the * plug-in from functioning. */ public void initialize(@SuppressWarnings("unchecked") Map parameters) { m_serviceName = (String)parameters.get("svcName"); setupThresholdsDao(); setupIfInfoGetter(); log().debug("initialize: successfully instantiated RRD subsystem"); m_snmpThresholdNetworkInterfaces = new ConcurrentHashMap<NetworkInterface<InetAddress>, SnmpThresholdNetworkInterface>(); } private void setupIfInfoGetter() { setIfInfoGetter(new JdbcIfInfoGetter()); } /** * <p>reinitialize</p> */ public void reinitialize() { setupThresholdsDao(); } private void setupThresholdsDao() { DefaultThresholdsDao defaultThresholdsDao = new DefaultThresholdsDao(); try { defaultThresholdsDao.setThresholdingConfigFactory(ThresholdingConfigFactory.getInstance()); defaultThresholdsDao.afterPropertiesSet(); } catch (Throwable t) { log().error("initialize: Could not initialize DefaultThresholdsDao: " + t, t); throw new RuntimeException("Could not initialize DefaultThresholdsDao: " + t, t); } setThresholdsDao(defaultThresholdsDao); } /** * Responsible for freeing up any resources held by the thresholder. */ public void release() { // Nothing to release... } /** * {@inheritDoc} * * Responsible for performing all necessary initialization for the specified * interface in preparation for thresholding. */ public void initialize(ThresholdNetworkInterface netIface, @SuppressWarnings("unchecked") Map parms) { SnmpThresholdNetworkInterface snmpThresholdNetworkInterface = new SnmpThresholdNetworkInterface(m_thresholdsDao, netIface, parms); m_snmpThresholdNetworkInterfaces.put(netIface, snmpThresholdNetworkInterface); SnmpThresholdConfiguration config = snmpThresholdNetworkInterface.getThresholdConfiguration(); if (!snmpThresholdNetworkInterface.isIPV4()) { throw new RuntimeException("Unsupported interface type, only TYPE_INET currently supported"); } if (log().isDebugEnabled()) { log().debug("initialize: dumping node thresholds defined for " + snmpThresholdNetworkInterface + ":"); for (Set<ThresholdEntity> entitySet : config.getNodeResourceType().getThresholdMap().values()) { for (ThresholdEntity entity : entitySet) { log().debug(" " + entity); } } log().debug("initialize: dumping interface thresholds defined for " + snmpThresholdNetworkInterface + ":"); for (Set<ThresholdEntity> entitySet : config.getIfResourceType().getThresholdMap().values()) { for (ThresholdEntity entity : entitySet) { log().debug(" " + entity); } } log().debug("initialize: dumping generic resources thresholds defined for " + snmpThresholdNetworkInterface + ":"); for (String resourceType : config.getGenericResourceTypeMap().keySet()) { for (Set<ThresholdEntity> entitySet : config.getGenericResourceTypeMap().get(resourceType).getThresholdMap().values()) { for (ThresholdEntity entity : entitySet) { log().debug(" " + resourceType + "." + entity); } } } } if (log().isDebugEnabled()) { log().debug("initialize: initialization completed for " + snmpThresholdNetworkInterface); } return; } /** * {@inheritDoc} * * Responsible for releasing any resources associated with the specified * interface. */ public void release(ThresholdNetworkInterface iface) { m_snmpThresholdNetworkInterfaces.remove(iface); } /** * {@inheritDoc} * * Perform threshold checking. */ public int check(ThresholdNetworkInterface netIface, EventProxy eproxy, @SuppressWarnings("unchecked") Map parms) { SnmpThresholdNetworkInterface snmpThresholdNetworkInterface = m_snmpThresholdNetworkInterfaces.get(netIface); if (snmpThresholdNetworkInterface == null) { log().warn("check: interface has not been initialized in this thresholder: " + netIface); return THRESHOLDING_FAILED; } SnmpThresholdConfiguration config = snmpThresholdNetworkInterface.getThresholdConfiguration(); // Get configuration parameters if (log().isDebugEnabled()) { log().debug("check: service= " + serviceName() + " address= " + snmpThresholdNetworkInterface.getIpAddress() + " thresholding-group=" + config.getGroupName() + " interval=" + config.getInterval() + "ms range=" + config.getRange() + " mS"); } // RRD Repository attribute if (log().isDebugEnabled()) { log().debug("check: rrd repository=" + config.getRrdRepository()); } /* * ----------------------------------------------------------- * * Perform node-level threshold checking * * ----------------------------------------------------------- */ // Get File object representing the node directory File nodeDirectory = new File(config.getRrdRepository(), snmpThresholdNetworkInterface.getNodeId().toString()); if (!RrdFileConstants.isValidRRDNodeDir(nodeDirectory)) { log().info("Node directory for " + snmpThresholdNetworkInterface.getNodeId() + "/" + snmpThresholdNetworkInterface.getIpAddress() + " does not exist or is not a valid RRD node directory."); log().info("Threshold checking failed for primary SNMP interface " + snmpThresholdNetworkInterface.getIpAddress()); return THRESHOLDING_FAILED; } // Create empty Events object to hold any threshold events generated during the thresholding check Events events = new Events(); // Date stamp for all outgoing events Date date = new Date(); try { checkNodeDir(nodeDirectory, snmpThresholdNetworkInterface, date, events); } catch (IllegalArgumentException e) { log().info("check: Threshold checking failed for primary SNMP interface " + snmpThresholdNetworkInterface.getIpAddress() + ": " + e, e); return THRESHOLDING_FAILED; } /* * ----------------------------------------------------------- * * Perform interface-level threshold checking * * ----------------------------------------------------------- */ /* * Iterate over node directory contents and call * checkInterfaceDirectory() for any/all RRD interface * directories. */ File[] files = nodeDirectory.listFiles(RrdFileConstants.INTERFACE_DIRECTORY_FILTER); if (files != null) { for (File file : files) { try { // Found interface directory... checkIfDir(file, snmpThresholdNetworkInterface, date, events); } catch (IllegalArgumentException e) { log().info("check: Threshold checking failed for primary SNMP interface " + snmpThresholdNetworkInterface.getIpAddress() + ": " + e, e); return THRESHOLDING_FAILED; } } } /* * ----------------------------------------------------------- * * Perform generic resources threshold checking * * ----------------------------------------------------------- */ /* * Iterate over generic resource directory contents and call * checkGenericResourceDirectory() for any/all RRD interface * directories. */ if (config.getGenericResourceTypeMap().size() > 0) { for (String resourceType : config.getGenericResourceTypeMap().keySet()) { File file = new File(nodeDirectory, resourceType); try { // Found resource directory... checkResourceDir(file, snmpThresholdNetworkInterface, date, events); } catch (IllegalArgumentException e) { log().info("check: Threshold checking failed for primary SNMP interface " + snmpThresholdNetworkInterface.getIpAddress() + ": " + e, e); return THRESHOLDING_FAILED; } } } // Send created events if (events.getEventCount() > 0) { try { Log eventLog = new Log(); eventLog.setEvents(events); eproxy.send(eventLog); } catch (EventProxyException e) { log().info("check: Failed sending threshold events: " + e, e); return THRESHOLDING_FAILED; } } return THRESHOLDING_SUCCEEDED; } /** * Performs threshold checking on an SNMP RRD node directory. * * @param directory * RRD repository directory * @param date * Source for timestamp to be used for all generated events * @param events * Castor events object containing any events to be generated as * a result of threshold checking. * @throws java.lang.IllegalArgumentException * if path parameter is not a directory. * @param thresholdNetworkInterface a {@link org.opennms.netmgt.threshd.SnmpThresholdNetworkInterface} object. */ protected void checkNodeDir(File directory, SnmpThresholdNetworkInterface thresholdNetworkInterface, Date date, Events events) throws IllegalArgumentException { Assert.notNull(directory, "directory argument cannot be null"); Assert.notNull(thresholdNetworkInterface, "thresholdNetworkInterface argument cannot be null"); Assert.notNull(date, "date argument cannot be null"); Assert.notNull(events, "events argument cannot be null"); SnmpThresholdConfiguration config = thresholdNetworkInterface.getThresholdConfiguration(); Assert.notNull(config, "getThresholdConfiguration() of thresholdNetworkInterface argument cannot be null"); Assert.notNull(thresholdNetworkInterface.getNetworkInterface(), "getNetworkInterface() of thresholdNetworkInterface argument cannot be null"); Assert.notNull(thresholdNetworkInterface.getNodeId(), "getNodeId() of thresholdNetworkInterface argument cannot be null"); Assert.notNull(thresholdNetworkInterface.getInetAddress(), "getInetAddress() of thresholdNetworkInterface argument cannot be null"); if (log().isDebugEnabled()) { log().debug("checkNodeDir: threshold checking node dir: " + directory.getAbsolutePath()); } Map<String, Set<ThresholdEntity>> thresholdMap = thresholdNetworkInterface.getNodeThresholdMap(); for(String threshKey :thresholdMap.keySet()) { for (ThresholdEntity thresholdEntity : thresholdMap.get(threshKey)) { processThresholdForNode(directory, thresholdNetworkInterface, date, events, thresholdEntity); } } } private List<Event> processThreshold(File directory, SnmpThresholdNetworkInterface snmpIface, ThresholdEntity threshold, Date date) { //Find out what data sources this threshold needs, check if they are available, and if so, // then get them and evaluate with them SnmpThresholdConfiguration thresholdConfiguration = snmpIface.getThresholdConfiguration(); Collection<String> requiredDatasources=threshold.getRequiredDatasources(); Map<String, Double> values=new HashMap<String,Double>(); String group = snmpIface.getThresholdConfiguration().getGroupName(); for(String ds: requiredDatasources) { File dsFile= ResourceTypeUtils.getRrdFileForDs(directory,ds); Double dsValue=null; if(dsFile.exists() && passedThresholdFilters(directory, group, threshold.getDatasourceType(), ds)) { dsValue = getDataSourceValue(thresholdConfiguration, dsFile, ds); } if(dsValue==null) { log().info("Could not get data source value for '" + ds + "'. Not evaluating threshold."); return null; } values.put(ds,dsValue); } List<Event> eventList=threshold.evaluateAndCreateEvents(values, date); return eventList; } private String getDsLabel(ThresholdEntity threshold) { String dsLabelValue = threshold.getDatasourceLabel(); if(dsLabelValue == null) { dsLabelValue = "Null"; } return dsLabelValue; } private void processThresholdForNode(File directory, SnmpThresholdNetworkInterface snmpIface, Date date, Events events, ThresholdEntity threshold) { List<Event> eventList=processThreshold(directory, snmpIface, threshold, date); if (eventList==null || eventList.size() == 0) { //Nothing to do, so return return; } completeEventListAndAddToEvents(events, eventList, snmpIface, null, getDsLabel(threshold)); } private void processThresholdForInterface(File directory, SnmpThresholdNetworkInterface snmpIface, Date date, Events events, ThresholdEntity threshold, String ifLabel, Map<String, String> ifDataMap) { List<Event> eventList=processThreshold(directory, snmpIface, threshold, date); if (eventList==null || eventList.size() == 0) { //Nothing to do, so return return; } if (ifDataMap.size() == 0 && ifLabel != null) { populateIfDataMap(ifDataMap, snmpIface.getNodeId().intValue(), ifLabel); } completeEventListAndAddToEvents(events, eventList, snmpIface, ifDataMap, getDsLabel(threshold)); } private void processThresholdForResource(File directory, SnmpThresholdNetworkInterface snmpIface, Date date, Events events, ThresholdEntity threshold, String resource) { List<Event> eventList=processThreshold(directory, snmpIface, threshold, date); if (eventList==null || eventList.size() == 0) { return; } completeEventListAndAddToEvents(events, eventList, snmpIface, null, resource); } /** * Performs threshold checking on an SNMP RRD interface directory. * * @param directory * RRD repository directory * @param snmpIface TODO * @param date * Source for timestamp to be used for all generated events * @param events * Castor events object containing any events to be generated as * a result of threshold checking. * @throws java.lang.IllegalArgumentException * if path parameter is not a directory. */ protected void checkIfDir(File directory, SnmpThresholdNetworkInterface snmpIface, Date date, Events events) throws IllegalArgumentException { // TODO: do more specific and thorough assertions on arguments // Sanity Check if (directory == null || snmpIface.getNodeId() == null || snmpIface.getInetAddress() == null || date == null || events == null) { throw new IllegalArgumentException("Null parameters not permitted."); } if (log().isDebugEnabled()) { log().debug("checkIfDir: threshold checking interface dir: " + directory.getAbsolutePath()); } String ifLabel = directory.getName(); if (log().isDebugEnabled()) { log().debug("checkIfDir: ifLabel=" + ifLabel); } Map<String, Set<ThresholdEntity>> thresholdMap = snmpIface.getInterfaceThresholdMap(ifLabel); Map<String, String> ifDataMap = new HashMap<String, String>(); for(String threshKey :thresholdMap.keySet()) { for (ThresholdEntity thresholdEntity : thresholdMap.get(threshKey)) { processThresholdForInterface(directory, snmpIface, date, events, thresholdEntity, ifLabel, ifDataMap); } } } /** * <p>checkResourceDir</p> * * @param directory a {@link java.io.File} object. * @param snmpIface a {@link org.opennms.netmgt.threshd.SnmpThresholdNetworkInterface} object. * @param date a {@link java.util.Date} object. * @param events a {@link org.opennms.netmgt.xml.event.Events} object. * @throws java.lang.IllegalArgumentException if any. */ protected void checkResourceDir(File directory, SnmpThresholdNetworkInterface snmpIface, Date date, Events events) throws IllegalArgumentException { // TODO: do more specific and thorough assertions on arguments // Sanity Check if (directory == null || snmpIface.getNodeId() == null || snmpIface.getInetAddress() == null || date == null || events == null) { throw new IllegalArgumentException("Null parameters not permitted."); } if (log().isDebugEnabled()) { log().debug("checkResourceDir: threshold checking generic resource dir: " + directory.getAbsolutePath()); } String resourceType = directory.getName(); if (!directory.exists()) { log().debug("Aborting check because this node does not support Resource Type " + resourceType); return; } SnmpThresholdConfiguration config = snmpIface.getThresholdConfiguration(); if (log().isDebugEnabled()) { log().debug("checkResourceDir: group=" + config.getGroupName() + ", resourceType=" + resourceType); } ThresholdResourceType thresholdResourceType = config.getGenericResourceTypeMap().get(resourceType); if (thresholdResourceType == null) { log().info("No generic resources for group " + config.getGroupName()); return; } Map<String, Set<ThresholdEntity>> thresholdMap = thresholdResourceType.getThresholdMap(); File[] files = directory.listFiles(); for (File file : files) { String resource = file.getName(); for(String threshKey :thresholdMap.keySet()) { if (log().isDebugEnabled()) { log().debug("checkResourceDir: resource=" + resource); } for (ThresholdEntity thresholdEntity : thresholdMap.get(threshKey)) { String dsLabelValue = getDataSourceLabel(file, snmpIface, thresholdEntity); processThresholdForResource(file, snmpIface, date, events, thresholdEntity, dsLabelValue); } } } } private ResourceFilter[] getThresholdFilters(String thresholdGroup, String dataSource) { Collection<Basethresholddef> thresholds = m_thresholdsDao.getThresholdingConfigFactory().getThresholds(thresholdGroup); for (Basethresholddef thresh : thresholds) { if (thresh instanceof Threshold) { Threshold t = (Threshold)thresh; if (t.getDsName().equals(dataSource)) { return t.getResourceFilter(); } } else { Expression e = (Expression)thresh; if (e.getExpression().indexOf(dataSource) > 0) { return e.getResourceFilter(); } } } ResourceFilter[] filters = {}; return filters; } /* * If Threshold has Filters defined for selected ThresholdGroup/DataSource/ResourceType then, apply filter rules. * TODO: What happend if getAttributeValue returns null ? */ /** * <p>passedThresholdFilters</p> * * @param resourceDir a {@link java.io.File} object. * @param thresholdGroup a {@link java.lang.String} object. * @param resourceType a {@link java.lang.String} object. * @param dataSource a {@link java.lang.String} object. * @return a boolean. */ protected boolean passedThresholdFilters(File resourceDir, String thresholdGroup, String resourceType, String dataSource) { // Find the filters for threshold definition for selected group/dataSource ResourceFilter[] filters = getThresholdFilters(thresholdGroup, dataSource); if (filters.length == 0) return true; // Threshold definition with filters must match ThresholdEntity (checking DataSource and ResourceType) log().debug("checkFilters: resource=" + resourceDir.getName() + ", group=" + thresholdGroup + ", type=" + resourceType + ", filters=" + filters.length); int count = 1; for (ResourceFilter f : filters) { log().debug("checkFilters: filter #" + count + ": field=" + f.getField() + ", regex=" + f.getContent()); count++; // Read Resource Attribute and apply filter rules if attribute is not null String attr = getAttributeValue(resourceDir, resourceType, f.getField()); if (attr != null) { Pattern p = Pattern.compile(f.getContent()); Matcher m = p.matcher(attr); boolean pass = m.find(); log().debug("checkFilters: the value of " + dataSource + " is " + attr + ". Pass filter? " + pass); if (pass) return true; } } return false; } private void completeEventListAndAddToEvents(Events events, List<Event> eventList, SnmpThresholdNetworkInterface snmpIface, Map<String, String> ifDataMap, String dsLabelValue) { // TODO: do more specific and thorough assertions on arguments for (Event event : eventList) { /* Integer nodeId = snmpIface.getNodeId(); InetAddress primary = snmpIface.getInetAddress(); if (nodeId == null || primary == null) { throw new IllegalArgumentException("nodeid, primary, and threshold cannot be null."); } if (log().isDebugEnabled()) { log().debug("createEvent: nodeId=" + nodeId + " primaryAddr=" + primary + " ds=" + threshold.getDsName() + " uei=" + uei); if (ifDataMap != null) { log().debug("createEvent: specific interface data: ifAddr=" + ifDataMap.get("ipaddr") + " macAddr=" + ifDataMap.get("snmpphysaddr") + " ifName=" + ifDataMap.get("snmpifname") + " ifDescr=" + ifDataMap.get("snmpifdescr") + " ifIndex=" + ifDataMap.get("snmpifindex") + " ifLabel=" + ifDataMap.get("iflabel")); } } */ // create the event to be sent event.setNodeid(snmpIface.getNodeId().longValue()); event.setService(this.serviceName()); // Set event interface if (ifDataMap == null || ifDataMap.get("ipaddr") == null) { // Node level datasource if (snmpIface.getInetAddress() != null) { event.setInterfaceAddress(snmpIface.getInetAddress()); } } else { /* * Interface-level datasource * * NOTE: Non-IP interfaces will have an * address of "0.0.0.0". */ String ifAddr = ifDataMap.get("ipaddr"); event.setInterface(ifAddr); } // Add appropriate parms final List<Parm> eventParms = event.getParmCollection(); Parm eventParm; Value parmValue; // Add datasource label if (dsLabelValue != null) { eventParm = new Parm(); eventParm.setParmName("label"); parmValue = new Value(); parmValue.setContent(dsLabelValue); eventParm.setValue(parmValue); eventParms.add(eventParm); } // Add interface parms if available if (ifDataMap != null && ifDataMap.get("iflabel") != null) { // Add ifLabel eventParm = new Parm(); eventParm.setParmName("ifLabel"); parmValue = new Value(); parmValue.setContent(ifDataMap.get("iflabel")); eventParm.setValue(parmValue); eventParms.add(eventParm); } if (ifDataMap != null && ifDataMap.get("snmpifindex") != null) { // Add ifIndex eventParm = new Parm(); eventParm.setParmName("ifIndex"); parmValue = new Value(); parmValue.setContent(ifDataMap.get("snmpifindex")); eventParm.setValue(parmValue); eventParms.add(eventParm); } events.addEvent(event); } } /** * Use RRD strategy to "fetch" value of the datasource from the RRD file * using the threshold configuration. */ private Double getDataSourceValue(SnmpThresholdConfiguration thresholdConfiguration, File file, String datasource) { Double dsValue; try { if (thresholdConfiguration.getRange() != 0) { if (log().isDebugEnabled()) { log().debug("Checking datasource '" + datasource + "' for values within " + thresholdConfiguration.getRange() + " milliseconds of last possible PDP with interval " + thresholdConfiguration.getInterval() + "."); } dsValue = RrdUtils.fetchLastValueInRange(file.getAbsolutePath(), datasource, thresholdConfiguration.getInterval(), thresholdConfiguration.getRange()); } else { if (log().isDebugEnabled()) { log().debug("Checking datasource '" + datasource + "' for value of last possible PDP only with interval " + thresholdConfiguration.getInterval() + "."); } dsValue = RrdUtils.fetchLastValue(file.getAbsolutePath(), datasource, thresholdConfiguration.getInterval()); } } catch (NumberFormatException e) { log().warn("Unable to convert retrieved value for datasource '" + datasource + "' to a double: " + e); return null; } catch (RrdException e) { log().info("An error occurred retriving the last value for datasource '" + datasource + "': " + e, e); return null; } if (dsValue == null) { log().info("fetch value for data source '" + datasource + "' was null."); return null; } if (dsValue.isNaN()) { log().info("fetch value for data source '" + datasource + "' was NaN."); return null; } return dsValue; } /** * File name has format: <datsource><extension> * * @return the fileName with the <extension> portion stripped off the end. * @param fileName a {@link java.lang.String} object. */ protected String stripRrdExtension(String fileName) { if (!fileName.endsWith(RrdUtils.getExtension())) { log().info("stripRrdExtension: File '" + fileName + "' does not end with the RRD extension '" + RrdUtils.getExtension() + "'."); return null; } return fileName.substring(0, fileName.lastIndexOf(RrdUtils.getExtension())); } /* * This directly access database to get OnmsSnmpInterface (snmpinterface table on database) data * for selected Interface ID. */ private String getAttributeValue(File resourceDirectory, String resourceType, String attribute) { log().debug("Getting Value for " + resourceType + "::" + attribute + " from " + resourceDirectory); String value = null; // Interface ID or Resource ID from data path if (attribute.equals("ID")) { return resourceDirectory.getName(); } try { if (resourceType.equals("if")) { String ifLabel = resourceDirectory.getName(); int nodeId = Integer.parseInt(resourceDirectory.getParentFile().getName()); Map<String,String> info = new HashMap<String,String>(); populateIfDataMap(info, nodeId, ifLabel); value = info.get(attribute); } else { value = ResourceTypeUtils.getStringProperty(resourceDirectory, attribute); } } catch (Throwable e) { log().warn("Can't get value for attribute " + attribute + ". " + e, e); } return value; } /** * Get the value to use for the ds-label from this threshold */ private String getDataSourceLabel(File directory, SnmpThresholdNetworkInterface snmpIface, ThresholdEntity threshold) { String dsLabelValue = null; try { String key = threshold.getDatasourceLabel(); dsLabelValue = (key == null ? null : ResourceTypeUtils.getStringProperty(directory, key)); } catch (DataAccessException e) { if (log().isDebugEnabled()) { log().debug ("getDataSourceLabel: I/O exception when looking for strings.properties file for node id: " + snmpIface.getNodeId() + " looking here: " + directory + ": " + e, e); } } return (dsLabelValue == null ? "Unknown" : dsLabelValue); } /** * ifLabel will either be set to null for node level * datasource values * or to a specific interface in the case of an * interface level datasource. * * ifLabel has the following format: * <ifName|ifDescr>-<macAddr> * * Call IfLabel.getInterfaceInfoFromLabel() utility * method to retrieve * data from the 'snmpInterfaces' table for this * interface. This method * will return a Map of database values keyed by field * name. */ private void populateIfDataMap(Map<String, String> ifDataMap, int nodeId, String ifLabel) { Map<String, String> ifInfo = m_ifInfoGetter.getIfInfoForNodeAndLabel(nodeId, ifLabel); ifDataMap.putAll(ifInfo); // Adding ifLabel value to the map for potential use by the createEvent() method ifDataMap.put("iflabel", ifLabel); } /** * <p>getAttributeMap</p> * * @param resourceType a {@link org.opennms.netmgt.threshd.ThresholdResourceType} object. * @return a {@link java.util.Map} object. */ protected static Map<String, Set<ThresholdEntity>> getAttributeMap(ThresholdResourceType resourceType) { Map<String, Set<ThresholdEntity>> thresholdMap = new HashMap<String, Set<ThresholdEntity>>(); /* * Iterate over base interface threshold map and clone each * ThresholdEntity object and add it to the threshold map. * for this interface. */ for (Set<ThresholdEntity> entitySet : resourceType.getThresholdMap().values()) { for (ThresholdEntity entity : entitySet) { if (!thresholdMap.containsKey(entity.getDataSourceExpression())) { thresholdMap.put(entity.getDataSourceExpression(), new LinkedHashSet<ThresholdEntity>()); } thresholdMap.get(entity.getDataSourceExpression()).add(entity.clone()); } } return Collections.unmodifiableMap(thresholdMap); } private ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } /** * <p>getThresholdsDao</p> * * @return a {@link org.opennms.netmgt.threshd.ThresholdsDao} object. */ public ThresholdsDao getThresholdsDao() { return m_thresholdsDao; } /** * <p>setThresholdsDao</p> * * @param thresholdsDao a {@link org.opennms.netmgt.threshd.ThresholdsDao} object. */ public void setThresholdsDao(ThresholdsDao thresholdsDao) { m_thresholdsDao = thresholdsDao; } /** * <p>getIfInfoGetter</p> * * @return a {@link org.opennms.netmgt.threshd.IfInfoGetter} object. */ public IfInfoGetter getIfInfoGetter() { return m_ifInfoGetter; } /** * <p>setIfInfoGetter</p> * * @param ifInfoGetter a {@link org.opennms.netmgt.threshd.IfInfoGetter} object. */ public void setIfInfoGetter(IfInfoGetter ifInfoGetter) { m_ifInfoGetter = ifInfoGetter; } }