/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2009-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.provision.persist;
import javax.servlet.http.HttpServletRequest;
import org.opennms.core.utils.BeanUtils;
import org.opennms.core.utils.ThreadCategory;
import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.config.SnmpEventInfo;
import org.opennms.netmgt.config.SnmpPeerFactory;
import org.opennms.netmgt.dao.CategoryDao;
import org.opennms.netmgt.dao.TransactionAwareEventForwarder;
import org.opennms.netmgt.model.PrimaryType;
import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.netmgt.model.events.EventForwarder;
import org.opennms.netmgt.model.events.EventProxy;
import org.opennms.netmgt.model.events.EventProxyException;
import org.opennms.netmgt.provision.persist.requisition.Requisition;
import org.opennms.netmgt.provision.persist.requisition.RequisitionAsset;
import org.opennms.netmgt.provision.persist.requisition.RequisitionCategory;
import org.opennms.netmgt.provision.persist.requisition.RequisitionInterface;
import org.opennms.netmgt.provision.persist.requisition.RequisitionMonitoredService;
import org.opennms.netmgt.provision.persist.requisition.RequisitionNode;
import org.opennms.netmgt.xml.event.Event;
import org.opennms.netmgt.xml.event.Log;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.ModelAndView;
/**
* <p>DefaultNodeProvisionService class.</p>
*
* @author ranger
* @version $Id: $
*/
public class DefaultNodeProvisionService implements NodeProvisionService, InitializingBean {
private EventForwarder m_eventForwarder;
@Autowired
private CategoryDao m_categoryDao;
@Autowired
private SnmpPeerFactory m_snmpPeerFactory;
private ForeignSourceRepository m_foreignSourceRepository;
@Override
public void afterPropertiesSet() throws Exception {
BeanUtils.assertAutowiring(this);
}
/** {@inheritDoc} */
public ModelAndView getModelAndView(HttpServletRequest request) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("foreignSources", m_foreignSourceRepository.getForeignSources());
modelAndView.addObject("requisitions", m_foreignSourceRepository.getRequisitions());
modelAndView.addObject("categories", m_categoryDao.getAllCategoryNames());
modelAndView.addObject("success", Boolean.parseBoolean(request.getParameter("success")));
modelAndView.addObject("foreignSource", request.getParameter("foreignSource"));
return modelAndView;
}
/** {@inheritDoc} */
@Transactional
public boolean provisionNode(final String user, String foreignSource, String foreignId, String nodeLabel, String ipAddress,
String[] categories, String snmpCommunity, String snmpVersion,
String deviceUsername, String devicePassword, String enablePassword,
String accessMethod, String autoEnable, String noSNMP) throws NodeProvisionException {
if (log().isDebugEnabled()) {
log().debug(String.format("adding SNMP community %s (%s)", snmpCommunity, snmpVersion));
}
// Set the SNMP community name (if necessary)
if (noSNMP == null && snmpCommunity != null && !snmpCommunity.equals("") && snmpVersion != null && !snmpVersion.equals("")) {
try {
SnmpEventInfo info = new SnmpEventInfo();
info.setCommunityString(snmpCommunity);
info.setFirstIPAddress(ipAddress);
info.setVersion(snmpVersion);
m_snmpPeerFactory.define(info);
SnmpPeerFactory.saveCurrent();
} catch (Throwable e) {
throw new NodeProvisionException("unable to add SNMP community information", e);
}
}
log().debug("creating requisition node");
// Create a requisition node based on the form input
RequisitionInterface reqIface = new RequisitionInterface();
reqIface.setIpAddr(ipAddress);
reqIface.setManaged(true);
reqIface.setSnmpPrimary(PrimaryType.get("P"));
reqIface.setStatus(1);
reqIface.putMonitoredService(new RequisitionMonitoredService("ICMP"));
if(noSNMP == null) {
reqIface.putMonitoredService(new RequisitionMonitoredService("SNMP"));
}
RequisitionNode reqNode = new RequisitionNode();
reqNode.setNodeLabel(nodeLabel);
reqNode.setForeignId(foreignId);
reqNode.putInterface(reqIface);
for (String category : categories) {
if (category != null && !category.equals("")) {
reqNode.putCategory(new RequisitionCategory(category));
}
}
if (deviceUsername != null && !deviceUsername.equals("")) {
reqNode.putAsset(new RequisitionAsset("username", deviceUsername));
}
if (devicePassword != null && !devicePassword.equals("")) {
reqNode.putAsset(new RequisitionAsset("password", devicePassword));
}
if (enablePassword != null && !enablePassword.equals("")) {
reqNode.putAsset(new RequisitionAsset("enable", enablePassword));
}
if (accessMethod != null && !accessMethod.equals("")) {
reqNode.putAsset(new RequisitionAsset("connection", accessMethod));
}
if (autoEnable != null) {
reqNode.putAsset(new RequisitionAsset("autoenable", "A"));
}
// Now save it to the requisition
try {
Requisition req = m_foreignSourceRepository.getRequisition(foreignSource);
req.putNode(reqNode);
log().debug("saving requisition node");
m_foreignSourceRepository.save(req);
} catch (ForeignSourceRepositoryException e) {
throw new RuntimeException("unable to retrieve foreign source '" + foreignSource + "'", e);
}
Event e = new EventBuilder(EventConstants.RELOAD_IMPORT_UEI, "NodeProvisionService")
.addParam("url", m_foreignSourceRepository.getRequisitionURL(foreignSource).toString())
.getEvent();
m_eventForwarder.sendNow(e);
log().warn("about to return (" + System.currentTimeMillis() + ")");
return true;
}
/**
* <p>setForeignSourceRepository</p>
*
* @param repository a {@link org.opennms.netmgt.provision.persist.ForeignSourceRepository} object.
*/
public void setForeignSourceRepository(ForeignSourceRepository repository) {
m_foreignSourceRepository = repository;
}
/**
* <p>setEventProxy</p>
*
* @param proxy a {@link org.opennms.netmgt.model.events.EventProxy} object.
* @throws java.lang.Exception if any.
*/
public void setEventProxy(final EventProxy proxy) throws Exception {
EventForwarder proxyForwarder = new EventForwarder() {
public void sendNow(Event event) {
try {
proxy.send(event);
} catch (EventProxyException e) {
throw new NodeProvisionException("Unable to send "+event, e);
}
}
public void sendNow(Log eventLog) {
try {
proxy.send(eventLog);
} catch (EventProxyException e) {
throw new NodeProvisionException("Unable to send eventLog "+eventLog, e);
}
}
};
m_eventForwarder = new TransactionAwareEventForwarder(proxyForwarder);
}
/**
* <p>log</p>
*
* @return a {@link org.opennms.core.utils.ThreadCategory} object.
*/
protected ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
}