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