|
|
@ -0,0 +1,118 @@ |
|
|
|
var servers = {}; |
|
|
|
const https = require("https"); |
|
|
|
const ip = require('ip'); |
|
|
|
const crypto = require('crypto'); |
|
|
|
const fs = require('fs'); |
|
|
|
var mainSubnet = ip.cidrSubnet("2602:806:a003:40e::/64"); |
|
|
|
var traceSubnet = ip.cidrSubnet("2602:806:a003:40f::/64"); |
|
|
|
var bibleSubnet = ip.cidrSubnet("2602:806:a003:40e:b1be::/80"); |
|
|
|
var i6t_subnet = ip.cidrSubnet("2602:806:a003:40e::1:0/112"); |
|
|
|
var my_bonnie1_subnet = ip.cidrSubnet("2602:806:a003:40f::4:0/112"); |
|
|
|
var sbcrtm_subnet = ip.cidrSubnet("2602:806:a003:40f:0:1:1:0/112"); |
|
|
|
var my_bonnie2_subnet = ip.cidrSubnet("2602:806:a003:40f:0:1:2:0/112"); |
|
|
|
var do_ssl_test = !!process.env.IPV6THINGS_DO_SSL_TEST; |
|
|
|
function makeHTTPSOptions(key_name) { |
|
|
|
return { |
|
|
|
cert: fs.readFileSync(`${do_ssl_test ? "ssl_test/test" : "/rw_disk/i6t-ssl/" + key_name}.crt`), |
|
|
|
key: fs.readFileSync(`${do_ssl_test ? "ssl_test/test" : "/rw_disk/i6t-ssl/" + key_name}.key`), |
|
|
|
ciphers: 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:HIGH:!aNULL:!MD5:!AESCCM', |
|
|
|
secureOptions: crypto.constants.SSL_OP_NO_RENEGOTIATION, |
|
|
|
maxVersion: do_ssl_test ? "TLSv1.2" : 'TLSv1.3' |
|
|
|
}; |
|
|
|
} |
|
|
|
exports.initServers = function(my_apps) { |
|
|
|
let mainOptions = makeHTTPSOptions("main"); |
|
|
|
servers["!fallback"] = { |
|
|
|
http: my_apps.main, |
|
|
|
https: https.createServer(mainOptions, my_apps.main) |
|
|
|
}; |
|
|
|
servers["!ipv6-things-dotcom"] = { |
|
|
|
http: my_apps.main, |
|
|
|
https: https.createServer(makeHTTPSOptions("ipv6-things-dotcom"), my_apps.main) |
|
|
|
}; |
|
|
|
servers["!ipv6-bible"] = { |
|
|
|
http: my_apps.ipv6bible, |
|
|
|
https: https.createServer(makeHTTPSOptions("ipv6-bible"), my_apps.ipv6bible) |
|
|
|
}; |
|
|
|
servers["!ipv6-bible-7700"] = { |
|
|
|
http: my_apps.ipv6bible, |
|
|
|
https: https.createServer(makeHTTPSOptions("ipv6-bible-group1"), my_apps.ipv6bible) |
|
|
|
}; |
|
|
|
servers["!ipv6-bible-7710"] = { |
|
|
|
http: my_apps.ipv6bible, |
|
|
|
https: https.createServer(makeHTTPSOptions("ipv6-bible-group2"), my_apps.ipv6bible) |
|
|
|
}; |
|
|
|
servers["!ipv6-bible-7720"] = { |
|
|
|
http: my_apps.ipv6bible, |
|
|
|
https: https.createServer(makeHTTPSOptions("ipv6-bible-group3"), my_apps.ipv6bible) |
|
|
|
}; |
|
|
|
servers["!ipv6-bible-7a00"] = { |
|
|
|
http: my_apps.ipv6bible, |
|
|
|
https: https.createServer(makeHTTPSOptions("ipv6-bible-group4"), my_apps.ipv6bible) |
|
|
|
}; |
|
|
|
servers["!ipv6-bible-7a10"] = { |
|
|
|
http: my_apps.ipv6bible, |
|
|
|
https: https.createServer(makeHTTPSOptions("ipv6-bible-group5"), my_apps.ipv6bible) |
|
|
|
}; |
|
|
|
let my_bonnie = my_apps.make_static("/rw_disk/ttgen-videos/bonnie/"); |
|
|
|
let sbcrtm = my_apps.make_static("/rw_disk/ttgen-videos/mountain/"); |
|
|
|
servers["!traceroute-bonnie"] = { |
|
|
|
http: my_bonnie, |
|
|
|
https: https.createServer(mainOptions, my_bonnie) |
|
|
|
}; |
|
|
|
servers["!traceroute-bonnie-line1"] = { |
|
|
|
http: my_bonnie, |
|
|
|
https: https.createServer(makeHTTPSOptions("mbloo"), my_bonnie) |
|
|
|
}; |
|
|
|
servers["!traceroute-mountain"] = { |
|
|
|
http: sbcrtm, |
|
|
|
https: https.createServer(mainOptions, sbcrtm) |
|
|
|
}; |
|
|
|
servers["!traceroute-mountain-line1"] = { |
|
|
|
http: sbcrtm, |
|
|
|
https: https.createServer(makeHTTPSOptions("sbcrtm-1"), sbcrtm) |
|
|
|
}; |
|
|
|
}; |
|
|
|
function findServerForIP_p(_ip) { |
|
|
|
if (_ip.indexOf(":") < 0) return '!fallback'; |
|
|
|
let canonicalIPBuf = ip.toBuffer(_ip); |
|
|
|
if (!(canonicalIPBuf.length === 16)) return '!fallback'; |
|
|
|
let b = canonicalIPBuf; |
|
|
|
let ipString = ip.toString(canonicalIPBuf); |
|
|
|
if (ipString.startsWith("2602:806:a003:40e:")) { |
|
|
|
if ((b[8] === 0xb1) && (b[9] === 0xbe)) { |
|
|
|
let value = '!ipv6-bible-' + Number((canonicalIPBuf[10] << 8) + (canonicalIPBuf[11] & 0xf0)).toString(16); |
|
|
|
if (servers.hasOwnProperty(value)) { |
|
|
|
return value; |
|
|
|
} |
|
|
|
return '!ipv6-bible'; |
|
|
|
} |
|
|
|
if ((b[8] === 0) && (b[9] === 0) && (b[10] === 0) && (b[11] === 0) && (b[12] === 0) && (b[13] === 1)) { |
|
|
|
return '!ipv6-things-dotcom'; |
|
|
|
} |
|
|
|
} |
|
|
|
switch (ipString) { |
|
|
|
case '2602:806:a003:40f::4:1': |
|
|
|
case '2602:806:a003:40f::4:3': |
|
|
|
case '2602:806:a003:40f:0:1:2:ff01': |
|
|
|
return '!traceroute-bonnie-line1'; |
|
|
|
case '2602:806:a003:40f:0:1:1:ff10': |
|
|
|
return '!traceroute-mountain-line1'; |
|
|
|
} |
|
|
|
if (ipString.startsWith("2602:806:a003:40f:")) { |
|
|
|
if ((b[8] === 0) && (b[9] === 0) && (b[10] === 0)) { |
|
|
|
switch((b[11] << 16) + (b[12] << 8) + b[13]) { |
|
|
|
case 0x4: |
|
|
|
case 0x10002: |
|
|
|
return '!traceroute-bonnie'; |
|
|
|
case 0x10001: |
|
|
|
return '!traceroute-mountain'; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return '!fallback'; |
|
|
|
} |
|
|
|
exports.findServerForIP = function(_ip, use_https) { |
|
|
|
let result = servers[findServerForIP_p(String(_ip))]; |
|
|
|
return use_https ? result.https : result.http; |
|
|
|
}; |