function copyBtn(className, btn){ var ele = $("."+className); highlight(ele[0]); document.execCommand('copy'); $(btn).css("backgroundColor","#0c0").delay(500).queue(function() { $(btn).css("backgroundColor",""); $(btn).dequeue(); }); console.log("copied: "+ele.html()); } function highlight(ele){ var range, selection; if (document.body.createTextRange) { range = document.body.createTextRange(); range.moveToElementText(ele); range.select(); } else if (window.getSelection) { selection = window.getSelection(); range = document.createRange(); range.selectNodeContents(ele); selection.removeAllRanges(); selection.addRange(range); } } $(document).ready(function() { var v4Div = $(".ip_v4"); var v6Div = $(".ip_v6"); var dsDiv = $(".ip_ds"); var testingResult = {}; function getIpInfo(url, div) { var infoDivIp = div.children(".info_ip"); var infoDivGeo = div.children(".info_geo"); var version = url.includes("4")?4:6 infoDivGeo.hide(); function getIpInfoDone(data) { var className = "ip_"+url.replace(/\./g,""); testingResult[version] = true; if(testingResult[4] && testingResult[6]) { $("#resultExplanation").html("Die Verbindung konnte über IPv4 und IPv6 hergestellt werden, also wird Dual-Stack unterstützt! Dies kann nativ, durch DS-Lite oder einen 6to4/4to6 Tunnel umgesetzt sein.

"); } div.addClass("success"); infoDivIp.html("

Deine "+data.name+" Adresse: "+ ""+data.ip+" "+ "

"); if(data.proxyIp != ""){ infoDivIp.append("

Vom Proxy angegebene Ip: "+data.proxyIp+" (HTTP_X_FORWARDED_FOR)

"); } //if(data.clientIp != ""){ // infoDivIp.append("

Vom Client angegebene Ip: "+data.clientIp+" (HTTP_CLIENT_IP)

"); //} for(var ele in data.geoIp) { if(data.geoIp[ele] != ""){ infoDivGeo.append(""+ele+":"+data.geoIp[ele]+"
"); } } infoDivGeo.fadeIn(); //start hostname request $.ajax("//"+url+"/include/advip.php", {dataType: "json", timeout: 5000}) .done(function(data, status, xhr){ for(var ele in data) { if(data[ele] != ""){ infoDivGeo.prepend(""+ele+":"+data[ele]+"
"); } } }).fail(function(){ //fail geoip silently }); } if(ipInfo_php.conHostType==(div==v4Div?0:(div==v6Div?2:1))) { console.log("Loaded over PHP: "+ipInfo_php.name); getIpInfoDone(ipInfo_php); } else { $.ajax("//"+url+"/include/ipinfo.php", {dataType: "json", timeout: 5000}) .done(function(data, status, xhr){ console.log("Loaded over Ajax: "+data.name); getIpInfoDone(data); }).fail(function(err){ testingResult[className] = false; console.log(err); div.addClass("failure"); infoDivIp.html("IPv"+version+" nicht verfügbar."); var ipWithoutDNS; var name; if(version == 4){ ipWithoutDNS = config["ipv4"]; } else { ipWithoutDNS = "["+config["ipv6"]+"]"; } infoDivIp.append("
Versuche eine IPv"+version+" Adresse direkt aufzurufen, um auf DNS Fehler zu prüfen:"+ ""+ipWithoutDNS+""); }); } } getIpInfo(config.namev4, v4Div); getIpInfo(config.namev6, v6Div); //getIpInfo(config.nameDS, dsDiv); var pingduration; var pingcount; var pingmax = 3000; var pingInterval; $(".ping").click(function() { $(".ping").prop('disabled', true); pingduration = 0; pingcount = 0; ping(); setTimeout(function() { if(pingcount != -1) { $(".pingresult").html("Keine Antwort nach 5 Sekunden!"); } $(".ping").prop('disabled', false); },5000); }); function ping() { var startTime = new Date().getTime(); var req = new XMLHttpRequest(); /* 0 UNSENT open()wurde noch nicht aufgerufen. 1 OPENED send()wurde noch nicht aufgerufen. 2 HEADERS_RECEIVED send() wurde aufgerufen, und Headers sowie Status sind verfügbar. 3 LOADING Download ist im Gange; responseText enthält bereits unvollständige Daten. 4 DONE Der Vorgang ist abgeschlossen.*/ req.onreadystatechange = function() { //console.log(req.readyState+" "+(new Date().getTime() - startTime)); if(req.readyState == 2 && pingcount >= 0) { var duration = new Date().getTime() - startTime; pingduration += duration; pingcount++; $(".pingresult").html("Anzahl der Pings: "+pingcount+"
Zeit: "+Math.round(pingduration/pingcount * 10)/10 + "ms"); if(pingduration > pingmax) { $(".pingresult").append("
Fertig!"); pingcount = -1; clearInterval(pingInterval); } else { ping(); } } }; req.open("GET", "/0B.zip?"+startTime); req.send(); } $(".speed").click(function() { var v4 = -1; var v6 = -1; var v4Speed = -1; var v6Speed = -1; var timeCount = 15; $(this).hide(); $(".images").show(); time = new Date().getTime(); $(".v4 img").attr("src","//"+config.namev4+"/img.jpg?t="+time); $(".v6 img").attr("src","//"+config.namev6+"/img.jpg?t="+time); $(".v4 img, .v6 img").on("load", function() { dauer = (new Date().getTime()-time)/1000; speed = Math.round((14*8)/dauer*100)/100; $(this).next().html(speed + " Mbit/s für "+dauer + " Sekunden "); //wert setzen if($(this).parent().hasClass("v4")) { v4 = dauer; v4Speed = speed; } if($(this).parent().hasClass("v6")) { v6 = dauer; v6Speed = speed; } //fertig fertig(); }); var intervall = setInterval(function(){timer()},100); function timer() { //count timeCount = (timeCount*10-1)/10; //ausgabe $(".ausg").html("Timeout: "+timeCount); fertig(); } function fertig() { if(timeCount <= 0 || v4 != -1 && v6 != -1) { clearInterval(intervall); ausg = ""; win = -1; loose = -1; if(v4 == -1 && v6 == -1) { ausg = "Beide haben das laden nach Beenden des Timeout nicht abgeschlossen!"; win = 0; loose = 0; } else if(v4 == -1) { ausg = "Nur IPv6 hat mit "+v6+" Sekunden funktioniert!"; win = 6; loose = 4; } else if(v6 == -1) { ausg = "Nur IPv4 hat mit "+v4+" Sekunden funktioniert!"; win = 4; loose = 6; } else if(v4 < v6) { ausg = "IPv4 war " + Math.round((v6/v4)*100)/100 + " mal schneller als IPv6"; win = 4; loose = 6; } else if(v6 <= v4) { ausg = "IPv6 war " + Math.round((v4/v6)*100)/100 + " mal schneller als IPv4"; win = 6; loose = 4; } $(".ausg").html("

"+ausg+"

"); $(".v"+win).css("border", "5px solid #0a0"); $(".v"+loose).css("border", "5px solid #a00"); } } }); var active = false; var id = -1; //ignore first measurement var times4 = []; var times6 = []; var labels = []; var startT; $(".start").click(function() { active = !active; if(active) { $(".start").html("Stop"); loadChart(); s4 = io('wss://'+config.namev4+'/', {path: '/speedtest'}); s6 = io('wss://'+config.namev6+'/', {path: '/speedtest'}); s4.on('pongDown', function(msg) { times4[msg] = new Date().getTime() - times4[msg]; //console.log("Received via v4: " + msg + " Time:" + times4[msg]); updateChart(msg, false); }); s6.on('pongDown', function(msg) { times6[msg] = new Date().getTime() - times6[msg]; //console.log("Received via v6: " + msg + " Time:" + times6[msg]); updateChart(msg, true); }); $(".out").html("Starte websocket
Wenn dies nicht funktioniert ist der NodeJS Server offline!"); $(".ct-chart").show(); $("html, body").scrollTop($(".ct-chart").offset().top); } else { times4 = []; times6 = []; labels = []; nTimes4 = []; nTimes6 = []; nLabels = []; $(".start").html("Start"); } }); setInterval(function() { if(active) { if(id >= 0) { times4[id] = new Date().getTime(); times6[id] = new Date().getTime(); labels[id] = ""+(id/5); } s4.emit('pingUp', id); s6.emit('pingUp', id); id++; } }, 200); function calcAvg() { var n4 = 0; var avgAct4 = 0; for(var i = 0; i < nTimes4.length; i++) { if(nTimes4[i]) { avgAct4 += nTimes4[i]; n4++; } } avgAct4 /= n4; var n6 = 0; var avgAct6 = 0; for(var i = 0; i < nTimes6.length; i++) { if(nTimes6[i]) { avgAct6 += nTimes6[i]; n6++; } } avgAct6 /= n6; $(".out").html("Ping Durchschnitt: IPv4: "+avgAct4.toFixed(1)+" ms   /   IPv6: "+avgAct6.toFixed(1)+" ms (Anfragen: "+n4+")"); } var nTimes4 = []; var nTimes6 = []; var nLabels = []; var chart; function loadChart() { //trim data /*var n = 50; var start = 0>times4.length-n?0:times4.length-n; for(var i = start; i < times4.length; i++) { if(times4[i] > 100*1000) break; nTimes4[i-start] = times4[i]; nLabels[i-start] = labels[i]; } var n = 50; var start = 0>times6.length-n?0:times6.length-n; for(var i = start; i < times6.length; i++) { if(times6[i] > 100*1000) break; nTimes6[i-start] = times6[i]; nLabels[i-start] = labels[i]; } */ calcAvg(nTimes4); calcAvg(nTimes6); //draw chart var options = { low: 0, axisX: { labelInterpolationFnc: function skipLabels(value, index) { return index % 10 === 0 ? value : null; } }, chartPadding: { top: 50, right: 5, bottom: 20, left: 25 }, plugins: [ Chartist.plugins.legend({ clickable: false, legendNames: ['IPv4 Ping', 'IPv6 Ping'] }), Chartist.plugins.ctAxisTitle( { axisX: { axisTitle: 'Zeit in Sekunden', axisClass: 'ct-axis-title', offset: { x: 0, y: 35 }, textAnchor: 'middle' }, axisY: { axisTitle: 'Ping in ms', axisClass: 'ct-axis-title', offset: { x: 0, y: -10 }, textAnchor: 'middle', flipTitle: false } }) ] } chart = new Chartist.Line('.ct-chart', {labels: nLabels, series: [nTimes4,nTimes6]}, options); console.log(chart); } var idToIndex = []; function updateChart(id, v6) { if(id < 0) { return; } var limit = 50; if(nLabels.length >= limit) { nLabels.shift(); } if(nTimes4.length >= limit) { nTimes4.shift(); } if(nTimes6.length >= limit) { nTimes6.shift(); } if(!nLabels.includes(labels[id])) { nLabels.push(labels[id]); //set other value to null while waiting if(v6) { nTimes6.push(times6[id]); nTimes4.push(null); } else { nTimes4.push(times4[id]); nTimes6.push(null); } } else{ //replace previously inserted null value if(v6) { nTimes6[nTimes6.length-1] = times6[id]; } else { nTimes4[nTimes4.length-1] = times4[id]; } } calcAvg(nTimes4); calcAvg(nTimes6); chart.update({labels: nLabels, series: [nTimes4,nTimes6]}); } });