Mehmet Ethem SULAN :: JSF JSP JavaScript Ajax jQuery CSS :: Java Crontab XML file Parser JSP Ajax Example

Crontab ile networku taradım(10 dk da bir mesela) ve sonuclari crontab.xml dosyasına kaydettim. Java ile bu xml dosyasını parse ettim. JSP AJax ile ekranda gösterdim. Belli zamanda crontab XML_Par_Read.java classini calistirip veritabanina kaydediyor.
Bu uygulamayı indirmek için tıklayın.
Hostlara ait mac, ip adresleri, işletim sistemi ve closed olmayan portlarını parse ettim ve veritabanina kaydettim.
Crontab arkaplanda belli zaman dilimlerinde çalışmak istediğiniz işlermleri tanımlamaya yarar. Yani işletim sistemine komut göndererek birçok işlem tanımlayabilirsiniz.
Ubuntu da gedit ile açtım. crontab -e komutu ile çalıştırabilirisniz.

root@ethem:/home/ubuntu# EDITOR=gedit crontab -e

Crontab içine nmap komutunu çalıştırdım: nmap -sS -A 192.168.2.0/24 -oX
Nmap sisteminiz de yoksa apt-get install nmap ile install edebilirisniz. gedit ile açtığım dosyaya aşağıdaki komutu ekledim.

*/10 * * * * nmap -sS -A 192.168.2.0/24 -oX /home/ubuntu/crontab.xml

XML_Par_Read.java classini derlemek için aşağıdaki kodu yaziyoruz crontab içine

48 20 * * * javac -classpath "/usr/lib/jdk1.6.0_23/bin" /home/ubuntu/NetBeansProjects/Netwok/src/java/ethem/XML_Par_Read.java

XML_Par_Read.java classini çalıştırmak için de aşağıdaki komutu crontab içine yazıyoruz. Bu sınıf crontab.xml dosyasını parse ediyor ve belirlenen zamanda otomatik olarak crontab tarafından çalışarak veritabanına kaydediyor. MySQL veritabanı ile ilgili işlemler gerçekleştiğinden mysql jdbc connector.jar dosyasının yolunu da belirtmemiz lazım.
: noktadan sonra da hangi classın çalıştıracağını tek komutta(.jar dosyasının yolunu belirtme ayrı bir işlem ve XML_Par_Read sınıfını çalıştırmak ayrı bir işlemdir. Onun için : ile ayırıyoruz) belirtiyoruz. ethem paketinin altında olduğundan ethem.XML.Par_Read diye belirtmemiz gerekiyor.

14 17 * * * java -classpath /usr/local/netbeans-6.8/ide12/modules/ext/mysql-connector-java-5.1.6-bin.jar:/home/ubuntu/NetBeansProjects/Netwok/src/java ethem.XML_Par_Read

Bu crontab.xml dosyasını org.w3c.dom ve javax.xml.parsers Java paketlerini kullanarak parse ettim.
Consola nmap -sS -A 192.168.2.0/24 -oX /home/ubuntu/crontab.xml yazip ağınızı tarayıp xml e kaydedebilirsiniz.
Kodu test etmek için xml dosyasını oluşturabilirisniz.
root@ethem:/home/ubuntu# nmap -sS -A 192.168.2.0/24 -oX /home/ubuntu/crontab.xml
İndex.jsp sayfasi


index.jsp

<%-- 
    Document   : index
    Created on : Dec 28, 2010, 3:53:15 PM
    Author     : ubuntu
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>

        <script type="text/javascript" language="javascript" src="jquery-1.4.4.js"></script>
        <script type="text/javascript" language="javascript">
            $(function(){
                $('#butId').click(function(){
                   
                    $.get("Listele.jsp", $('#form1').serialize(), function(sonuc){
                        $('#divId').html("Yükleniyor..");
                        $('#divId').html(sonuc);
                    })

                });

                $('a.host_id').live('click', function(){
                    $.get(this.href, {}, function(sonuc){
                        $('#portSonuclari').hide().html(sonuc).fadeIn(500);
                    })
                    return false;
                });
            });
        </script>
    </head>
    <body>


        <p>Aga dahil olan hostlarin zamanini tespit ediyor</p>
        <form id="form1">
            <table>
                <tr>
                    <td>
                        <select name="zaman">
                            <option value="birSaat"> Son bir saatte dahil olanlar</option>
                            <option value="yediSaat">Son yedi saatte dahil olanlar</option>
                            <option value="birGun">Son bir Gunde dahil olanlar</option>
                            <option value="onGun">Son on gunde dahil olanlar</option>
                            <option value="birAy">Son bir ayda dahil olanlar</option>
                            <option value="besAy">Son bes ayda dahil olanlar</option>
                            <option value="birYil">Son bir yil aga dahil olanlar</option>
                            <option value="hepsi">Aga dahil olan butun hostlar</option>
                        </select>
                    </td>
            </table>
        </form>
        <div id="divId"></div>
        <p><button id="butId">Listele</button></p>
    </body>
</html>

Listele.jsp

<%-- 
    Document   : Listele
    Created on : Dec 28, 2010, 4:04:08 PM
    Author     : ubuntu
--%>

<%@page import="java.sql.ResultSet"%>
<%@page import="java.util.ArrayList"%>
<%@page import="ethemsulan.com.Islemler" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>


<%!    String tarih;
    ArrayList<Integer> listemiz;
    ResultSet rs;
%>
<%-- index.jsp de secilen sureye ait kayitlari listeliyor.
Mesela bir ay once aga dahil olan pc lerin bilgilerini listeler--%>
<%
            listemiz = new ArrayList<Integer>();

            tarih = request.getParameter("zaman");
            listemiz = Islemler.sonuc(tarih);
%>

<table border="1" id="tablo">
    <thead align="center">
        <tr>
            <th>ID</th>
            <th>Mac Adresi</th>
            <th>Ip Adresi</th>
            <th>Operating System</th>
            <th>Time</th>
        </tr>
    </thead>
    
    <%
                for (Integer id : listemiz) {
                    rs = Islemler.listele(id);
                    while (rs.next()) {

    %>
    <tbody>
        
        <tr>
        <td>
                <%--Icon tiklandiignda bu ideye ait acik portlarini listeliyorum ?id=<%=rs.getInt("id")   --%>
                <a href='AcikPort.jsp?id=<%=rs.getInt("id")%>' class="host_id"><img src="port.png" border="0" /></a>
            </td>
            <td><%=rs.getString("mac")%></td>
            <td><%=rs.getString("ip_no")%></td>
            <td><%=rs.getString("os")%> </td>
            <td><%=rs.getString("host_zaman")%></td>
        </tr>
        
    </tbody>
    <%

                    }
                }
    %>
</table>
<div id="portSonuclari"></div>

AcikPort.jsp

<%@page import="java.sql.ResultSet"%>
<%@page import="ethemsulan.com.Islemler" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!doctype html>


<%!
    Integer gelenId;
    ResultSet sonuc;
    String k = null;
%>
<%-- Listele.jsp deki icon tiklandiginda gelen id primary keyine ait portlari listeliyor--%>
<%
            gelenId = Integer.parseInt(request.getParameter("id"));
            sonuc = Islemler.portListele(gelenId);
%>
<%
out.println("Closed olmayan portlar");
            while (sonuc.next()) {
%>
<table>
    <tr>
        <td>PortNo --></td>
        <td><%=sonuc.getInt("port_no")%></td>
    </tr>
    <%
                }
    %>
</table>

XML_Par_Read.java

package ethem;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XML_Par_Read {
       static Connection baglanti = null;
    static PreparedStatement statement;
    static ResultSet sonuc;
    static int id;


        public static Connection getMySQLConnection() throws Exception {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost/network";
        String username = "root";
        String password = "123";
        Class.forName(driver);
        return DriverManager.getConnection(url, username, password);
    }

    public static boolean storeXMLData(ArrayList<String> listemiz) {


        try {
            baglanti = getMySQLConnection();
            statement = baglanti.prepareStatement("select mac from hostlar where mac='" + listemiz.get(1) + "'");
            sonuc = statement.executeQuery();
            if (sonuc.next() == false) {
                statement.executeUpdate("insert into hostlar(os,mac,host_zaman) values('" + listemiz.get(0) + "', '" + listemiz.get(1) + "',now())");
             }

            statement = baglanti.prepareStatement("select id from hostlar where mac='" + listemiz.get(1) + "'");
            sonuc = statement.executeQuery();
            if (sonuc.next()) {
                id = sonuc.getInt("id");
                System.out.println("Id degerini test ediyoruz: " + id);
            }

            statement = baglanti.prepareStatement("select ip_no from ipler where ip_no='" + listemiz.get(2) + "'");
            sonuc = statement.executeQuery();
            if (sonuc.next() == false) {
                statement.executeUpdate("insert into ipler(ip_no,host_id,ip_zaman) values('" + listemiz.get(2) + "','" + id + "',now())");
            }

            statement = baglanti.prepareStatement("select port_no from portlar where host_id='" + id + "'");
            sonuc = statement.executeQuery();
            int port = 0;



            for (int i = 3; i < listemiz.size(); i++) {
                statement = baglanti.prepareStatement("select id from portlar where port_no='" + listemiz.get(i) + "' and host_id='" + id + "'");
                sonuc = statement.executeQuery();
                if (sonuc.next() == false) {
                    statement.executeUpdate("insert into portlar(port_no,host_id,port_zaman) values('" + listemiz.get(i) + "','" + id + "',now())");
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                sonuc.close();
                statement.close();
                baglanti.close();
                return true;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;

    }

    private static ArrayList<String> list;

    public static void XMLReaderBeg() {
        try {
//.xml dosyasinin bulundugu url
            File file = new File("/home/ubuntu/crontab.xml");
//xml parse etmek icin javax.xml ve org.w3c paketlerindeki obje ve metod tanimladim
//onemli olan xml etiketleri arasindaki degerleri agac yapisi seklinde dusunmemiz lazim.
//jdom ve dom4j gibi xml parser kutuphaneleri de var.
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(file);
            doc.getDocumentElement().normalize();
//agacin root nodunu yazdiriyorum.Ornekte xml dosyasina bakarsaniz "nmaprun" oldugunu gorursunuz
            System.out.println("Root Element: " + doc.getDocumentElement().getNodeName());
//sonra host nodu ve bu hots etiketlerinin childlarini bir NodeList e atiyor
            NodeList nodeLst = doc.getElementsByTagName("host");
//crontab dosyasindaki komuta bakarsaniz 0/24 yani 256 tane host taranmis
            System.out.println("Host sayisi: " + nodeLst.getLength());
//Node listemizdeki itemlara erisiyoruz
            for (int s = 0; s < nodeLst.getLength(); s++) {

                Node fstNode = nodeLst.item(s);
                if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
//Bu parse ettigimiz xml i belli sirada arraylistte depoluyoruz ve oradan veritabanina
                    list = new ArrayList<String>();
                    Element fstElmnt = (Element) fstNode;
//statusa ait childlari aliyoruz
                    NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("status");
                    Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
//state durumu up yani hosta ait pc varsa o pc lere ait operating system, ip, mac adresleri ve
//closed olmayan portlarini aliyoruz. Open ve filtered olanlari yani
                    if (fstNmElmnt.getAttribute("state").equals("up")) {
//os nodunun da childlarindan nameleri yani linux veya windows..
                        NodeList osList = fstElmnt.getElementsByTagName("os");
                        for (int temp = 0; temp < osList.getLength(); temp++) {

                            Node osNode = osList.item(0);
                            if (osNode.getNodeType() == Node.ELEMENT_NODE) {
//<os> <osmatch name="Linux 2.6.9 - 2.6.19" </os> name i aliyoruz
                                Element eElement = (Element) osNode;
                                NodeList osLis = eElement.getElementsByTagName("osmatch");
                                Element osName = (Element) osLis.item(temp);
                                list.add(0, osName.getAttribute("name"));


                            }
                        }
//<address addr="192.168.2.1" />
//<address addr="00:1C:A8:8D:08:17"/> mac adresi ve ip adreslerini aliyoruz
                        NodeList adress = fstElmnt.getElementsByTagName("address");
                        Element macAdresi = (Element) adress.item(1);
                        list.add(1, macAdresi.getAttribute("addr"));
                        Element ipAdresi = (Element) adress.item(0);
                        list.add(2, ipAdresi.getAttribute("addr"));


//Ports

                        NodeList ports = fstElmnt.getElementsByTagName("port");
                        for (int p = 0; p < ports.getLength(); p++) {

                            Node portsNode = nodeLst.item(p);
                            if (portsNode.getNodeType() == Node.ELEMENT_NODE) {
                                Element portNum = (Element) ports.item(p);
//portlarda durumu closed olmayanlari aldim
                                if (!portNum.getAttribute("state").equals("closed")) {
                                    list.add(portNum.getAttribute("portid"));
                                }
                            }
                        }
//Belli sirada arraylistte bulunan datalari veritabani tablolarina kaydediyor
                        storeXMLData(list);


                        System.out.println("---------------------------------");
                    }
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }




    }

   public static void main(String args[])
   {
        XMLReaderBeg();
   }



}

Islemler.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ethemsulan.com;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import ethem.XML_Par_Read;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author ubuntu
 */
public class Islemler {
           static Connection baglanti = null;
    static Statement statement;
    static ResultSet sonuc;
        private static ArrayList<Integer> ideler;

       public static ResultSet portListele(int id) {
        try {
            baglanti = XML_Par_Read.getMySQLConnection();
            statement = baglanti.createStatement();
            sonuc=statement.executeQuery("SELECT portlar.port_no FROM hostlar Inner Join portlar ON hostlar.id = portlar.host_id WHERE  portlar.host_id='" + id + "'");


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return sonuc;
        }
    }

           public static ResultSet listele(int id) {
        try {
            baglanti = XML_Par_Read.getMySQLConnection();
            statement = baglanti.createStatement();
            sonuc=statement.executeQuery("SELECT hostlar.id,hostlar.mac,hostlar.os,hostlar.host_zaman,ipler.ip_no FROM hostlar Inner Join ipler ON hostlar.id = ipler.host_id WHERE hostlar.id =  ipler.host_id AND hostlar.id =  '" + id + "'");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return sonuc;
        }

    }

       public static ArrayList<Integer> sonuc(String tarih) throws SQLException, Exception {
        ideler = new ArrayList<Integer>();

        try {
            baglanti =XML_Par_Read.getMySQLConnection();
            statement =  baglanti.createStatement();

            if (tarih.equals("birSaat")) {

                sonuc = statement.executeQuery("select id from hostlar where 1>(SELECT TIMESTAMPDIFF(hour,host_zaman,CURRENT_TIMESTAMP()))");
            } else if (tarih.equals("yediSaat")) {
                sonuc = statement.executeQuery("select id from hostlar where 7>(SELECT TIMESTAMPDIFF(hour,host_zaman,CURRENT_TIMESTAMP()))");
            } else if (tarih.equals("birGun")) {
                sonuc = statement.executeQuery("select id from hostlar where 1>(SELECT TIMESTAMPDIFF(day,host_zaman,CURRENT_TIMESTAMP()))");
            } else if (tarih.equals("onGun")) {
                sonuc = statement.executeQuery("select id from hostlar where 10>(SELECT TIMESTAMPDIFF(day,host_zaman,CURRENT_TIMESTAMP()))");

            } else if (tarih.equals("birAy")) {
                sonuc = statement.executeQuery("select id from hostlar where 1>(SELECT TIMESTAMPDIFF(month,host_zaman,CURRENT_TIMESTAMP()))");
            } else if (tarih.equals("besAy")) {
                sonuc = statement.executeQuery("select id from hostlar where 5>(SELECT TIMESTAMPDIFF(month,host_zaman,CURRENT_TIMESTAMP()))");
            } else if (tarih.equals("birYil")) {
                sonuc = statement.executeQuery("select id from hostlar where 1>(SELECT TIMESTAMPDIFF(year,host_zaman,CURRENT_TIMESTAMP()))");
            }else{
                sonuc = statement.executeQuery("select id from hostlar");
            }
//Search kriterlerin uygun olanin id esini listeye ekliyorum ve listeyi resturn ediyorum
            while (sonuc.next()) {
                ideler.add(sonuc.getInt("id"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                sonuc.close();
                statement.close();
                baglanti.close();
                return ideler;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return null;

    }

}

Running and compiling a java class in the crontab Linux benzer örneğe bakabilirsiniz.

Comments

There are 4 comments for this post.

  1. Tayfur Yilmaz on Aralık 30, 2010 10:09 pm

    10 numara olmuş eto eline sağlık…

  2. ethemsulan on Aralık 30, 2010 10:14 pm

    Beğendiğine sevindim üstat. Yanlız Linux’ta NetBeans 7.0 jquery kütüphanesini görmüyor. Eğer test edersen kodu, daha önceki sürümlerinde test et:)

  3. Mehmet Ethem SULAN :: Java Programlama Dili :: Running and compiling a java class in the crontab Linux on Ocak 14, 2011 8:20 pm

    […] diye derlemeyi de gösterdim. Zamanı 21:20 gibi bir değer veririsek o zaman sorun olmaz tabi. Crontab’ı Linux consolundan çalıştırmayı bilmiyorsanız tıklayın(bu örnekte de nmap ile ağ taranıp veriler .xml dosyasına kaydediliyor). Crontab içinde […]

  4. Mehmet Ethem SULAN :: Android :: Android XML Parsing from Internet with DOM Multichoice ArrayAdapter Sample on Mayıs 1, 2011 2:05 pm

    […] kullanarak listeledim. Bu örneği daha iyi anlamak için Java Crontab XML file Parser JSP Ajax Example bakabilirisniz. Android ile belirtilen urldeki xml dosyasına bağlanmak için internette erişim […]

Write a Comment

Let me know what you think?