/*
* GNetWatch
* Copyright 2006, 2007, 2008 Alexandre Fenyo
* gnetwatch@fenyo.net
*
* This file is part of GNetWatch.
*
* GNetWatch 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 2 of the License, or
* (at your option) any later version.
*
* GNetWatch 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 GNetWatch; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.fenyo.gnetwatch.targets;
import net.fenyo.gnetwatch.*;
import net.fenyo.gnetwatch.actions.*;
import net.fenyo.gnetwatch.data.*;
import net.fenyo.gnetwatch.GUI.GUI;
import net.fenyo.gnetwatch.GUI.VisualElement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.snmp4j.PDU;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import java.net.*;
/**
* TargetIPv4 implements an IPv4 capable target.
* @author Alexandre Fenyo
* @version $Id: TargetIPv4.java,v 1.44 2008/08/01 17:35:40 fenyo Exp $
*/
public class TargetIPv4 extends Target {
private static Log log = LogFactory.getLog(TargetIPv4.class);
// persistent - not null
private Inet4Address address;
// persistent
private SNMPQuerier snmp_querier;
// persistent
private IPQuerier ip_querier;
public TargetIPv4() throws AlgorithmException {
// address = null;
// snmp_querier = null;
// ip_querier = null;
}
/**
* Constructor.
* @param name target name.
* @param address IPv4 address.
* @param SNMPManager snmp manager.
* @throws AlgorithmException exception.
*/
// GUI thread
public TargetIPv4(final String name, final Inet4Address address, final SNMPManager snmp_manager) throws AlgorithmException {
super(name);
if (address == null) throw new AlgorithmException("address is null");
this.address = address;
snmp_querier = snmp_manager != null ? snmp_manager.getQuerier(address) : null;
setItem(address.getHostAddress());
ip_querier = new IPQuerier(address);
// may last a long time (DNS resolver)
// setDescription(address.getCanonicalHostName());
}
/**
* Checks that this host is SNMP capable.
* @param none.
* @return void.
*/
// PENSER a changer l'icone en cas d'action SNMP qui marche car si ici ca a fait timeout... ET a mettre a jour le type
// faire drop action nmap et drop view nmap
// lock survey: synchro << sync_tree << HERE
public void checkSNMPAwareness() {
final TargetIPv4 _this = this;
snmp_querier.getSysDescr(new SNMPQuerier.QuerierListener() {
public void onResponse(final ResponseEvent event) {
// need to synchronize here to be sure objects will not be attached to another session
synchronized (getGUI().getSynchro()) {
// lock survey: synchro << HERE
// need to catch every exception we could generate since SNMP4J does not log them in the asynchronous thread...
try {
getGUI().setStatus(getGUI().getConfig().getPattern("discovered_snmp", getAddress().toString().substring(1)));
getGUI().appendConsole(getGUI().getConfig().getPattern("discovered_snmp", getAddress().toString().substring(1)) + "<BR/>");
setImageHostSNMP();
if (event != null && event.getResponse() != null && event.getResponse().size() > 0 &&
event.getResponse().get(0) != null && event.getResponse().get(0).getVariable() != null) {
final Session session = getGUI().getSynchro().getSessionFactory().getCurrentSession();
session.beginTransaction();
try {
session.update(_this);
setType(event.getResponse().get(0).getVariable().toString());
session.getTransaction().commit();
} catch (final Exception ex) {
log.error("Exception", ex);
session.getTransaction().rollback();
}
} else log.error("got a bad SNMP response");
} catch (final Exception ex) {
log.error("Exception", ex);
}
}
}
public void onTimeout(final ResponseEvent event) {
try {
getGUI().setStatus(getGUI().getConfig().getPattern("snmp_timeout", getAddress().toString().substring(1)));
} catch (final Exception ex) {
log.error("Exception", ex);
}
}
});
}
/**
* Returns the SNMP querier.
* @param none.
* @return SNMPQuerier querier instance.
*/
public SNMPQuerier getSNMPQuerier() {
return snmp_querier;
}
public void setSNMPQuerier(final SNMPQuerier snmp_querier) {
this.snmp_querier = snmp_querier;
}
/**
* Returns the IP querier.
* @param none.
* @return IPQuerier querier instance.
*/
public IPQuerier getIPQuerier() {
return ip_querier;
}
public void setIPQuerier(final IPQuerier ip_querier) {
this.ip_querier = ip_querier;
}
/**
* Returns the IP address.
* @param none.
* @return Inet4Address IP address.
*/
// any thread
public Inet4Address getAddress() {
return address;
}
public void setAddress(final Inet4Address address) {
this.address = address;
}
/**
* Checks that the parameter can be attached to this target.
* @param visual_element parameter to check.
* @return true if the parameter can be attached to this target.
*/
public boolean canManageThisChild(final VisualElement visual_element) {
if (ActionPing.class.isInstance(visual_element)) return true;
if (ActionFlood.class.isInstance(visual_element)) return true;
if (ActionSNMP.class.isInstance(visual_element)) return true;
if (EventReachable.class.isInstance(visual_element)) return true;
if (TargetInterface.class.isInstance(visual_element)) return true;
if (ActionHTTP.class.isInstance(visual_element)) return true;
if (ActionNmap.class.isInstance(visual_element)) return true;
return false;
}
/**
* Initializes this target.
* @param gui current GUI instance.
* @return void.
*/
// final because called by constructor (by means of setItem())
public final void initialize(final GUI gui) {
super.initialize(gui);
if (gui != null) setImageHost(); // bcl sans fil qui arrive parfois au lancement (3)
}
/**
* Attaches this target to a specific parent.
* @param gui current GUI instance.
* @param parent parent.
* @return true if this target has been succesfully attached.
*/
public boolean addTarget(final GUI gui, final Target parent) {
initialize(gui); // bcl sans fil qui arrive parfois au lancement (2)
if (!canAddTarget(parent)) return false;
if (parent != null && !parent.canManageThisChild(this)) return false;
final boolean is_new = !getGUI().containsCanonicalInstance(this);
final TargetIPv4 target_ipv4 = (TargetIPv4) getGUI().getCanonicalInstance(this);
final Session session = getGUI().getSynchro().getSessionFactory().getCurrentSession();
session.saveOrUpdate(target_ipv4);
session.update(parent);
if (!getGUI().getVisualTransientAll().contains(target_ipv4)) {
session.update(getGUI().getVisualTransientAll());
target_ipv4.setParent(getGUI(), getGUI().getVisualTransientAll());
}
final String addr_str = GenericTools.inet4AddressToString(target_ipv4.getAddress());
final String net_str = GenericTools.getNetFromAddress(addr_str);
if (addr_str == null || net_str == null) {
if (is_new) getGUI().dropTargetInstance(target_ipv4);
log.error("addr_str or net_str is null - " + getItem());
return false;
}
Inet4Address net_addr = null;
Inet4Address net_netmask = null;
try {
if (net_str.endsWith("/4")) {
net_addr = (Inet4Address)
InetAddress.getByName(GenericTools.unsignedByteToShort(address.getAddress()[0]) < 240 ?
"224.0.0.0" : "240.0.0.0");
net_netmask = (Inet4Address) InetAddress.getByName("240.0.0.0");
}
if (net_str.endsWith("/8")) {
net_addr = (Inet4Address) InetAddress.getByName(net_str.substring(0, net_str.length() - 2));
net_netmask = (Inet4Address) InetAddress.getByName("255.0.0.0");
}
if (net_str.endsWith("/16")) {
net_addr = (Inet4Address) InetAddress.getByName(net_str.substring(0, net_str.length() - 3));
net_netmask = (Inet4Address) InetAddress.getByName("255.255.0.0");
}
if (net_str.endsWith("/24")) {
net_addr = (Inet4Address) InetAddress.getByName(net_str.substring(0, net_str.length() - 3));
net_netmask = (Inet4Address) InetAddress.getByName("255.255.255.0");
}
} catch (final UnknownHostException ex) {
if (is_new) getGUI().dropTargetInstance(target_ipv4);
log.error("Exception", ex);
return false;
}
TargetIPv4Subnet subnet;
try {
subnet = new TargetIPv4Subnet(addr_str, net_addr, net_netmask);
} catch (final AlgorithmException ex) {
if (is_new) getGUI().dropTargetInstance(target_ipv4);
log.error("Exception", ex);
return false;
}
if (getGUI().getConfig().getProperty("enableeverynetworks") != null &&
getGUI().getConfig().getProperty("enableeverynetworks").equals("true")) {
subnet = (TargetIPv4Subnet) getGUI().getCanonicalInstance(subnet);
session.saveOrUpdate(subnet);
if (!getGUI().getVisualTransientNetworks().contains(subnet)) {
session.update(getGUI().getVisualTransientNetworks());
subnet.setParent(getGUI(), getGUI().getVisualTransientNetworks());
}
if (!subnet.contains(target_ipv4)) target_ipv4.setParent(getGUI(), subnet);
}
if (parent != null) target_ipv4.setParent(getGUI(), parent);
return is_new;
}
/**
* Attaches this target to a specific parent defined by its address.
* @param gui current GUI instance.
* @param addr_str parent address.
* @return true if this target has been succesfully attached.
*/
public static void addTargetIPv4(final GUI gui, final String addr_str) {
try {
synchronized (gui.sync_tree) {
final TargetIPv4 foo = new TargetIPv4(addr_str, (Inet4Address) InetAddress.getByName(addr_str), gui.getSNMPManager());
if (gui.containsCanonicalInstance(foo)) return;
gui.asyncExec(new Runnable() {
public void run() {
synchronized (gui.getSynchro()) {
synchronized (gui.sync_tree) {
if (gui.containsCanonicalInstance(foo)) return;
final Session session = gui.getSynchro().getSessionFactory().getCurrentSession();
session.beginTransaction();
// � revoir
try {
if (foo.addTarget(gui, (Target) null) == true) {
session.getTransaction().commit();
gui.setStatus(gui.getConfig().getPattern("adding_target", foo.getAddress().toString().substring(1)));
foo.checkSNMPAwareness();
} else session.getTransaction().rollback();
} catch (final Exception ex) {
log.error("Exception", ex);
session.getTransaction().rollback();
}
}
}
}
});
}
} catch (final AlgorithmException ex) {
log.error("Exception", ex);
} catch (final UnknownHostException ex) {
log.error("Exception", ex);
}
}
/**
* Compares two targets.
* @param o target to compare to.
* @return true if the targets are equal.
*/
// any thread
public boolean equals(final Object o) {
if (this == o) return true;
if ((o == null) || (o.getClass() != getClass())) return false;
final TargetIPv4 target = (TargetIPv4) o;
return getAddress().equals(target.getAddress());
}
/**
* Returns the hashcode for this target.
* @param none.
* @return int hashcode.
*/
// any thread
public int hashCode() {
return getAddress().hashCode();
}
}