]> WPIA git - gigi.git/blob - src/org/cacert/gigi/ping/PingerDaemon.java
Move the "dbObject"s to their own package.
[gigi.git] / src / org / cacert / gigi / ping / PingerDaemon.java
1 package org.cacert.gigi.ping;
2
3 import java.security.KeyStore;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.util.HashMap;
8
9 import org.cacert.gigi.database.DatabaseConnection;
10 import org.cacert.gigi.dbObjects.Domain;
11 import org.cacert.gigi.dbObjects.User;
12 import org.cacert.gigi.util.RandomToken;
13
14 public class PingerDaemon extends Thread {
15
16     HashMap<String, DomainPinger> pingers = new HashMap<>();
17
18     private PreparedStatement searchNeededPings;
19
20     private PreparedStatement enterPingResult;
21
22     private KeyStore truststore;
23
24     public PingerDaemon(KeyStore truststore) {
25         this.truststore = truststore;
26     }
27
28     @Override
29     public void run() {
30         try {
31             searchNeededPings = DatabaseConnection.getInstance().prepare("SELECT pingconfig.*, domains.domain, domains.memid FROM pingconfig LEFT JOIN domainPinglog ON domainPinglog.configId=pingconfig.id INNER JOIN domains ON domains.id=pingconfig.domainid WHERE domainPinglog.configId IS NULL ");
32             enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
33             pingers.put("email", new EmailPinger());
34             pingers.put("ssl", new SSLPinger(truststore));
35             pingers.put("http", new HTTPFetch());
36             pingers.put("dns", new DNSPinger());
37         } catch (SQLException e) {
38             e.printStackTrace();
39         }
40         while (true) {
41             try {
42                 execute();
43             } catch (SQLException e) {
44                 e.printStackTrace();
45             }
46             try {
47                 Thread.sleep(5000);
48             } catch (InterruptedException e) {
49             }
50         }
51     }
52
53     private void execute() throws SQLException {
54
55         ResultSet rs = searchNeededPings.executeQuery();
56         while (rs.next()) {
57             String type = rs.getString("type");
58             String config = rs.getString("info");
59             DomainPinger dp = pingers.get(type);
60             if (dp != null) {
61                 String token = null;
62                 if (dp instanceof EmailPinger) {
63                     token = RandomToken.generateToken(16);
64                     config = config + ":" + token;
65                 }
66                 enterPingResult.setInt(1, rs.getInt("id"));
67                 String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
68                 enterPingResult.setString(2, DomainPinger.PING_STILL_PENDING == resp ? "open" : DomainPinger.PING_SUCCEDED.equals(resp) ? "success" : "failed");
69                 enterPingResult.setString(3, resp);
70                 enterPingResult.setString(4, token);
71                 enterPingResult.execute();
72             }
73         }
74     }
75 }