UNPKG

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