]> WPIA git - gigi.git/commitdiff
ADD: the daemon for pinging domains. (ping via email still missing)
authorFelix Dörre <felix@dogcraft.de>
Sun, 24 Aug 2014 05:10:32 +0000 (07:10 +0200)
committerFelix Dörre <felix@dogcraft.de>
Sun, 24 Aug 2014 05:16:55 +0000 (07:16 +0200)
doc/tableStructure.sql
src/org/cacert/gigi/ping/DNSPinger.java
src/org/cacert/gigi/ping/DomainPinger.java
src/org/cacert/gigi/ping/HTTPFetch.java
src/org/cacert/gigi/ping/PingerDaemon.java [new file with mode: 0644]
src/org/cacert/gigi/ping/SSLPinger.java

index 2e4e5c0485cd5c35d22e6509ad60d88bee46b352..6b2806da4cf1f46159ccf67a0cb6bcb2dfca9e16 100644 (file)
@@ -74,19 +74,19 @@ CREATE TABLE `emailPinglog` (
 
 DROP TABLE IF EXISTS `pingconfig`;
 CREATE TABLE `pingconfig` (
+  `id` int(13) NOT NULL AUTO_INCREMENT,
   `domainid` int(11) NOT NULL,
   `type` enum('email', 'ssl', 'http', 'dns') NOT NULL,
-  `info` varchar(255) NOT NULL
+  `info` varchar(255) NOT NULL,
+  PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 
 DROP TABLE IF EXISTS `domainPinglog`;
 CREATE TABLE `domainPinglog` (
-  `when` datetime NOT NULL,
-  `uid` int(11) NOT NULL,
-  `domainid` int(11) NOT NULL,
-  `type` enum('email', 'ssl', 'http', 'dns') NOT NULL,
-  `status` enum('open', 'success', 'failed') NOT NULL,
+  `when` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `configId` int(13) NOT NULL,
+  `state` enum('open', 'success', 'failed') NOT NULL,
   `result` varchar(255) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
index ece3d1b9b36389de762885a364be998444e87e1a..3dc9ac60a8b51d23e915f28997cf02c1a416e2e7 100644 (file)
@@ -9,8 +9,10 @@ import java.util.LinkedList;
 public class DNSPinger extends DomainPinger {
 
     @Override
-    public void ping(String domain, String configuration, String expToken) {
+    public String ping(String domain, String expToken) {
         try {
+            String[] tokenParts = expToken.split(":", 2);
+
             Process p = Runtime.getRuntime().exec(new String[] {
                     "dig", "+short", "NS", domain
             });
@@ -27,7 +29,7 @@ public class DNSPinger extends DomainPinger {
             nameservers:
             for (String NS : nameservers) {
                 String[] call = new String[] {
-                        "dig", "+short", "TXT", "cacert." + domain, NS
+                        "dig", "@" + NS, "+short", "TXT", "cacert-" + tokenParts[0] + "." + domain
                 };
                 System.out.println(Arrays.toString(call));
                 p = Runtime.getRuntime().exec(call);
@@ -40,7 +42,7 @@ public class DNSPinger extends DomainPinger {
                     }
                     found = true;
                     token = line.substring(1, line.length() - 1);
-                    if (token.equals(expToken)) {
+                    if (token.equals(tokenParts[1])) {
                         continue nameservers;
                     }
                 }
@@ -55,15 +57,13 @@ public class DNSPinger extends DomainPinger {
 
             }
             if ( !failed) {
-                // Success
-                return;
+                return PING_SUCCEDED;
             }
-            System.out.println(result.toString());
+            return result.toString();
         } catch (IOException e) {
             e.printStackTrace();
-            // FAIL
+            return "Connection closed";
         }
-        // FAIL
     }
 
 }
index c9c1584d2c58d624946da465ac063763e4949c55..3044f34db3992e47c9edaa92a8102cb48fb2f475 100644 (file)
@@ -2,5 +2,9 @@ package org.cacert.gigi.ping;
 
 public abstract class DomainPinger {
 
-    public abstract void ping(String domain, String configuration, String token);
+    public static final String PING_STILL_PENDING = null;
+
+    public static final String PING_SUCCEDED = "";
+
+    public abstract String ping(String domain, String configuration);
 }
index de4990fc3f897472f590ab18ff2c74834f91d1a2..3bb2d095d3dd598c4f6c86f5fd594983fcbf48c9 100644 (file)
@@ -3,27 +3,33 @@ package org.cacert.gigi.ping;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
 import java.net.URL;
 
 public class HTTPFetch extends DomainPinger {
 
     @Override
-    public void ping(String domain, String configuration, String expToken) {
+    public String ping(String domain, String expToken) {
         try {
-            URL u = new URL("http://" + domain + "/cacert_rai.txt");
-            BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream(), "UTF-8"));
+            String[] tokenParts = expToken.split(":", 2);
+            URL u = new URL("http://" + domain + "/cacert_" + tokenParts[0] + ".txt");
+            System.out.println(u.toString());
+            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
+            if (huc.getResponseCode() != 200) {
+                return "Invalid status code.";
+            }
+            BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream(), "UTF-8"));
             String line = br.readLine();
             if (line == null) {
-                // empty
-                return;
+                return "No response from your server.";
             }
-            if (line.equals(expToken)) {
-                // found
+            if (line.trim().equals(tokenParts[1])) {
+                return PING_SUCCEDED;
             }
-            // differ
+            return "Challange tokens differed.";
         } catch (IOException e) {
             e.printStackTrace();
-            // error
+            return "Connection closed.";
         }
     }
 }
diff --git a/src/org/cacert/gigi/ping/PingerDaemon.java b/src/org/cacert/gigi/ping/PingerDaemon.java
new file mode 100644 (file)
index 0000000..595b6a6
--- /dev/null
@@ -0,0 +1,58 @@
+package org.cacert.gigi.ping;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Properties;
+
+import org.cacert.gigi.database.DatabaseConnection;
+
+public class PingerDaemon implements Runnable {
+
+    HashMap<String, DomainPinger> pingers = new HashMap<>();
+
+    public PingerDaemon() {
+        // pingers.put("email",);
+        pingers.put("ssl", new SSLPinger());
+        pingers.put("http", new HTTPFetch());
+        pingers.put("dns", new DNSPinger());
+
+    }
+
+    @Override
+    public void run() {
+        try {
+            PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT pingconfig.*, domains.domain FROM pingconfig LEFT JOIN domainPinglog ON domainPinglog.configId=pingconfig.id INNER JOIN domains ON domains.id=pingconfig.domainid WHERE domainPinglog.configId IS NULL ");
+            PreparedStatement result = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?");
+
+            ResultSet rs = ps.executeQuery();
+            while (rs.next()) {
+                String type = rs.getString("type");
+                String config = rs.getString("info");
+                System.out.println(type);
+                System.out.println(config);
+                DomainPinger dp = pingers.get(type);
+                if (dp != null) {
+                    result.setInt(1, rs.getInt("id"));
+                    String resp = dp.ping(rs.getString("domain"), config);
+                    result.setString(2, resp == DomainPinger.PING_STILL_PENDING ? "open" : resp == DomainPinger.PING_SUCCEDED ? "success" : "failed");
+                    result.setString(3, resp);
+                    result.execute();
+                }
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        Properties conf = new Properties();
+        conf.load(new FileReader("config/gigi.properties"));
+        DatabaseConnection.init(conf);
+        new PingerDaemon().run();
+
+    }
+}
index 32434079a3e477c7a7d8f8e138c01a8088f67156..ccb05b84a218761293a76b6ea5ce26a383e41858 100644 (file)
@@ -27,7 +27,7 @@ public class SSLPinger extends DomainPinger {
     };
 
     @Override
-    public void ping(String domain, String configuration, String expToken) {
+    public String ping(String domain, String configuration) {
         try {
             SocketChannel sch = SocketChannel.open();
             String[] parts = configuration.split(":", 2);
@@ -49,9 +49,9 @@ public class SSLPinger extends DomainPinger {
 
                 }
             }
-            test(sch, domain);
+            return test(sch, domain);
         } catch (IOException e) {
-            e.printStackTrace();
+            return "Connecton failed";
         }
 
     }
@@ -130,7 +130,7 @@ public class SSLPinger extends DomainPinger {
         }
     }
 
-    private void test(SocketChannel sch, String domain) {
+    private String test(SocketChannel sch, String domain) {
         try {
             SSLContext sc = SSLContext.getDefault();
             SSLEngine se = sc.createSSLEngine();
@@ -185,12 +185,16 @@ public class SSLPinger extends DomainPinger {
             for (X509Certificate x509Certificate : peerCertificateChain) {
                 System.out.println(x509Certificate.getSubjectDN().getName());
             }
+            return PING_SUCCEDED;
         } catch (NoSuchAlgorithmException e) {
             e.printStackTrace();
+            return "Security failed";
         } catch (SSLException e) {
             e.printStackTrace();
+            return "Security failed";
         } catch (IOException e) {
             e.printStackTrace();
+            return "Connection closed";
         }
     }
 }