UNPKG

7.33 kBJavaScriptView Raw
1/*
2This code is held in a joint copyright between Nate Watson and Oluwafunmiwo Juda Sholola, 2015. It is released under the MIT license.
3*/
4
5var os = require("os");
6var dns = require("native-dns");
7var http = require("http");
8var https = require("https");
9var ping = require("ping");
10var diagnostics = {};
11var testURL = "google.com";
12diagnostics.getTestURL = function(){ return testURL; };
13diagnostics.setTestURL = function(replacement) {
14 testURL = replacement;
15 return;
16};
17diagnostics.checkInterfaces = function() {
18 var errors = [];
19 var outside = false;
20 var v4 = false;
21 var v6 = false;
22 var interfaces = os.networkInterfaces();
23 for (var interfaceSet in interfaces) {
24 for (var interface in interfaces[interfaceSet]) {
25 if (interfaces[interfaceSet][interface].internal == false) {
26 outside = true;
27 if (interfaces[interfaceSet][interface].family == "IPv4") {
28 v4 = true;
29 }
30 if (interfaces[interfaceSet][interface].family == "IPv6") {
31 v6 = true;
32 }
33 }
34 }
35 }
36 if (outside != true) {
37 errors[errors.length] = 1;
38 }
39 if (v4 != true) {
40 errors[errors.length] = 4;
41 }
42 if (v6 != true) {
43 errors[errors.length] = 6;
44 }
45 return errors;
46};
47diagnostics.haveIPv4 = function(){
48 var errors = diagnostics.checkInterfaces();
49 if(errors.indexOf(4) > -1) {
50 return false;
51 }
52 return true;
53};
54diagnostics.haveIPv6 = function(){
55 var errors = diagnostics.checkInterfaces();
56 if(errors.indexOf(6) > -1) {
57 return false;
58 }
59 return true;
60};
61diagnostics.haveConnection = function(){
62 var errors = diagnostics.checkInterfaces();
63 if(errors.indexOf(1) > -1) {
64 return false;
65 }
66 return true;
67};
68diagnostics.haveDNS = function(callback) {
69 var checkIPv4DNS = function(){
70 var DNSanswer = "";
71 var dns4Connection = dns.Request({
72 question: dns.Question({
73 name: testURL
74 }),
75 server: {
76 address: '8.8.8.8'
77 }
78 });
79 var deactivate4 = false;
80 dns4Connection.on("timeout", function(){
81 if (!deactivate4) {
82 deactivate4 = true;
83 callback(false);
84 return;
85 }
86 });
87 dns4Connection.on("message", function(DNSerr, section){
88 if (DNSerr) {
89 if (!deactivate4) {
90 deactivate4 = true;
91 callback(false);
92 }
93 return;
94 }
95 DNSanswer += section;
96 });
97 dns4Connection.on("end", function(){
98 if (!deactivate4) {
99 deactivate4 = true;
100 callback(true);
101 }
102 });
103 dns4Connection.send();
104 };
105 var DNSsegments = "";
106 var deactivate6 = false;
107 var dnsConnection = dns.Request({
108 question: dns.Question({
109 name: testURL
110 }),
111 server: {
112 address: '2001:4860:4860::8888'
113 }
114 });
115 dnsConnection.on("timeout", function(){
116 if (!deactivate6) {
117 deactivate6 = true;
118 checkIPv4DNS();
119 }
120 });
121 dnsConnection.on("message", function(DNSerr, section){
122 if (DNSerr) {
123 if (!deactivate6) {
124 deactivate6 = true;
125 checkIPv4DNS();
126 }
127 return;
128 }
129 DNSsegments += section;
130 });
131 dnsConnection.on("end", function(){
132 if (!deactivate6) {
133 deactivate6 = true;
134 callback(true);
135 }
136 return;
137 });
138 dnsConnection.send();
139 return;
140};
141diagnostics.haveHTTP = function(callback) {
142 var isFired = false;
143 var requestOptions = {
144 hostname: testURL,
145 port: 80,
146 method: "GET"
147 };
148 var httpRequest = http.request(requestOptions, function(response){
149 var responseTotal = "";
150 response.on("data", function(section){
151 responseTotal += section;
152 });
153 response.on("end", function(){
154 if (isFired == false) {
155 isFired = true;
156 callback(true);
157 }
158 });
159 response.on("error", function(){
160 if (isFired == false) {
161 isFired = true;
162 callback(false);
163 }
164 });
165 });
166 httpRequest.on("socket", function (socket){
167 socket.setTimeout(10000);
168 socket.on("timeout", function(){
169 if (isFired == false) {
170 isFired = true;
171 callback(false);
172 }
173 });
174 });
175 httpRequest.on("error", function(failure) {
176 if (isFired == false) {
177 isFired = true;
178 callback(false);
179 }
180 });
181 httpRequest.end();
182 return;
183};
184diagnostics.haveHTTPS = function(callback) {
185 var isFired = false;
186 var requestOptions = {
187 hostname: testURL,
188 port: 443,
189 method: "GET"
190 };
191 var httpRequest = https.request(requestOptions, function(response){
192 var responseTotal = "";
193 response.on("data", function(section){
194 responseTotal += section;
195 });
196 response.on("end", function(){
197 if (isFired == false) {
198 isFired = true;
199 callback(true);
200 }
201 });
202 response.on("error", function(){
203 if (isFired == false) {
204 isFired = true;
205 callback(false);
206 }
207 });
208 });
209 httpRequest.on("socket", function (socket){
210 socket.setTimeout(10000);
211 socket.on("timeout", function(){
212 if (isFired == false) {
213 isFired = true;
214 callback(false);
215 }
216 });
217 });
218 httpRequest.on("error", function(failure) {
219 if (isFired == false) {
220 isFired = true;
221 callback(false);
222 }
223 });
224 httpRequest.end();
225 return;
226
227};
228diagnostics.havePing = function(callback) {
229 ping.sys.probe(testURL, function(reached) {
230 callback(reached);
231 });
232};
233diagnostics.getError = function(id) {
234 switch(id) {
235 case 0: return "NormalNetworkActivity";
236 case 1: return "NoConnection";
237 case 4: return "NoIPv4Connection";
238 case 6: return "NoIPv6Connection";
239 case 7: return "DiagnosticsScriptFailure";
240 case 8: return "PingNotUsable";
241 case 53: return "NoDNS";
242 case 80: return "NoHTTPconnection";
243 case 143: return "NoInsecureIMAP";
244 case 443: return "NoHTTPSconnection";
245 case 993: return "NoSecureIMAP";
246 default: return "Unknown";
247 /*
248 case 20: return "FTPFailure";
249 case 22: return "SSHfailure";
250 case 23: return "TelnetFailure";
251 case 25: return "SMTPfailure";
252 case 37: return "TimeProtocolFailure";
253 case 70: return "NoGopher" ;
254 case 81: return "NoTor";
255 case 88: return "NoKerberos" ;
256 case 110: return "NoInsecurePOP3";
257 case 161: return "NoSNMP";
258 case 194: return "NoIRC" ;
259 case 995: return "NoSecurePOP3";
260 case 5222: return "NoXMPP" ;
261 */
262 }
263}; /*You could use a tree for this, but that would be work.*/
264diagnostics.diagnose = function(callback) {
265 var errors = diagnostics.checkInterfaces();
266 var finalSteps = function(errorSet) {
267 if (errorSet.length < 1) {
268 errorSet[0] = 0;
269 }
270 callback(errorSet);
271 };
272 var checkHTTPS = function(errorSet){
273 diagnostics.haveHTTPS(function(httpWorking){
274 if (httpWorking == false) {
275 errorSet[errorSet.length] = 443;
276 }
277 finalSteps(errorSet);
278 return;
279 });
280 return;
281 };
282 var checkHTTP = function(errorSet){
283 diagnostics.haveHTTP(function(httpWorking){
284 if (httpWorking == false) {
285 errorSet[errorSet.length] = 80;
286 }
287 checkHTTPS(errorSet);
288 return;
289 });
290 return;
291 };
292 var checkPing = function(errorSet) {
293 diagnostics.havePing(function(pingWorking){
294 if (pingWorking == false) {
295 errorSet[errorSet.length] = 8;
296 }
297 checkHTTP(errorSet);
298 });
299 };
300 diagnostics.haveDNS(function(haveDNS){
301 if (haveDNS == false) {
302 errors[errors.length] = 53;
303 }
304 checkPing(errors);
305 });
306};
307var imap = require("./imapTester.js");
308diagnostics.haveInsecureImap = imap.InsecureImapWorks;
309diagnostics.haveSecureImap = imap.SecureImapWorks;
310module.exports = exports = diagnostics;
\No newline at end of file