org.sipfoundry.sipxconfig.snmp.SnmpConfig.java Source code

Java tutorial

Introduction

Here is the source code for org.sipfoundry.sipxconfig.snmp.SnmpConfig.java

Source

/**
 *
 *
 * Copyright (c) 2012 eZuce, Inc. All rights reserved.
 * Contributed to SIPfoundry under a Contributor Agreement
 *
 * This software is free software; you can redistribute it and/or modify it under
 * the terms of the Affero General Public License (AGPL) as published by the
 * Free Software Foundation; either version 3 of the License, or (at your option)
 * any later version.
 *
 * This software 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 Affero General Public License for more
 * details.
 */
package org.sipfoundry.sipxconfig.snmp;

import static java.lang.String.format;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
import java.util.List;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.sipfoundry.sipxconfig.alarm.Alarm;
import org.sipfoundry.sipxconfig.alarm.AlarmServerManager;
import org.sipfoundry.sipxconfig.alarm.Alarms;
import org.sipfoundry.sipxconfig.cfgmgt.CfengineModuleConfiguration;
import org.sipfoundry.sipxconfig.cfgmgt.ConfigManager;
import org.sipfoundry.sipxconfig.cfgmgt.ConfigProvider;
import org.sipfoundry.sipxconfig.cfgmgt.ConfigRequest;
import org.sipfoundry.sipxconfig.commserver.Location;
import org.sipfoundry.sipxconfig.commserver.LocationsManager;
import org.sipfoundry.sipxconfig.feature.FeatureChangeRequest;
import org.sipfoundry.sipxconfig.feature.FeatureChangeValidator;
import org.sipfoundry.sipxconfig.feature.FeatureListener;
import org.sipfoundry.sipxconfig.feature.FeatureManager;
import org.sipfoundry.sipxconfig.setup.SetupListener;
import org.sipfoundry.sipxconfig.setup.SetupManager;

public class SnmpConfig implements ConfigProvider, FeatureListener, SetupListener {
    private SnmpManager m_snmp;
    private ConfigManager m_configManager;
    private AlarmServerManager m_alarmServerManager;

    public boolean setup(SetupManager manager) {
        if (!manager.isTrue(SnmpManager.FEATURE.getId())) {
            // SNMP is pretty core to the system, enable it by default
            manager.getFeatureManager().enableGlobalFeature(SnmpManager.FEATURE, true);
            manager.setTrue(SnmpManager.FEATURE.getId());
        }
        return true;
    }

    @Override
    public void replicate(ConfigManager manager, ConfigRequest request) throws IOException {
        if (!request.applies(SnmpManager.FEATURE, LocationsManager.FEATURE, Alarms.FEATURE)) {
            return;
        }
        Set<Location> locations = request.locations(manager);
        boolean enabled = manager.getFeatureManager().isFeatureEnabled(SnmpManager.FEATURE);
        boolean alarmsEnabled = manager.getFeatureManager().isFeatureEnabled(Alarms.FEATURE);
        File gdir = manager.getGlobalDataDirectory();
        SnmpSettings settings = m_snmp.getSettings();
        List<Alarm> alarms = null;
        if (alarmsEnabled) {
            alarms = m_alarmServerManager.getAlarms();
        }

        Writer cfdat = new FileWriter(new File(gdir, "snmpd.cfdat"));
        try {
            CfengineModuleConfiguration config = new CfengineModuleConfiguration(cfdat);
            config.writeClass(SnmpManager.FEATURE.getId(), enabled);
            config.writeSettings("snmp_", settings.getSettings().getSetting("cfdat"));
        } finally {
            IOUtils.closeQuietly(cfdat);
        }

        File fixDeadProcs = new File(gdir, "snmp_fix_dead_processes");
        if (enabled && settings.isFixDeadProcesses()) {
            FileUtils.touch(fixDeadProcs);
        } else if (fixDeadProcs.exists()) {
            fixDeadProcs.delete();
        }

        if (enabled) {
            for (Location location : locations) {
                File dir = manager.getLocationDataDirectory(location);
                List<ProcessDefinition> defs = m_snmp.getProcessDefinitions(location);
                Writer wtr = new FileWriter(new File(dir, "snmpd.conf.part"));
                try {
                    if (alarmsEnabled) {
                        writeActiveAlarms(wtr, alarms, location);
                    }
                    writeProcesses(wtr, defs);
                } finally {
                    IOUtils.closeQuietly(wtr);
                }
            }
        }
    }

    void writeActiveAlarms(Writer w, Collection<Alarm> alarms, Location location) throws IOException {
        for (String config : m_alarmServerManager.getActiveMonitorConfiguration(m_snmp, alarms, location)) {
            w.write(config);
            w.write(SystemUtils.LINE_SEPARATOR);
        }
    }

    void writeProcesses(Writer w, List<ProcessDefinition> defs) throws IOException {
        String eol = SystemUtils.LINE_SEPARATOR;
        for (ProcessDefinition def : defs) {
            w.write("proc ");
            w.write(def.getProcess());
            String regexp = def.getRegexp();
            if (StringUtils.isNotBlank(regexp)) {
                // max min (max of 0 means unlimited)
                w.write(" 0 1 ");
                w.write(regexp);
            }
            w.write(eol);
            if (StringUtils.isNotBlank(def.getRestartCommand())) {
                String fix = format("procfix %s $(sipx.SIPX_LIBEXECDIR)/snmp-fix-process %s %s\n", def.getProcess(),
                        def.getProcess(), def.getRestartCommand());
                w.write(fix);
            }
        }
    }

    public void setSnmpManager(SnmpManager snmp) {
        m_snmp = snmp;
    }

    public void setConfigManager(ConfigManager configManager) {
        m_configManager = configManager;
    }

    @Override
    public void featureChangePrecommit(FeatureManager manager, FeatureChangeValidator validator) {
    }

    @Override
    public void featureChangePostcommit(FeatureManager manager, FeatureChangeRequest request) {
        // cannot tell what processes will become alive/dead
        m_configManager.configureEverywhere(SnmpManager.FEATURE);
    }

    public void setAlarmServerManager(AlarmServerManager alarmServerManager) {
        m_alarmServerManager = alarmServerManager;
    }
}