/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2008-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.service.operations;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import org.opennms.core.utils.InetAddressUtils;
import org.opennms.core.utils.LogUtils;
import org.opennms.netmgt.config.SnmpPeerFactory;
import org.opennms.netmgt.model.OnmsIpInterface;
import org.opennms.netmgt.model.OnmsNode;
import org.opennms.netmgt.provision.service.snmp.IfTable;
import org.opennms.netmgt.provision.service.snmp.IfXTable;
import org.opennms.netmgt.provision.service.snmp.IpAddrTable;
import org.opennms.netmgt.provision.service.snmp.IpAddressTable;
import org.opennms.netmgt.provision.service.snmp.SystemGroup;
import org.opennms.netmgt.snmp.AggregateTracker;
import org.opennms.netmgt.snmp.CollectionTracker;
import org.opennms.netmgt.snmp.SnmpAgentConfig;
import org.opennms.netmgt.snmp.SnmpInstId;
import org.opennms.netmgt.snmp.SnmpUtils;
import org.opennms.netmgt.snmp.SnmpWalker;
public class ScanManager {
private final InetAddress m_address;
private SystemGroup m_systemGroup;
private IfTable m_ifTable;
private IpAddrTable m_ipAddrTable;
private IpAddressTable m_ipAddressTable;
private IfXTable m_ifXTable;
ScanManager(InetAddress address) {
m_address = address;
}
/**
* <p>getSystemGroup</p>
*
* @return a {@link org.opennms.netmgt.provision.service.snmp.SystemGroup} object.
*/
public SystemGroup getSystemGroup() {
return m_systemGroup;
}
/**
* <p>getIfTable</p>
*
* @return the ifTable
*/
public IfTable getIfTable() {
return m_ifTable;
}
/**
* <p>getIpAddrTable</p>
*
* @return the ipAddrTable
*/
public IpAddrTable getIpAddrTable() {
return m_ipAddrTable;
}
public IpAddressTable getIpAddressTable() {
return m_ipAddressTable;
}
/**
* <p>getIfXTable</p>
*
* @return the ifXTable
*/
public IfXTable getIfXTable() {
return m_ifXTable;
}
InetAddress getNetMask(final int ifIndex) {
final InetAddress ipAddressNetmask = getIpAddressTable().getNetMask(ifIndex);
if (ipAddressNetmask == null) {
return getIpAddrTable().getNetMask(ifIndex);
} else {
return ipAddressNetmask;
}
}
boolean isSnmpDataForInterfacesUpToDate() {
return (!getIfTable().failed() && !getIpAddrTable().failed()) || !getIpAddressTable().failed();
}
boolean isSnmpDataForNodeUpToDate() {
return !getSystemGroup().failed();
}
void updateSnmpData(final OnmsNode node) {
try {
m_systemGroup = new SystemGroup(m_address);
final Set<SnmpInstId> ipAddrs = new TreeSet<SnmpInstId>();
final Set<InetAddress> ipAddresses = new HashSet<InetAddress>();
for(final OnmsIpInterface iface : node.getIpInterfaces()) {
final InetAddress addr = iface.getIpAddress();
if (addr != null && addr instanceof Inet4Address) {
ipAddrs.add(new SnmpInstId(InetAddressUtils.toOid(addr)));
}
ipAddresses.add(addr);
}
m_ipAddrTable = new IpAddrTable(m_address, ipAddrs);
m_ipAddressTable = IpAddressTable.createTable(m_address, ipAddresses);
final SnmpAgentConfig agentConfig = SnmpPeerFactory.getInstance().getAgentConfig(m_address);
SnmpWalker walker = SnmpUtils.createWalker(agentConfig, "system/ipAddrTable/ipAddressTable", m_systemGroup, m_ipAddrTable, m_ipAddressTable);
walker.start();
walker.waitFor();
final Set<SnmpInstId> ifIndices = new TreeSet<SnmpInstId>();
for(final Integer ifIndex : m_ipAddrTable.getIfIndices()) {
ifIndices.add(new SnmpInstId(ifIndex));
}
m_ifTable = new IfTable(m_address, ifIndices);
m_ifXTable = new IfXTable(m_address, ifIndices);
walker = SnmpUtils.createWalker(agentConfig, "ifTable/ifXTable", m_ifTable, m_ifXTable);
walker.start();
walker.waitFor();
m_systemGroup.updateSnmpDataForNode(node);
for(final SnmpInstId ifIndex : ifIndices) {
m_ifTable.updateSnmpInterfaceData(node, ifIndex.toInt());
}
for(final SnmpInstId ifIndex : ifIndices) {
m_ifXTable.updateSnmpInterfaceData(node, ifIndex.toInt());
}
for(final SnmpInstId ipAddr : ipAddrs) {
m_ipAddrTable.updateIpInterfaceData(node, ipAddr.toString());
}
for (final InetAddress addr : ipAddresses) {
m_ipAddressTable.updateIpInterfaceData(node, InetAddressUtils.str(addr));
}
} catch (final InterruptedException e) {
LogUtils.infof(this, e, "thread interrupted while updating SNMP data");
Thread.currentThread().interrupt();
}
}
/**
* <p>createCollectionTracker</p>
*
* @return a {@link org.opennms.netmgt.snmp.AggregateTracker} object.
*/
public AggregateTracker createCollectionTracker() {
return new AggregateTracker(new CollectionTracker[] { getSystemGroup(), getIfTable(), getIpAddrTable(), getIfXTable(), getIpAddressTable() });
}
}