]> WPIA git - gigi.git/blob - src/org/cacert/gigi/ping/PingerDaemon.java
ADD: simple pinger daemon.
[gigi.git] / src / org / cacert / gigi / ping / PingerDaemon.java
1 package org.cacert.gigi.ping;
2
3 import java.io.FileReader;
4 import java.io.IOException;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8 import java.util.HashMap;
9 import java.util.Properties;
10
11 import org.cacert.gigi.Domain;
12 import org.cacert.gigi.User;
13 import org.cacert.gigi.database.DatabaseConnection;
14 import org.cacert.gigi.util.RandomToken;
15
16 public class PingerDaemon extends Thread {
17
18     HashMap<String, DomainPinger> pingers = new HashMap<>();
19
20     private PreparedStatement searchNeededPings;
21
22     private PreparedStatement enterPingResult;
23
24     @Override
25     public void run() {
26         try {
27             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 ");
28             enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
29             pingers.put("email", new EmailPinger());
30             pingers.put("ssl", new SSLPinger());
31             pingers.put("http", new HTTPFetch());
32             pingers.put("dns", new DNSPinger());
33         } catch (SQLException e) {
34             e.printStackTrace();
35         }
36         while (true) {
37             try {
38                 execute();
39             } catch (SQLException e) {
40                 e.printStackTrace();
41             }
42             try {
43                 Thread.sleep(5000);
44             } catch (InterruptedException e) {
45                 e.printStackTrace();
46             }
47         }
48     }
49
50     private void execute() throws SQLException {
51
52         ResultSet rs = searchNeededPings.executeQuery();
53         while (rs.next()) {
54             String type = rs.getString("type");
55             String config = rs.getString("info");
56             DomainPinger dp = pingers.get(type);
57             if (dp != null) {
58                 String token = null;
59                 if (dp instanceof EmailPinger) {
60                     token = RandomToken.generateToken(16);
61                     config = config + ":" + token;
62                 }
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, resp == DomainPinger.PING_STILL_PENDING ? "open" : resp == DomainPinger.PING_SUCCEDED ? "success" : "failed");
66                 enterPingResult.setString(3, resp);
67                 enterPingResult.setString(4, token);
68                 enterPingResult.execute();
69             }
70         }
71     }
72
73     public static void main(String[] args) throws IOException {
74         Properties conf = new Properties();
75         conf.load(new FileReader("config/gigi.properties"));
76         DatabaseConnection.init(conf);
77         new PingerDaemon().run();
78
79     }
80 }