/******************************************************************************* * 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.web.admin.pollerConfig; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.ValidationException; import org.opennms.core.utils.ConfigFileConstants; import org.opennms.netmgt.config.CapsdConfig; import org.opennms.netmgt.config.CapsdConfigFactory; import org.opennms.netmgt.config.PollerConfig; import org.opennms.netmgt.config.PollerConfigFactory; import org.opennms.netmgt.config.capsd.CapsdConfiguration; import org.opennms.netmgt.config.capsd.ProtocolPlugin; import org.opennms.netmgt.config.poller.Monitor; import org.opennms.netmgt.config.poller.PollerConfiguration; import org.opennms.netmgt.config.poller.Service; import org.opennms.web.api.Util; /** * A servlet that handles managing or unmanaging interfaces and services on a * node * * @author <A HREF="mailto:jacinta@opennms.org">Jacinta Remedios </A> * @author <A HREF="http://www.opennms.org/">OpenNMS </A> * @author <A HREF="mailto:jacinta@opennms.org">Jacinta Remedios </A> * @author <A HREF="http://www.opennms.org/">OpenNMS </A> * @version $Id: $ * @since 1.8.1 */ public class AddPollerConfigServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 8025629129971135727L; PollerConfiguration pollerConfig = null; CapsdConfiguration capsdConfig = null; protected String redirectSuccess; Map<String, Service> pollerServices = new HashMap<String, Service>(); Map<String, ProtocolPlugin> capsdProtocols = new HashMap<String, ProtocolPlugin>(); List<ProtocolPlugin> capsdColl = new ArrayList<ProtocolPlugin>(); org.opennms.netmgt.config.poller.Package pkg = null; Collection<ProtocolPlugin> pluginColl = null; Properties props = new Properties(); PollerConfig pollerFactory = null; CapsdConfig capsdFactory = null; boolean errorflag = false; /** * <p>init</p> * * @throws javax.servlet.ServletException if any. */ public void init() throws ServletException { ServletConfig config = this.getServletConfig(); try { props.load(new FileInputStream(ConfigFileConstants.getFile(ConfigFileConstants.POLLER_CONF_FILE_NAME))); PollerConfigFactory.init(); pollerFactory = PollerConfigFactory.getInstance(); pollerConfig = pollerFactory.getConfiguration(); if (pollerConfig == null) { // response.sendRedirect( "error.jsp?error=2"); errorflag = true; throw new ServletException("Poller Configuration file is empty"); } CapsdConfigFactory.init(); capsdFactory = CapsdConfigFactory.getInstance(); capsdConfig = capsdFactory.getConfiguration(); if (capsdConfig == null) { // response.sendRedirect( "error.jsp?error=3"); errorflag = true; throw new ServletException("Capsd Configuration file is empty"); } } catch (Throwable e) { throw new ServletException(e.getMessage()); } initPollerServices(); initCapsdProtocols(); this.redirectSuccess = config.getInitParameter("redirect.success"); if (this.redirectSuccess == null) { throw new ServletException("Missing required init parameter: redirect.success"); } } /** * <p>reloadFiles</p> * * @throws javax.servlet.ServletException if any. */ public void reloadFiles() throws ServletException { ServletConfig config = this.getServletConfig(); try { props.load(new FileInputStream(ConfigFileConstants.getFile(ConfigFileConstants.POLLER_CONF_FILE_NAME))); PollerConfigFactory.init(); pollerFactory = PollerConfigFactory.getInstance(); pollerConfig = pollerFactory.getConfiguration(); if (pollerConfig == null) { // response.sendRedirect( "error.jsp?error=2"); errorflag = true; throw new ServletException("Poller Configuration file is empty"); } CapsdConfigFactory.init(); capsdFactory = CapsdConfigFactory.getInstance(); capsdConfig = capsdFactory.getConfiguration(); if (capsdConfig == null) { errorflag = true; // response.sendRedirect( "error.jsp?error=3"); throw new ServletException("Capsd Configuration file is empty"); } } catch (Throwable e) { throw new ServletException(e.getMessage()); } initPollerServices(); initCapsdProtocols(); this.redirectSuccess = config.getInitParameter("redirect.success"); if (this.redirectSuccess == null) { throw new ServletException("Missing required init parameter: redirect.success"); } } /** * <p>initCapsdProtocols</p> */ public void initCapsdProtocols() { capsdProtocols = new HashMap<String, ProtocolPlugin>(); pluginColl = getProtocolPlugins(); if (pluginColl != null) { Iterator<ProtocolPlugin> pluginiter = pluginColl.iterator(); while (pluginiter.hasNext()) { ProtocolPlugin plugin = pluginiter.next(); capsdColl.add(plugin); capsdProtocols.put(plugin.getProtocol(), plugin); } } } private List<ProtocolPlugin> getProtocolPlugins() { return capsdConfig.getProtocolPluginCollection(); } /** * <p>initPollerServices</p> */ public void initPollerServices() { pollerServices = new HashMap<String, Service>(); Collection<org.opennms.netmgt.config.poller.Package> packageColl = getPackages(); if (packageColl != null) { Iterator<org.opennms.netmgt.config.poller.Package> pkgiter = packageColl.iterator(); if (pkgiter.hasNext()) { pkg = pkgiter.next(); Collection<Service> svcColl = getServicesForPackage(); Iterator<Service> svcIter = svcColl.iterator(); Service svcProp = null; while (svcIter.hasNext()) { svcProp = svcIter.next(); pollerServices.put(svcProp.getName(), svcProp); } } } } private List<Service> getServicesForPackage() { return pkg.getServiceCollection(); } private List<org.opennms.netmgt.config.poller.Package> getPackages() { return pollerConfig.getPackageCollection(); } /** {@inheritDoc} */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String user_id = request.getRemoteUser(); errorflag = false; reloadFiles(); // String query = request.getQueryString(); // if(query != null) { String check1 = request.getParameter("check1"); String name1 = request.getParameter("name1"); String protoArray1 = request.getParameter("protArray1"); String port1 = request.getParameter("port1"); List<String> checkedList = new ArrayList<String>(); if (name1 != null && !name1.equals("")) { addPollerInfo(check1, name1, port1, user_id, protoArray1, response, request); if (errorflag) { return; } checkedList.add(name1); addCapsdInfo(name1, port1, user_id, protoArray1, response, request); if (!errorflag) { props.setProperty("service." + name1 + ".protocol", protoArray1); } else { return; } } props.store(new FileOutputStream(ConfigFileConstants.getFile(ConfigFileConstants.POLLER_CONF_FILE_NAME)), null); Writer poller_fileWriter = new OutputStreamWriter(new FileOutputStream(ConfigFileConstants.getFile(ConfigFileConstants.POLLER_CONFIG_FILE_NAME)), "UTF-8"); Writer capsd_fileWriter = new OutputStreamWriter(new FileOutputStream(ConfigFileConstants.getFile(ConfigFileConstants.CAPSD_CONFIG_FILE_NAME)), "UTF-8"); try { Marshaller.marshal(pollerConfig, poller_fileWriter); Marshaller.marshal(capsdConfig, capsd_fileWriter); } catch (MarshalException e) { throw new ServletException(e); } catch (ValidationException e) { throw new ServletException(e); } } if (!errorflag) { response.sendRedirect(this.redirectSuccess); } } /** * <p>addCapsdInfo</p> * * @param name a {@link java.lang.String} object. * @param port a {@link java.lang.String} object. * @param user a {@link java.lang.String} object. * @param protocol a {@link java.lang.String} object. * @param response a {@link javax.servlet.http.HttpServletResponse} object. * @param request a {@link javax.servlet.http.HttpServletRequest} object. * @throws javax.servlet.ServletException if any. * @throws java.io.IOException if any. */ @SuppressWarnings("null") public void addCapsdInfo(String name, String port, String user, String protocol, HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException { // Check to see if the name is duplicate of the already specified names // first. Collection<ProtocolPlugin> tmpCapsd = getProtocolPlugins(); Iterator<ProtocolPlugin> iter = tmpCapsd.iterator(); Service pollersvc = null; while (iter.hasNext()) { ProtocolPlugin svc = iter.next(); if (svc.getProtocol().equals(name)) { // delete from the poller configuration. Collection<Service> tmpPollers = getServicesForPackage(); Iterator<Service> polleriter = tmpPollers.iterator(); boolean removePoller = false; while (polleriter.hasNext()) { pollersvc = polleriter.next(); if (pollersvc.getName().equals(name)) { removePoller = true; break; } } if (removePoller) { Collection<Service> tmpPoller = getServicesForPackage(); if (tmpPoller.contains(pollersvc) && pollersvc.getName().equals(name)) { errorflag = true; tmpPoller.remove(pollersvc); response.sendRedirect(Util.calculateUrlBase(request, "/admin/error.jsp?error=1&name=" + name)); return; } } break; // throw new ServletException ("ProtocolPlugin name " + name + " // is already defined.. Try assigning another unique name"); } } ProtocolPlugin pluginAdd = new ProtocolPlugin(); pluginAdd.setProtocol(name); String className = (String) props.get("service." + protocol + ".capsd-class"); if (className != null) { pluginAdd.setClassName(className); pluginAdd.setScan("on"); pluginAdd.setUserDefined("true"); org.opennms.netmgt.config.capsd.Property newprop = new org.opennms.netmgt.config.capsd.Property(); String banner = "*"; if (props.get("banner") != null) { banner = (String) props.get("banner"); } newprop.setValue(banner); newprop.setKey("banner"); pluginAdd.addProperty(newprop); newprop = new org.opennms.netmgt.config.capsd.Property(); if (port != null && !port.equals("")) { newprop.setValue(port); if (port.indexOf(":") == -1) { newprop.setKey("port"); } else { newprop.setKey("ports"); } pluginAdd.addProperty(newprop); } else { if (props.get("service." + protocol + ".port") == null || ((String) props.get("service." + protocol + ".port")).equals("")) { errorflag = true; response.sendRedirect(Util.calculateUrlBase(request, "admin/error.jsp?error=0&name=" + "service." + protocol + ".port")); pluginAdd = null; return; } else { port = (String) props.get("service." + protocol + ".port"); newprop.setValue(port); if (port.indexOf(":") == -1) { newprop.setKey("port"); } else { newprop.setKey("ports"); } pluginAdd.addProperty(newprop); } } newprop = new org.opennms.netmgt.config.capsd.Property(); String timeout = "3000"; if (props.get("timeout") != null) { timeout = (String) props.get("timeout"); } newprop.setValue(timeout); newprop.setKey("timeout"); if (pluginAdd != null) { pluginAdd.addProperty(newprop); } newprop = new org.opennms.netmgt.config.capsd.Property(); String retry = "3"; if (props.get("retry") != null) { retry = (String) props.get("retry"); } newprop.setValue(retry); newprop.setKey("retry"); if (pluginAdd != null) { pluginAdd.addProperty(newprop); capsdProtocols.put(name, pluginAdd); pluginColl = capsdProtocols.values(); capsdColl.add(pluginAdd); capsdConfig.addProtocolPlugin(pluginAdd); } } else { errorflag = true; response.sendRedirect(Util.calculateUrlBase(request, "admin/error.jsp?error=0&name=" + "service." + protocol + ".capsd-class")); return; } } /** * <p>addPollerInfo</p> * * @param bPolled a {@link java.lang.String} object. * @param name a {@link java.lang.String} object. * @param port a {@link java.lang.String} object. * @param user a {@link java.lang.String} object. * @param protocol a {@link java.lang.String} object. * @param response a {@link javax.servlet.http.HttpServletResponse} object. * @param request a {@link javax.servlet.http.HttpServletRequest} object. * @throws javax.servlet.ServletException if any. * @throws java.io.IOException if any. */ public void addPollerInfo(String bPolled, String name, String port, String user, String protocol, HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException { // Check to see if the name is duplicate of the already specified names // first. Collection<Service> tmpPollers = getServicesForPackage(); Iterator<Service> iter = tmpPollers.iterator(); while (iter.hasNext()) { Service svc = iter.next(); if (svc.getName().equals(name)) { errorflag = true; response.sendRedirect(Util.calculateUrlBase(request, "admin/error.jsp?error=1&name=" + name)); return; // throw new ServletException ("Service name " + name + " is // already defined.. Try assigning another unique name"); } } if (pkg != null) { Service newService = new Service(); newService.setName(name); if (bPolled != null) { newService.setStatus(bPolled); } else { newService.setStatus("off"); } newService.setName(name); newService.setUserDefined("true"); Collection<Monitor> monitorColl = getMonitors(); Monitor newMonitor = new Monitor(); String monitor = (String) props.get("service." + protocol + ".monitor"); if (monitor != null) { newMonitor.setService(name); newMonitor.setClassName(monitor); } else { errorflag = true; response.sendRedirect(Util.calculateUrlBase(request, "admin/error.jsp?error=0&name=" + "service." + protocol + ".monitor")); return; } if (props.get("interval") != null) { newService.setInterval((new Long((String) props.get("interval"))).longValue()); } else { newService.setInterval(300000); } org.opennms.netmgt.config.poller.Parameter newprop = new org.opennms.netmgt.config.poller.Parameter(); String timeout = "3000"; if (props.get("timeout") != null) { timeout = (String) props.get("timeout"); } newprop.setValue(timeout); newprop.setKey("timeout"); newService.addParameter(newprop); newprop = new org.opennms.netmgt.config.poller.Parameter(); String banner = "*"; if (props.get("banner") != null) { banner = (String) props.get("banner"); } newprop.setValue(banner); newprop.setKey("banner"); newService.addParameter(newprop); newprop = new org.opennms.netmgt.config.poller.Parameter(); String retry = "3"; if (props.get("retry") != null) { retry = (String) props.get("retry"); } newprop.setValue(retry); newprop.setKey("retry"); newService.addParameter(newprop); newprop = new org.opennms.netmgt.config.poller.Parameter(); if (port == null || port.equals("")) { if (props.get("service." + protocol + ".port") == null || ((String) props.get("service." + protocol + ".port")).equals("")) { errorflag = true; newMonitor = null; newService = null; response.sendRedirect(Util.calculateUrlBase(request, "admin/error.jsp?error=0&name=" + "service." + protocol + ".port")); return; } else { port = (String) props.get("service." + protocol + ".port"); } } newprop.setValue(port); if (port.indexOf(":") != -1) { newprop.setKey("ports"); } else { newprop.setKey("port"); } if (newMonitor != null && newService != null) { if (monitorColl == null) { pollerConfig.addMonitor(0, newMonitor); } else { pollerConfig.addMonitor(newMonitor); } newService.addParameter(newprop); pkg.addService(newService); } } } private List<Monitor> getMonitors() { return pollerConfig.getMonitorCollection(); } }