]> WPIA git - gigi.git/blob - src/org/cacert/gigi/ping/DNSPinger.java
a611a239bc361d07380473a8105a00010a6ca1ec
[gigi.git] / src / org / cacert / gigi / ping / DNSPinger.java
1 package org.cacert.gigi.ping;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.util.Arrays;
7 import java.util.LinkedList;
8
9 import org.cacert.gigi.Domain;
10 import org.cacert.gigi.User;
11
12 public class DNSPinger extends DomainPinger {
13
14     @Override
15     public String ping(Domain domain, String expToken, User u) {
16         try {
17             String[] tokenParts = expToken.split(":", 2);
18
19             Process p = Runtime.getRuntime().exec(new String[] {
20                     "dig", "+short", "NS", domain.getSuffix()
21             });
22             BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
23             String line;
24             LinkedList<String> nameservers = new LinkedList<String>();
25             while ((line = br.readLine()) != null) {
26                 nameservers.add(line);
27             }
28             p.destroy();
29             StringBuffer result = new StringBuffer();
30             result.append("failed: ");
31             boolean failed = nameservers.isEmpty();
32             nameservers:
33             for (String NS : nameservers) {
34                 String[] call = new String[] {
35                         "dig", "@" + NS, "+short", "TXT", "cacert-" + tokenParts[0] + "." + domain.getSuffix()
36                 };
37                 System.out.println(Arrays.toString(call));
38                 p = Runtime.getRuntime().exec(call);
39                 br = new BufferedReader(new InputStreamReader(p.getInputStream()));
40                 String token = null;
41                 boolean found = false;
42                 while ((line = br.readLine()) != null) {
43                     if (line.isEmpty()) {
44                         continue;
45                     }
46                     found = true;
47                     token = line.substring(1, line.length() - 1);
48                     if (token.equals(tokenParts[1])) {
49                         continue nameservers;
50                     }
51                 }
52                 p.destroy();
53                 result.append(NS);
54                 if (found) {
55                     result.append(" DIFFER;");
56                 } else {
57                     result.append(" EMPTY;");
58                 }
59                 failed = true;
60
61             }
62             if ( !failed) {
63                 return PING_SUCCEDED;
64             }
65             return result.toString();
66         } catch (IOException e) {
67             e.printStackTrace();
68             return "Connection closed";
69         }
70     }
71
72 }