]> WPIA git - gigi.git/blob - src/org/cacert/gigi/ping/PingerDaemon.java
2a3167438851969d613ea8575ebd4d5ae0850c72
[gigi.git] / src / org / cacert / gigi / ping / PingerDaemon.java
1 package org.cacert.gigi.ping;
2
3 import java.security.KeyStore;
4 import java.util.HashMap;
5
6 import org.cacert.gigi.database.DatabaseConnection;
7 import org.cacert.gigi.database.GigiPreparedStatement;
8 import org.cacert.gigi.database.GigiResultSet;
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 GigiPreparedStatement searchNeededPings;
18
19     private GigiPreparedStatement enterPingResult;
20
21     private GigiPreparedStatement 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         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");
32         enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
33         updatePingStatus = DatabaseConnection.getInstance().prepare("UPDATE pingconfig SET reping='n' WHERE id=?");
34         pingers.put("email", new EmailPinger());
35         pingers.put("ssl", new SSLPinger(truststore));
36         pingers.put("http", new HTTPFetch());
37         pingers.put("dns", new DNSPinger());
38
39         while (true) {
40             execute();
41             try {
42                 Thread.sleep(5000);
43             } catch (InterruptedException e) {
44             }
45         }
46     }
47
48     private void execute() {
49
50         GigiResultSet rs = searchNeededPings.executeQuery();
51         while (rs.next()) {
52             String type = rs.getString("type");
53             String config = rs.getString("info");
54             DomainPinger dp = pingers.get(type);
55             if (dp != null) {
56                 String token = null;
57                 if (dp instanceof EmailPinger) {
58                     token = RandomToken.generateToken(16);
59                     config = config + ":" + token;
60                 }
61                 updatePingStatus.setInt(1, rs.getInt("id"));
62                 updatePingStatus.execute();
63                 enterPingResult.setInt(1, rs.getInt("id"));
64                 String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
65                 enterPingResult.setString(2, DomainPinger.PING_STILL_PENDING == resp ? "open" : DomainPinger.PING_SUCCEDED.equals(resp) ? "success" : "failed");
66                 enterPingResult.setString(3, resp);
67                 enterPingResult.setString(4, token);
68                 enterPingResult.execute();
69             }
70         }
71     }
72
73 }