]> WPIA git - gigi.git/blob - src/org/cacert/gigi/ping/PingerDaemon.java
[Database] implement the stuff for requesting domain reping.
[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.database.DatabaseConnection;
9 import org.cacert.gigi.dbObjects.Domain;
10 import org.cacert.gigi.dbObjects.User;
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 PreparedStatement updatePingStatus;
22
23     private KeyStore truststore;
24
25     public PingerDaemon(KeyStore truststore) {
26         this.truststore = truststore;
27     }
28
29     @Override
30     public void run() {
31         try {
32             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 ( pingconfig.reping='y' OR domainPinglog.configId IS NULL) AND domains.deleted IS NULL GROUP BY pingconfig.id");
33             enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
34             updatePingStatus = DatabaseConnection.getInstance().prepare("UPDATE pingconfig SET reping='n' WHERE id=?");
35             pingers.put("email", new EmailPinger());
36             pingers.put("ssl", new SSLPinger(truststore));
37             pingers.put("http", new HTTPFetch());
38             pingers.put("dns", new DNSPinger());
39         } catch (SQLException e) {
40             e.printStackTrace();
41         }
42         while (true) {
43             try {
44                 execute();
45             } catch (SQLException e) {
46                 e.printStackTrace();
47             }
48             try {
49                 Thread.sleep(5000);
50             } catch (InterruptedException e) {
51             }
52         }
53     }
54
55     private void execute() throws SQLException {
56
57         ResultSet rs = searchNeededPings.executeQuery();
58         while (rs.next()) {
59             String type = rs.getString("type");
60             String config = rs.getString("info");
61             DomainPinger dp = pingers.get(type);
62             if (dp != null) {
63                 String token = null;
64                 if (dp instanceof EmailPinger) {
65                     token = RandomToken.generateToken(16);
66                     config = config + ":" + token;
67                 }
68                 updatePingStatus.setInt(1, rs.getInt("id"));
69                 updatePingStatus.execute();
70                 enterPingResult.setInt(1, rs.getInt("id"));
71                 String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
72                 enterPingResult.setString(2, DomainPinger.PING_STILL_PENDING == resp ? "open" : DomainPinger.PING_SUCCEDED.equals(resp) ? "success" : "failed");
73                 enterPingResult.setString(3, resp);
74                 enterPingResult.setString(4, token);
75                 enterPingResult.execute();
76             }
77         }
78     }
79
80 }