net.fenyo.gnetwatch.CommandLine.java Source code

Java tutorial

Introduction

Here is the source code for net.fenyo.gnetwatch.CommandLine.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;

import java.io.*;
import java.net.*;
import java.util.*;
import javax.net.ssl.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.security.*;
import java.security.cert.*;
import java.text.*;

import net.fenyo.gnetwatch.GUI.*;
import net.fenyo.gnetwatch.actions.ExternalCommand;
import net.fenyo.gnetwatch.activities.*;
import net.fenyo.gnetwatch.data.EventGenericSrc;
import net.fenyo.gnetwatch.data.EventReachable;
import net.fenyo.gnetwatch.targets.*;

import org.dom4j.*;
import org.dom4j.io.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.hibernate.Session;

import org.apache.commons.logging.*;

/*
  synchronisation
    
occurences de synchronized (sur mthodes et instances) :
  net/fenyo/gnetwatch/actions/ActionNmap.java
  net/fenyo/gnetwatch/actions/ActionSNMP.java
  net/fenyo/gnetwatch/actions/ExternalCommand.java
  net/fenyo/gnetwatch/activities/Background.java
  net/fenyo/gnetwatch/activities/Capture.java
  net/fenyo/gnetwatch/activities/CaptureManager.java
  net/fenyo/gnetwatch/activities/Queue.java
  net/fenyo/gnetwatch/data/DataView.java
  net/fenyo/gnetwatch/data/NmapView.java
  net/fenyo/gnetwatch/data/Views.java
  net/fenyo/gnetwatch/GUI/AwtGUI.java
  net/fenyo/gnetwatch/GUI/BasicComponent.java
  net/fenyo/gnetwatch/GUI/BytesReceivedComponent.java
  net/fenyo/gnetwatch/GUI/BytesSentComponent.java
  net/fenyo/gnetwatch/GUI/ChartComponent.java
  net/fenyo/gnetwatch/GUI/FloodComponent.java
  net/fenyo/gnetwatch/GUI/GUI.java
  net/fenyo/gnetwatch/GUI/HTTPComponent.java
  net/fenyo/gnetwatch/GUI/HTTPPagesComponent.java
  net/fenyo/gnetwatch/GUI/VisualElement.java
  net/fenyo/gnetwatch/SNMPQuerier.java
  net/fenyo/gnetwatch/targets/TargetIPv4.java
  net/fenyo/gnetwatch/targets/TargetIPv6.java
  net/fenyo/gnetwatch/targets/Target.java
    
verrous :
  GUI.sync_tree
  GUI.tab_folder
  GUI.GUI_created
  synchro
  ExternalCommand
  CaptureManager
  CaptureManager.capture_list
  CaptureManager.listeners
  Queue
  Queue.actions
  AwtGUI.frame_list
  BasicComponent.sync_value_per_vinterval
  BasicComponent.sync_update
  BasicComponent.events
  VisualElement.initialized
  SNMPQuerier.getSysDescr().invoked
  registered_components
    
threads :
  main: CommandLine.main()
  Interrupt: Background.run()
  GUI: GUI.run()
  Capture-*: Capture.run()
  Repaint: AwtGUI.run()
  icmp-*: PingQueue.run()
  snmp-*: SNMPQueue.run()
  flood-*: FloodQueue.run()
  http-*: HTTPQueue.run()
  nmap-*: NmapQueue.run()
  merge-1: MergeQueue.run()
  hsqldb: library thread (HSQLDB)
  DefaultUDPTransportMapping: library thread (SNMP4J)
  Timer-0: system thread
    
 */

/**
 * Manage command line arguments.
 * @author Alexandre Fenyo
 * @version $Id: CommandLine.java,v 1.43 2008/11/17 01:39:19 fenyo Exp $
 *
 * @todo nothing more.
 */

public class CommandLine {
    private static Log log = LogFactory.getLog(CommandLine.class);

    static public class NoCheckTrustManager implements X509TrustManager {
        private X509TrustManager myTrustManager;

        public NoCheckTrustManager() throws java.security.NoSuchAlgorithmException {
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
            try {
                //          trustManagerFactory.init((KeyStore) null);
                trustManagerFactory.init(KeyStore.getInstance(KeyStore.getDefaultType()));
                myTrustManager = (X509TrustManager) trustManagerFactory.getTrustManagers()[0];
            } catch (KeyStoreException ex) {
                log.error("Exception", ex);
            }
        }

        public X509Certificate[] getAcceptedIssuers() {
            return myTrustManager.getAcceptedIssuers();
        }

        public void checkClientTrusted(final X509Certificate chain[], final String authType)
                throws CertificateException {
        }

        public void checkServerTrusted(final X509Certificate chain[], final String authType)
                throws CertificateException {
        }
    }

    // java -cp GNetWatchBundle.jar import source sandbox d:\import\gnetwatch.log
    // 20080530162420:<1;2;3;4;5;6;7;8;9;10;foo;bar>
    private static void importGenericSrc(final String[] args) throws IOException {
        // Get configuration properties
        final Config config = new Config();
        // Set debug level
        config.setDebugLevel(0);
        // Read general logging rules
        GenericTools.initLogEngine(config);
        // Initialize Object-Relational mapping
        final Synchro synchro = new Synchro(config);

        synchronized (synchro) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();

            final java.util.List results = session.createQuery("from TargetGroup as group where group.item = ?")
                    .setString(0, args[2]).list();

            if (results.size() == 0)
                log.error("no such group");
            else {
                final TargetGroup group = (TargetGroup) results.get(0);
                final BufferedReader reader = new BufferedReader(new FileReader(args[3]));
                String line;
                while ((line = reader.readLine()) != null) {
                    log.debug("[" + line + "]");

                    Matcher match = Pattern.compile(
                            ".*?([0-9]{14})[^0-9]*?<([0-9]*);([0-9]*);([0-9]*);([0-9]*);([0-9]*);([0-9]*);([0-9]*);([0-9]*);([0-9]*);([0-9]*);([^>]*)>.*?$")
                            .matcher(line);
                    if (match.find()) {
                        final String time = new String(match.group(1));
                        final int value1 = new Integer(match.group(2));
                        final int value2 = new Integer(match.group(3));
                        final int value3 = new Integer(match.group(4));
                        final int value4 = new Integer(match.group(5));
                        final int value5 = new Integer(match.group(6));
                        final int value6 = new Integer(match.group(7));
                        final int value7 = new Integer(match.group(8));
                        final int value8 = new Integer(match.group(9));
                        final int value9 = new Integer(match.group(10));
                        final int value10 = new Integer(match.group(11));
                        final String units = match.group(12);

                        final SimpleDateFormat fmt = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
                        final Date date;
                        try {
                            date = fmt.parse(time);
                        } catch (final ParseException ex) {
                            log.warn("exception while parsing date from line [" + line + "]", ex);
                            continue;
                        }

                        /*            final java.util.List results2 =
                                      session.createQuery("from EventGenericSrc as ev where ev.eventList = :event_list " +
                                          "and ev.date = :date")
                                      .setLong("event_list",
                                          group.getEventLists().get(EventGenericSrc.class.toString()).getId())
                                      .setDate("date", date)
                                      .list();*/
                        final java.util.List results2 = session
                                .createQuery("from EventGenericSrc as ev where ev.date = :date")
                                //              .setString("date", "2008-05-30 16:24:20.000000000")
                                .setString("date", new java.sql.Date(date.getTime()).toString()).list();
                        log.debug("date en ascii:" + new java.sql.Date(date.getTime()).toString());

                        if (results2.size() > 0)
                            log.debug("Deja un evt comme ca");
                        else
                            group.addEvent(synchro, new EventGenericSrc(date, true, -1, value1, value2, value3,
                                    value4, value5, value6, value7, value8, value9, value10, units));
                    }

                }
            }

            session.getTransaction().commit();
        }

        // stop synchronizing
        synchro.end();
    }

    /**
     * General entry point.
     * @param args command line arguments.
     * @return void.
     * @throws IOException io exception.
     * @throws FileNotFoundException file not found.
     */
    public static void main(final String[] args)
            throws IOException, FileNotFoundException, InterruptedException, AlgorithmException {
        Config config = null;
        Synchro synchro = null;
        Background background = null;
        GUI gui = null;
        Main main = null;
        SNMPManager snmp_manager = null;
        CaptureManager capture_mgr = null;

        if (args.length > 0) {
            if (args.length == 4 && args[0].equals("import") && args[1].equals("source")) {
                importGenericSrc(args);
                return;
            }
            log.error("invalid arguments");
            System.exit(1);
        }

        // Get configuration properties
        config = new Config();

        // Set debug level
        // debug level 1: simulate hundreds of ping per second to check the DB and hibernate abilities to handle lots of events
        config.setDebugLevel(0);

        // Read general logging rules
        GenericTools.initLogEngine(config);
        log.info(config.getString("log_engine_initialized"));
        log.info(config.getString("begin"));

        /*
        final MessageBox dialog = new MessageBox(new Shell(new org.eclipse.swt.widgets.Display()),
            SWT.ICON_QUESTION | SWT.YES | SWT.NO);
        // traduire
        dialog.setText("GNetWatch startup");
        dialog.setMessage("Database Selection:\ndo you want to erase the current database content ?");
        dialog.open();
        */

        // Initialize Object-Relational mapping
        synchro = new Synchro(config);

        // Do not check SSL certificates
        SSLContext ssl_context = null;
        try {
            ssl_context = SSLContext.getInstance("SSL");
            ssl_context.init(null, new TrustManager[] { new NoCheckTrustManager() }, new SecureRandom());
        } catch (final NoSuchAlgorithmException ex) {
            log.error("Exception", ex);
        } catch (final KeyManagementException ex) {
            log.error("Exception", ex);
        }
        HttpsURLConnection.setDefaultSSLSocketFactory(ssl_context.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            public final boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

        // Initialize background processes management
        background = new Background(config);
        background.createBackgroundThread();

        // Initialize packet capture on every interface
        capture_mgr = new CaptureManager(config);

        // Initialize main processes management
        main = new Main(config, capture_mgr);

        // Build SNMP Manager
        snmp_manager = new SNMPManager();

        // Build GUI
        gui = new GUI(config, background, main, snmp_manager, synchro);
        main.setGUI(gui);
        capture_mgr.setGUI(gui);
        gui.waitForCreation();

        // Initial configuration
        gui.createFromXML(gui.getConfig().getProperty("initialobjects"));

        // Move the GUI to the top of the drawing order
        gui.showGUI();

        // merge events at startup
        background.informQueue("merge-1", gui);

        // Wait for the GUI to terminate
        gui.join();
        // The GUI is now closed
        log.info(config.getString("end"));

        // Stop every application thread
        config.setEnd();
        gui.end();
        background.end();
        capture_mgr.unRegisterAllListeners();

        // stop synchronizing
        synchro.end();
    }
}