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.

10 numara olmuş eto eline sağlık…
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:)
[...] 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 [...]
[...] 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 [...]