/******************************************************************************* * 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.notifd; import java.lang.reflect.UndeclaredThrowableException; import java.util.HashMap; import java.util.Map; import org.opennms.netmgt.config.DestinationPathManager; import org.opennms.netmgt.config.GroupManager; import org.opennms.netmgt.config.NotifdConfigManager; import org.opennms.netmgt.config.NotificationCommandManager; import org.opennms.netmgt.config.NotificationManager; import org.opennms.netmgt.config.PollOutagesConfigManager; import org.opennms.netmgt.config.UserManager; import org.opennms.netmgt.config.notifd.Queue; import org.opennms.netmgt.daemon.AbstractServiceDaemon; import org.opennms.netmgt.dao.NodeDao; import org.opennms.netmgt.eventd.EventIpcManager; /** * This class is used to represent the notification execution service. When an * event is received by this service that has one of either a notification, * trouble ticket, or auto action then a process is launched to execute the * appropriate commands. * * @author <a href="mailto:mike@opennms.org">Mike Davidson </a> * @author <a href="mailto:weave@oculan.com">Brian Weaver </a> * @author <a href="http://www.opennms.org/">OpenNMS.org </a> * @author <a href="mailto:mike@opennms.org">Mike Davidson </a> * @author <a href="mailto:weave@oculan.com">Brian Weaver </a> * @author <a href="http://www.opennms.org/">OpenNMS.org </a> * @author <a href="mailto:mike@opennms.org">Mike Davidson </a> * @author <a href="mailto:weave@oculan.com">Brian Weaver </a> * @author <a href="http://www.opennms.org/">OpenNMS.org </a> * @version $Id: $ */ public final class Notifd extends AbstractServiceDaemon { /** * The singleton instance. */ private static final Notifd m_singleton = new Notifd(); /** * The map for holding different notice queues */ private final Map<String, NoticeQueue> m_noticeQueues = new HashMap<String, NoticeQueue>(); /** * */ private final Map<String, NotifdQueueHandler> m_queueHandlers = new HashMap<String, NotifdQueueHandler>(); /** * The broadcast event receiver. */ private volatile BroadcastEventProcessor m_eventReader; // Would be better if these were final but the are initialized in setters private volatile EventIpcManager m_eventManager; private volatile NotifdConfigManager m_configManager; private volatile NotificationManager m_notificationManager; private volatile GroupManager m_groupManager; private volatile UserManager m_userManager; private volatile DestinationPathManager m_destinationPathManager; private volatile NotificationCommandManager m_notificationCommandManager; private volatile PollOutagesConfigManager m_pollOutagesConfigManager; private volatile NodeDao m_nodeDao; /** * Constructs a new Notifd service daemon. */ protected Notifd() { super("OpenNMS.Notifd"); } /** * <p>onInit</p> */ protected void onInit() { m_eventReader = new BroadcastEventProcessor(); try { log().info("Notification status = " + getConfigManager().getNotificationStatus()); Queue queues[] = getConfigManager().getConfiguration().getQueue(); for (Queue queue : queues) { NoticeQueue curQueue = new NoticeQueue(); Class<?> handlerClass = Class.forName(queue.getHandlerClass().getName()); NotifdQueueHandler handlerQueue = (NotifdQueueHandler) handlerClass.newInstance(); handlerQueue.setQueueID(queue.getQueueId()); handlerQueue.setNoticeQueue(curQueue); handlerQueue.setInterval(queue.getInterval()); m_noticeQueues.put(queue.getQueueId(), curQueue); m_queueHandlers.put(queue.getQueueId(), handlerQueue); } } catch (Throwable t) { log().error("start: Failed to load notifd queue handlers.", t); throw new UndeclaredThrowableException(t); } m_eventReader.setDestinationPathManager(getDestinationPathManager()); m_eventReader.setEventManager(getEventManager()); m_eventReader.setGroupManager(getGroupManager()); m_eventReader.setNoticeQueues(m_noticeQueues); m_eventReader.setNotifdConfigManager(getConfigManager()); m_eventReader.setNotificationCommandManager(getNotificationCommandManager()); m_eventReader.setNotificationManager(getNotificationManager()); m_eventReader.setPollOutagesConfigManager(getPollOutagesConfigManager()); m_eventReader.setUserManager(getUserManager()); // start the event reader try { m_eventReader.init(); } catch (Throwable e) { log().error("Failed to setup event receiver", e); throw new UndeclaredThrowableException(e); } } /** * <p>getConfigManager</p> * * @return a {@link org.opennms.netmgt.config.NotifdConfigManager} object. */ public NotifdConfigManager getConfigManager() { return m_configManager; } /** * <p>setConfigManager</p> * * @param manager a {@link org.opennms.netmgt.config.NotifdConfigManager} object. */ public void setConfigManager(NotifdConfigManager manager ) { m_configManager = manager; } /** * <p>getGroupManager</p> * * @return a {@link org.opennms.netmgt.config.GroupManager} object. */ public GroupManager getGroupManager() { return m_groupManager; } /** * <p>setGroupManager</p> * * @param manager a {@link org.opennms.netmgt.config.GroupManager} object. */ public void setGroupManager(GroupManager manager) { m_groupManager = manager; } /** * <p>getUserManager</p> * * @return a {@link org.opennms.netmgt.config.UserManager} object. */ public UserManager getUserManager() { return m_userManager; } /** * <p>setUserManager</p> * * @param manager a {@link org.opennms.netmgt.config.UserManager} object. */ public void setUserManager(UserManager manager) { m_userManager = manager; } /** * <p>getDestinationPathManager</p> * * @return a {@link org.opennms.netmgt.config.DestinationPathManager} object. */ public DestinationPathManager getDestinationPathManager() { return m_destinationPathManager; } /** * <p>setDestinationPathManager</p> * * @param manager a {@link org.opennms.netmgt.config.DestinationPathManager} object. */ public void setDestinationPathManager(DestinationPathManager manager) { m_destinationPathManager = manager; } /** * <p>getNotificationCommandManager</p> * * @return a {@link org.opennms.netmgt.config.NotificationCommandManager} object. */ public NotificationCommandManager getNotificationCommandManager() { return m_notificationCommandManager; } /** * <p>setNotificationCommandManager</p> * * @param manager a {@link org.opennms.netmgt.config.NotificationCommandManager} object. */ public void setNotificationCommandManager(NotificationCommandManager manager) { m_notificationCommandManager = manager; } /** * <p>getNotificationManager</p> * * @return a {@link org.opennms.netmgt.config.NotificationManager} object. */ public NotificationManager getNotificationManager() { return m_notificationManager; } /** * <p>setNotificationManager</p> * * @param notificationManager a {@link org.opennms.netmgt.config.NotificationManager} object. */ public void setNotificationManager(NotificationManager notificationManager) { m_notificationManager = notificationManager; } /** * <p>getBroadcastEventProcessor</p> * * @return a {@link org.opennms.netmgt.notifd.BroadcastEventProcessor} object. */ public BroadcastEventProcessor getBroadcastEventProcessor() { return m_eventReader; } /** * <p>onStart</p> */ protected void onStart() { for (NotifdQueueHandler curHandler : m_queueHandlers.values()) { curHandler.start(); } } /** * <p>onStop</p> */ protected void onStop() { try { for (NotifdQueueHandler curHandler : m_queueHandlers.values()) { curHandler.stop(); } } catch (Throwable e) { } if (m_eventReader != null) { m_eventReader.close(); } m_eventReader = null; } /** * <p>onPause</p> */ protected void onPause() { for (NotifdQueueHandler curHandler : m_queueHandlers.values()) { curHandler.pause(); } } /** * <p>onResume</p> */ protected void onResume() { for (NotifdQueueHandler curHandler : m_queueHandlers.values()) { curHandler.resume(); } } /** * Returns the singular instance of the Notifd daemon. There can be only * one instance of this service per virtual machine. * * @return a {@link org.opennms.netmgt.notifd.Notifd} object. */ public static Notifd getInstance() { return m_singleton; } /** * <p>getEventManager</p> * * @return a {@link org.opennms.netmgt.eventd.EventIpcManager} object. */ public EventIpcManager getEventManager() { return m_eventManager; } /** * <p>setEventManager</p> * * @param eventManager The eventManager to set. */ public void setEventManager(EventIpcManager eventManager) { m_eventManager = eventManager; } /** * <p>setPollOutagesConfigManager</p> * * @param configManager a {@link org.opennms.netmgt.config.PollOutagesConfigManager} object. */ public void setPollOutagesConfigManager(PollOutagesConfigManager configManager) { m_pollOutagesConfigManager = configManager; } /** * <p>getPollOutagesConfigManager</p> * * @return a {@link org.opennms.netmgt.config.PollOutagesConfigManager} object. */ public PollOutagesConfigManager getPollOutagesConfigManager() { return m_pollOutagesConfigManager; } /** * <p>setNodeDao</p> * * @param nodeDao a {@link org.opennms.netmgt.dao.NodeDao} object. */ public void setNodeDao(NodeDao nodeDao) { m_nodeDao = nodeDao; } /** * <p>getNodeDao</p> * * @return a {@link org.opennms.netmgt.dao.NodeDao} object. */ public NodeDao getNodeDao() { return m_nodeDao; } }