net.fenyo.gnetwatch.targets.TargetIPv6.java Source code

Java tutorial

Introduction

Here is the source code for net.fenyo.gnetwatch.targets.TargetIPv6.java

Source

/*
 * 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.GUI.GUI;
import net.fenyo.gnetwatch.GUI.VisualElement;
import net.fenyo.gnetwatch.actions.*;
import net.fenyo.gnetwatch.data.EventReachable;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.snmp4j.event.ResponseEvent;

import java.net.*;

/**
 * TargetIPv4 implements an IPv6 capable target.
 * @author Alexandre Fenyo
 * @version $Id: TargetIPv6.java,v 1.27 2008/04/27 21:44:21 fenyo Exp $
 */

public class TargetIPv6 extends Target {
    private static Log log = LogFactory.getLog(TargetIPv6.class);

    // persistent - not null
    private Inet6Address address;

    // persistent
    private SNMPQuerier snmp_querier;

    // persistent
    private IPQuerier ip_querier;

    /**
     * Constructor.
     * @param name target name.
     * @param address IPv6 address.
     * @param SNMPManager snmp manager.
     * @throws AlgorithmException exception.
     */
    // GUI thread
    public TargetIPv6(final String name, final Inet6Address address, final SNMPManager snmp_manager)
            throws AlgorithmException {
        super(name);
        if (address == null)
            throw new AlgorithmException("name 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());
    }

    public TargetIPv6() throws AlgorithmException {
    }

    /**
     * Checks that this host is SNMP capable.
     * @param none.
     * @return void.
     */
    public void checkSNMPAwareness() {
        final TargetIPv6 _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()) {

                    // need to catch every exceptions 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/>");
                        setImageHost6SNMP();

                        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 Inet6Address getAddress() {
        return address;
    }

    public void setAddress(final Inet6Address 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())
    protected final void initialize(final GUI gui) {
        super.initialize(gui);
        if (gui != null)
            setImageHost6();
    }

    /**
     * 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);

        if (!canAddTarget(parent))
            return false;
        if (parent != null && !parent.canManageThisChild(this))
            return false;

        final boolean is_new = !getGUI().containsCanonicalInstance(this);
        final TargetIPv6 target_ipv6 = (TargetIPv6) getGUI().getCanonicalInstance(this);
        getGUI().getSynchro().getSessionFactory().getCurrentSession().saveOrUpdate(target_ipv6);

        if (!getGUI().getVisualTransientAll().contains(target_ipv6))
            target_ipv6.setParent(getGUI(), getGUI().getVisualTransientAll());

        if (parent != null)
            target_ipv6.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 addTargetIPv6(final GUI gui, final String addr_str) {
        try {
            log.warn("+sync_tree");
            synchronized (gui.sync_tree) {
                final TargetIPv6 foo = new TargetIPv6(addr_str, (Inet6Address) 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();
                                }
                            }
                        }
                    }
                });
            }
            log.warn("-sync_tree");
        } 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 TargetIPv6 target = (TargetIPv6) 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();
    }
}