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