org.hyperic.hq.plugin.netdevice.NetworkDevicePlatformDetector.java Source code

Java tutorial

Introduction

Here is the source code for org.hyperic.hq.plugin.netdevice.NetworkDevicePlatformDetector.java

Source

/*
 * 'NetworkDevicePlatformDetector.java' NOTE: This copyright does *not* cover
 * user programs that use HQ program services by normal system calls through the
 * application program interfaces provided as part of the Hyperic Plug-in
 * Development Kit or the Hyperic Client Development Kit - this is merely
 * considered normal use of the program, and does *not* fall under the heading
 * of "derived work". Copyright (C) [2004, 2005, 2006, 2007, 2008, 2009],
 * Hyperic, Inc. This file is part of HQ. HQ is free software; you can
 * redistribute it and/or modify it under the terms version 2 of the GNU General
 * Public License as published by the Free Software Foundation. This program 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 this
 * program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA.
 */

package org.hyperic.hq.plugin.netdevice;

import java.util.Properties;
import java.util.StringTokenizer;

import org.apache.commons.logging.Log;

import org.hyperic.hq.product.PlatformDetector;
import org.hyperic.hq.product.PlatformResource;
import org.hyperic.hq.product.PluginException;
import org.hyperic.hq.product.PluginManager;
import org.hyperic.hq.product.ProductPlugin;
import org.hyperic.snmp.SNMPClient;
import org.hyperic.snmp.SNMPException;
import org.hyperic.snmp.SNMPSession;
import org.hyperic.util.config.ConfigResponse;

public class NetworkDevicePlatformDetector extends PlatformDetector {
    private static final String PROP_VERSION = "Version";

    private Properties props;
    private boolean autoDefaults;

    public void init(PluginManager manager) throws PluginException {
        super.init(manager);

        this.props = manager.getProperties();

        this.autoDefaults = "true".equals(this.props.getProperty("snmp.autoDefaults"));

        if (!this.autoDefaults) {
            // Command-line -DsnmpCommunity=public...
            this.autoDefaults = this.props.getProperty(SNMPClient.PROP_COMMUNITY) != null;
        }
    }

    private SNMPSession getSession(ConfigResponse config) {
        try {
            return NetworkDeviceDetector.getSession(config);
        } catch (PluginException e) {
            getLog().error(e.getMessage(), e);

            return null;
        }
    }

    private String getString(SNMPSession session, String oid) {
        try {
            Object obj = session.getSingleValue(oid);

            if (obj == null) {
                return null;
            }

            String value = obj.toString();

            // Cisco has \r\n in description, strip out?
            return value;
        } catch (SNMPException e) {
            getLog().warn("Error getting '" + oid + "': " + e.getMessage());

            return null;
        }
    }

    //
    // Allow defaults to be configure in agent.properties, e.g.
    //
    // snmpCommunity.192.168.1.102 = MyCommunity
    // snmpVersion.192.168.1.102 = v1
    // snmpPort.192.168.1.102 = 1611
    // 
    private String getIpProp(String key, String ip, String defVal) {
        String propDefault = this.props.getProperty(key, defVal);

        return this.props.getProperty(key + "." + ip, propDefault);
    }

    public PlatformResource getPlatformResource(ConfigResponse config) throws PluginException {
        String platformIp = config.getValue(ProductPlugin.PROP_PLATFORM_IP);

        // For command-line -DsnmpIp=x.x.x.x usage...
        platformIp = getIpProp(SNMPClient.PROP_IP, platformIp, platformIp);

        String defaultVersion = getIpProp(SNMPClient.PROP_VERSION, platformIp, SNMPClient.VALID_VERSIONS[1]); // v2c

        String fallbackVersion = SNMPClient.VALID_VERSIONS[0]; // v1

        PlatformResource platform = super.getPlatformResource(config);

        Log log = getLog();

        ConfigResponse metricConfig;

        boolean hasConfig = config.getValue(SNMPClient.PROP_IP) != null;

        if (hasConfig) {
            // We've already been here...
            metricConfig = config;

            if (log.isDebugEnabled()) {
                log.debug("Using approved snmp config=" + metricConfig);
            }
        } else if (this.autoDefaults) {
            // Platform was just created, attempt to auto-configure...
            metricConfig = new ConfigResponse();

            metricConfig.setValue(SNMPClient.PROP_IP, platformIp);
            metricConfig.setValue(SNMPClient.PROP_VERSION, defaultVersion);

            metricConfig.setValue(SNMPClient.PROP_COMMUNITY,
                    getIpProp(SNMPClient.PROP_COMMUNITY, platformIp, SNMPClient.DEFAULT_COMMUNITY));

            metricConfig.setValue(SNMPClient.PROP_PORT,
                    getIpProp(SNMPClient.PROP_PORT, platformIp, SNMPClient.DEFAULT_PORT_STRING));

            metricConfig.setValue(NetworkDeviceDetector.PROP_IF_IX,
                    getIpProp(NetworkDeviceDetector.PROP_IF_IX, platformIp, NetworkDeviceDetector.IF_DESCR));
            if (log.isDebugEnabled()) {
                log.debug("Using default snmp config=" + metricConfig);
            }
        } else {
            if (log.isDebugEnabled()) {
                log.debug("Need user input for snmp config=" + config);
            }

            return platform;
        }

        ConfigResponse cprops = new ConfigResponse();

        SNMPSession session;

        if ((session = getSession(metricConfig)) == null) {
            return platform;
        }

        try {
            session.getSingleValue("sysName");
        } catch (SNMPException e) {
            getLog().debug("Unable to connect using " + defaultVersion + ", trying version " + fallbackVersion);

            metricConfig.setValue(SNMPClient.PROP_VERSION, fallbackVersion);

            if ((session = getSession(metricConfig)) == null) {
                return platform;
            }
        }

        String[] keys = getCustomPropertiesSchema().getOptionNames();

        for (int i = 0; i < keys.length; i++) {
            String key = keys[i];

            if (Character.isUpperCase(key.charAt(0))) {
                continue; // Not a MIB name
            }

            String val = getString(session, key);

            if (val == null) {
                log.debug("'" + key + "'==null");

                continue;
            }

            cprops.setValue(key, val);
        }

        if (!hasConfig) {
            // Should only happen when the platform is created...
            config.merge(metricConfig, false);

            platform.setProductConfig(config);
            platform.setMeasurementConfig(new ConfigResponse());

            log.debug("Setting measurement config=" + metricConfig);
        }

        String description = getString(session, "sysDescr");

        if (description != null) {
            platform.setDescription(description);

            boolean hasVersionCprop = getCustomPropertiesSchema().getOption(PROP_VERSION) != null;

            if (hasVersionCprop) {
                // This works for Cisco IOS at least...
                StringTokenizer tok = new StringTokenizer(description, " ,");

                while (tok.hasMoreTokens()) {
                    String s = tok.nextToken();

                    if (s.equalsIgnoreCase(PROP_VERSION) && tok.hasMoreTokens()) {
                        String version = tok.nextToken();

                        cprops.setValue(PROP_VERSION, version);

                        break;
                    }
                }
            }
        }

        platform.setCustomProperties(cprops);

        return platform;
    }
}