# HG changeset patch # User František Kučera # Date 1235909050 -3600 # Node ID fd29fd5a8e29ae89cdb3f586206fd3948d056c15 # Parent be6383d38a3a7266fbb874358be260c6ec21f8ea Graf zobrazuje skutečná data – Počty útoků za den diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/DenniSouhrn.java --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/DenniSouhrn.java Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/DenniSouhrn.java Sun Mar 01 13:04:10 2009 +0100 @@ -3,6 +3,7 @@ import cz.frantovo.hrisniciSpameri.dao.CilDAO; import cz.frantovo.hrisniciSpameri.dao.SouhrnDAO; import cz.frantovo.hrisniciSpameri.dto.Cil; +import cz.frantovo.hrisniciSpameri.dto.Soucet; import cz.frantovo.hrisniciSpameri.dto.Souhrn; import java.io.Serializable; import java.sql.Date; @@ -11,6 +12,7 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; +import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -89,6 +91,10 @@ } } + public String getKonecString() { + return formatData.format(getKonec()); + } + public void setCilString(String cil) { try { this.cil = Integer.parseInt(cil); @@ -119,6 +125,11 @@ setKonec(getVychoziKonec()); } + /** + * @return Denní souhrny útoků – + * obsahuje IP adresy a domény útočníků, + * datum je den poslendího útoku daného útočníka na daný cíl. + */ public Collection getSouhrn() { Collection souhrn = new SouhrnDAO().getSouhrn(zacatek, konec, cil); @@ -132,6 +143,25 @@ } /** + * @return Vyšší stupeň agregace než souhrn – + * obsahuje jen součty útoků pro daný den a daný cíl, + * neobsahuje podrobnosti o útočnících (ip adresa, doména). + */ + public HashMap> getSoucty() { + HashMap> soucty = new SouhrnDAO().getSoucty(zacatek, konec, cil); + + /** ne všechno musíme posílat do JSP vrstvy */ + for (Collection ss : soucty.values()) { + for (Soucet s : ss) { + s.getCil().setDatabaze(null); + s.getCil().setSelekt(null); + } + } + + return soucty; + } + + /** * @return Seznam všech cílů. Ale bez těchto hodnot: databáze a selekt. */ public Collection getSeznamCilu() { diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/SouhrnDAO.java --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/SouhrnDAO.java Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/SouhrnDAO.java Sun Mar 01 13:04:10 2009 +0100 @@ -2,6 +2,7 @@ import cz.frantovo.hrisniciSpameri.dto.Cil; import cz.frantovo.hrisniciSpameri.dto.SitovaAdresa; +import cz.frantovo.hrisniciSpameri.dto.Soucet; import cz.frantovo.hrisniciSpameri.dto.Souhrn; import java.sql.Connection; import java.sql.Date; @@ -9,6 +10,7 @@ import java.sql.ResultSet; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.logging.Level; /** @@ -21,8 +23,9 @@ DENNI_SOUHRN, DENNI_SOUHRN_CIL, + DENNI_SOUCTY, + DENNI_SOUCTY_CIL } - private static final long DEN = 1000 * 60 * 60 * 24; /** * Získá z databáze souhrn útoků. Buď pro konkrétní den nebo pro dané období. @@ -81,4 +84,63 @@ return souhrn; } + + /** + * @param zacatek začátek období nebo konkrétní den + * @param konec konec období nebo null (pokud nás zajímá konkrétní den – což nás tady většinou nezajímá) + * @param cil id cíle nebo nula, pokud chceme všechny cíle + * @return součty útoků za jednotlivé dny, seskupené podle cílů + */ + public HashMap> getSoucty(Date zacatek, Date konec, int cil) { + HashMap> soucty = new HashMap>(); + + Connection db = getSpojeni(null); + if (db == null) { + return null; + } else { + PreparedStatement ps = null; + ResultSet rs = null; + try { + if (konec == null) { + konec = zacatek; + } + + if (cil == 0) { + ps = db.prepareStatement(getSQL(SQL.DENNI_SOUCTY)); + ps.setDate(1, zacatek); + ps.setDate(2, konec); + } else { + ps = db.prepareStatement(getSQL(SQL.DENNI_SOUCTY_CIL)); + ps.setDate(1, zacatek); + ps.setDate(2, konec); + ps.setInt(3, cil); + } + rs = ps.executeQuery(); + while (rs.next()) { + Soucet s = new Soucet(); + s.setDen(rs.getDate("den")); + s.setPocet(rs.getInt("pocet")); + + Cil c = new Cil(); + c.setId(rs.getInt("id")); + c.setNazev(rs.getString("nazev")); + c.setUrl(rs.getString("url")); + c.setSelekt(rs.getString("selekt")); + c.setDatabaze(rs.getString("databaze")); + s.setCil(c); + + if (soucty.get(c) == null) { + soucty.put(c, new ArrayList()); + } + + soucty.get(c).add(s); + } + } catch (Exception e) { + log.log(Level.SEVERE, "Chyba při získávání součtů z databáze", e); + } finally { + zavri(db, ps, rs); + } + } + return soucty; + } } \ No newline at end of file diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/SouhrnDAO.sql.xml --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/SouhrnDAO.sql.xml Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/SouhrnDAO.sql.xml Sun Mar 01 13:04:10 2009 +0100 @@ -42,4 +42,39 @@ ORDER BY max(den) DESC ]]> + + = date_trunc('day', ?::date) + AND den <= date_trunc('day', ?::date) + GROUP BY den, cil, id, nazev, url, selekt, databaze + ]]> + + + = date_trunc('day', ?::date) + AND den <= date_trunc('day', ?::date) + AND cil = ? + GROUP BY den, cil, id, nazev, url, selekt, databaze + ]]> + \ No newline at end of file diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dto/Cil.java --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dto/Cil.java Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dto/Cil.java Sun Mar 01 13:04:10 2009 +0100 @@ -65,4 +65,25 @@ public Cil() { } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Cil) { + Cil c = (Cil) obj; + return c.getId() == getId(); + } else { + return false; + } + } + + @Override + public int hashCode() { + int hash = 5; + hash = 67 * hash + this.id; + hash = 67 * hash + (this.nazev != null ? this.nazev.hashCode() : 0); + hash = 67 * hash + (this.url != null ? this.url.hashCode() : 0); + hash = 67 * hash + (this.selekt != null ? this.selekt.hashCode() : 0); + hash = 67 * hash + (this.databaze != null ? this.databaze.hashCode() : 0); + return hash; + } } diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dto/Soucet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dto/Soucet.java Sun Mar 01 13:04:10 2009 +0100 @@ -0,0 +1,41 @@ +package cz.frantovo.hrisniciSpameri.dto; + +import java.sql.Date; + +/** + * Ještě větší agregace než Souhrn. + * Obsahuje jen součet útoků na danou doménu pro daný den. + * Používá se pro zobrazení grafu. + * @see Souhrn + * @author fiki + */ +public class Soucet { + + private Date den; + private int pocet; + private Cil cil; + + public Date getDen() { + return den; + } + + public void setDen(Date den) { + this.den = den; + } + + public int getPocet() { + return pocet; + } + + public void setPocet(int pocet) { + this.pocet = pocet; + } + + public Cil getCil() { + return cil; + } + + public void setCil(Cil cil) { + this.cil = cil; + } +} diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/grafy/CasovyGrafUtoku.java --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/grafy/CasovyGrafUtoku.java Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/grafy/CasovyGrafUtoku.java Sun Mar 01 13:04:10 2009 +0100 @@ -1,12 +1,15 @@ package cz.frantovo.hrisniciSpameri.grafy; +import cz.frantovo.hrisniciSpameri.DenniSouhrn; +import cz.frantovo.hrisniciSpameri.dto.Soucet; import de.laures.cewolf.DatasetProduceException; import de.laures.cewolf.DatasetProducer; import de.laures.cewolf.links.CategoryItemLinkGenerator; import de.laures.cewolf.tooltips.CategoryToolTipGenerator; import java.io.Serializable; -import java.util.Calendar; +import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.Map; import org.jfree.data.category.CategoryDataset; import org.jfree.data.time.Day; @@ -22,22 +25,30 @@ private static final long serialVersionUID = -9133218147909088777L; - public XYDataset produceDataset(Map params) throws DatasetProduceException { + public XYDataset produceDataset(Map parametry) throws DatasetProduceException { - System.setProperty("java.awt.headless", "true"); + DenniSouhrn ds = new DenniSouhrn(); + ds.setZacatekString(String.valueOf(parametry.get("zacatek"))); + ds.setKonecString(String.valueOf(parametry.get("konec"))); + ds.setCilString(String.valueOf(parametry.get("cil"))); - TimeSeries timeseries = new TimeSeries("fond", org.jfree.data.time.Day.class); - TimeSeriesCollection dataset = new TimeSeriesCollection(); + HashMap casoveRady = new HashMap(); + for (Collection ss : ds.getSoucty().values()) { - Calendar datum = Calendar.getInstance(); - for (int i = 0; i < 11; i++) { - datum.add(Calendar.DAY_OF_YEAR, -1); - double nahodneCislo = 100 - 10 * i - 20 * Math.random(); - timeseries.add(new Day(datum.getTime()), nahodneCislo); + for (Soucet s : ss) { + if (casoveRady.get(s.getCil().getId()) == null) { + casoveRady.put(s.getCil().getId(), new TimeSeries(s.getCil().getNazev(), org.jfree.data.time.Day.class)); + } + casoveRady.get(s.getCil().getId()).add(new Day(s.getDen()), s.getPocet()); + } } - dataset.addSeries(timeseries); + TimeSeriesCollection dataset = new TimeSeriesCollection(); + for (TimeSeries ts : casoveRady.values()) { + dataset.addSeries(ts); + } + return dataset; } diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/web/graf.jspx --- a/java/HrisniciSpameri/web/graf.jspx Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/web/graf.jspx Sun Mar 01 13:04:10 2009 +0100 @@ -10,16 +10,13 @@ - + - - - - - - + + + @@ -28,6 +25,6 @@ - + diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/web/index.jsp --- a/java/HrisniciSpameri/web/index.jsp Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/web/index.jsp Sun Mar 01 13:04:10 2009 +0100 @@ -14,14 +14,11 @@

Hříšníci spameři

- + - - - - +
Program je vydán pod licencí: GNU Affero GPL. A zdrojové kódy jsou ke stažení: HrisniciSpameri-src.zip.
diff -r be6383d38a3a -r fd29fd5a8e29 java/HrisniciSpameri/web/souhrn.jspx --- a/java/HrisniciSpameri/web/souhrn.jspx Sun Mar 01 01:08:24 2009 +0100 +++ b/java/HrisniciSpameri/web/souhrn.jspx Sun Mar 01 13:04:10 2009 +0100 @@ -1,9 +1,4 @@ - Začátek:


+ @@ -85,6 +81,6 @@ - +