summaryrefslogtreecommitdiffstats
path: root/static/new_status-dnbd3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/new_status-dnbd3.html')
-rw-r--r--static/new_status-dnbd3.html666
1 files changed, 124 insertions, 542 deletions
diff --git a/static/new_status-dnbd3.html b/static/new_status-dnbd3.html
index eec291a..b4049bb 100644
--- a/static/new_status-dnbd3.html
+++ b/static/new_status-dnbd3.html
@@ -2,551 +2,133 @@
<meta charset="utf-8">
<html>
<head>
- <script type="text/javascript" src="jquery-1.7.1.min.js"></script>
- <script src="smoothie.js"></script>
-
- <style type="text/css">
- body { width:100%; height:100%; margin:0; padding:0; overflow: scroll; }
-
- svg, div, canvas { margin:0; padding:0; }
-
- table, td { border: 1px solid black; text-align: center; }
- .clientTable
- {
- display: table;
- width:auto;
- background-color:#eee;
- border:1px solid #666666;
- border-spacing:5px;
- }
- .speed
- {
- align-content: right;/*fix for buggy browsers*/
- width:240px;
- background-color:#E0E0E0;
- background: linear-gradient(90deg, #E0E0E0 100%, #9DA7AE 0%);
-
- }
-
- .noBorder
- {
- text-align: left;
- border: none;
- }
-
- .serverTd
- {
- border:none;
- font-weight: bold;
- }
-
- .serverLTd
- {
- border:none;
- font-weight: bold;
- text-align: left;
- }
-
-
- </style>
+ <style type="text/css">
+
+ body { margin: 0; }
+
+ .container {
+ display: flex;
+ }
+
+ .server {
+ border-spacing: 5px;
+ background-color: #eee;
+ border: 1px solid #666;
+ }
+
+ .first-row {
+ font-weight: bold;
+ }
+
+ .server-ip {
+ text-align: center;
+ }
+
+ .client-label, .client-speed {
+ border: 1px solid black;
+ text-align: center;
+ }
+
+ .client-speed {
+ width: 240px;
+ }
+
+ </style>
</head>
<body>
- <div id="bigDiv">
+ <div id="app">
+ <div class="container">
+ <table v-for="server in servers" class="server">
+ <tbody>
+ <tr class="first-row"><td>Server IP:</td><td class="server-ip">{{ server.address }}</td></tr>
+ <tr><td>Uptime:</td><td>{{ formatSeconds(server.uptime) }}</td></tr>
+ <tr><td>Upload speed:</td><td>{{ formatBytes(server.uploadSpeed) +'/s' }}</td></tr>
+ <tr><td>Download speed:</td><td>{{ formatBytes(server.downloadSpeed) +'/s' }}</td></tr>
+ <tr><td>Total sent:</td><td>{{ formatBytes(server.bytesSent) }}</td></tr>
+ <tr><td>Total received:</td><td>{{ formatBytes(server.bytesReceived) }}</td></tr>
+ <tr v-for="client in server.clients">
+ <td class="client-label">{{ client.address.split( ":" )[0] }}</td>
+ <td class="client-speed" :style="calcBackgroundStyle(client.uploadSpeed)"><span>{{ formatBytes(client.uploadSpeed) + '/s' }}</span></td>
+ </tr>
+ </tbody>
+ </table>
</div>
-
-</body>
-
-<script type="text/javascript">
-
-
-var lock = false;
-var lastTime = 0;
-var posibleNrOfRows = 23;
-
-var newAndOld = { 'new':{}, 'old':{} };
-var servClSpeeds = {'fresh':0};
-
-var sortedClSpeeds = {'fresh':0, 'nrOfServers':0};
-
-var serverStats = {};
-var serverNewAndOld = { 'new':{}, 'old':{} };
-
-// Get new data
-setInterval( function() {
- $.get('/data2.json', function(data) {
- if (data.timestamp < lastTime) lastTime = data.timestamp;
- if(data.timestamp === lastTime) return;
-
- var servers = data.servers;
- // take what we need; give nothing back
- var parsedServers = parseServers( servers );
-
- var parsedServersForStats = parseServersForStats( servers );
-
- newAndOld['new'] = parsedServers;
-
- serverNewAndOld['new'] = parsedServersForStats;
-
- update_servClSpeeds( newAndOld );
-
- update_serverStats( serverNewAndOld );
-
- if ( servClSpeeds.fresh !== 0 ) { update_sortedClSpeeds(servClSpeeds); }
-
- if ( sortedClSpeeds.fresh !== 0 ) {
-
- dostuff( sortedClSpeeds, serverStats );
- }
-
- servClSpeeds['fresh'] = 1;
- lastTime = data.timestamp;
- newAndOld['old'] = parsedServers;
- serverNewAndOld['old'] = parsedServersForStats;
-}, 'json').always(function() {
- });
-}, 2000);
-
-
-// changes the colors of the tds holding the download speed
-// color code and details follow bellow
-function makeItPretty( clArray ) {
- for ( var key in clArray ) {
- for ( var client in clArray[key]) {
- var wrappedIp = ipWrapper( client );
-
- var Bps = clArray[key][client];
- var td = $( "." + wrappedIp + " > " + ".speed");
- td.css("background", changeBackground1( Bps ) );
- }
- }
-}
-
-function changeBackground1 ( speed ) {
- var result = "";
- switch ( true ) {
- case speed < 1024:
- var proc = ( ( speed * 10 ) / 1024 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(-90deg, #E0E0E0 "+(100-proc2)+"%, #8adb8b "+proc2+"%)";
- break;
- case ( speed >= 1024 && speed < 10240 ):
- var proc = ( ( speed * 10 ) / 10240 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(-90deg, #E0E0E0 "+(100-proc2-10)+"%, #8adb8b "+(proc2+10)+"%)";
- break;
- case ( speed >= 10240 && speed < 102400 ):
- var proc = ((speed * 10) / 102400 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(-90deg, #E0E0E0 "+(100-proc2-20)+"%, #8adb8b "+(proc2+20)+"%)";
- break;
-
- case ( speed >= 102400 && speed < 1048576 ):
- var proc = ((speed * 10) / 1048576 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(-90deg, #E0E0E0 "+(100-proc2-30)+"%, #5cdb55 "+(proc2+30)+"%)";
- break;
- case ( speed >= 1048576 && speed < 10485760 ):
- var proc = ((speed * 10) / 10485760 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(-90deg, #E0E0E0 "+(100-proc2-40)+"%, #5cdb55 "+(proc2+40)+"%)";
- break;
- case ( speed >= 10485760 && speed < 104857600 ):
- var proc = ( ( speed * 10 ) / 104857600 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(90deg, #5cdb55 "+(proc2+50)+"%, #E0E0E0 "+(50-proc2)+"%)";
- break;
-
- case ( speed >= 104857600 && speed < 1073741824 ):
- var proc = ( ( speed * 10 ) / 1073741824 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(90deg, #26a81f "+(proc2+60)+"%, #E0E0E0 "+(40-proc2)+"%)";
- break;
- case ( speed >= 1073741824 && speed <= 10737418240 ):
- var proc = ( ( speed * 10 ) / 10737418240 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(90deg, #26a81f "+(proc2+70)+"%, #E0E0E0 "+(30-proc2)+"%)";
- break;
- case ( speed >= 10737418240 && speed <= 107374182400 ):
- var proc = ( ( speed * 10 ) / 107374182400 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(90deg, #26a81f "+(proc2+80)+"%, #E0E0E0 "+(20-proc2)+"%)";
- break;
-
- case ( speed >= 107374182400 && speed < 1099511627776 ):
- var proc = ( ( speed * 10 ) / 1099511627776 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(90deg, #056d00 "+(proc2+90)+"%, #E0E0E0 "+(10-proc2)+"%)";
- break;
- case ( speed > 10995116277760 ):
- var proc = ( ( speed * 10 ) / 10995116277760 );
- var proc2 = proc < 10 ? Math.round( proc ) : 10;
- result = " linear-gradient(90deg, #056d00 "+(proc2+90)+"%, #E0E0E0 "+(10-proc2)+"%)";
- break;
- }
- return result;
-}
-
-function changeBackground2 ( speed ) {
- var result = "";
- switch ( true ) {
- case speed < 524288:
- var proc = ( ( speed * 25 ) / 524288 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(-90deg, #E0E0E0 "+(100-proc2)+"%, #5fce33 "+proc2+"%)";
- break;
- case ( speed >= 524288 && speed < 1048576 ):
- var proc = ( ( speed * 25 ) / 1048576 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(-90deg, #5fce33 "+(100-proc2-25)+"%, #1f6b01 "+(proc2+25)+"%)";
- break;
-
- case ( speed >= 1048576 && speed < 536870912 ):
- var proc = ( ( speed * 25 ) / 536870912 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(90deg, #ef396d "+(proc2+50)+"%, #1f6b01 "+(50-proc2)+"%)";
- break;
-
- case ( speed >= 536870912 && speed < 1073741824 ):
- var proc = ( ( speed * 25 ) / 1073741824 );
- var proc2 = Math.round( proc );
- result = " linear-gradient(90deg, #870014 "+(proc2+75)+"%, #ef396d "+(25-proc2)+"%)";
- break;
-
- case ( speed > 1073741824 ):
- result = " linear-gradient(90deg, #0285ea 100%, #ad001a 0%)";
- break;
- }
- return result;
-}
-// create as many divs as servers...append them to the bigDiv...if a small div already exists...move to
-// the next one
-function createTheDivz ( servArray ) {
- lock = true;
- for( i = 0; i < servArray.length; i++ ) {
-
- var wrappedIp = ipWrapper( servArray[i] );
- if ( $( "#div-" + wrappedIp ).length > 0 ) {
- $( "#div-" + wrappedIp ).remove();
- }
- var servDiv = $( '<div></div>' );
-
- servDiv.attr( 'id', "div-" + wrappedIp );
- servDiv.attr( 'style', "float:left" );
-
- $( "#bigDiv" ).append( servDiv );
- }
-}
-
-// simple function creates a table from a given server ip, its clients and a number of rows
-function buildTable ( servIp, clArray , nrOfRows, statsObj ) {
-
- // test to see if the number of rows to be shown exceeds the number of existing clients
- // if yes replace number of shown rows with the length of clients array(represents the nr of clients)
- var localRows = nrOfRows;
- if ( nrOfRows > clArray.length ) { localRows = clArray.length; }
-
-
- // if table object already exists delete it
- var wrappedIp = ipWrapper( servIp );
- if ( $( "#tbl-" + wrappedIp ).length > 0 ) {
- $( "#tbl-" + wrappedIp ).remove();
- }
- var servTable = $( "<table></table>" ).addClass( "clientTable" );
-
- servTable.attr( "id", "tbl-" + wrappedIp );
-
- var row1 = $( "<tr></tr>" ).addClass( 'row1' );
- var lCol1 = $( "<td></td>" ).addClass("serverLTd").text( "Server Ip: " );
- var rCol1 = $( "<td></td>" ).addClass("serverTd").text( servIp );
- row1.append( lCol1 );
- row1.append( rCol1 );
- servTable.append( row1 );
-
- for ( var key in statsObj[servIp] ) {
- if ( key === "address" || key === "timestamp") { continue; }
- var server = statsObj[servIp];
- var row = $( "<tr></tr>" );
- var lCol = $( "<td></td>" ).addClass("noBorder").text( key +": " );
- var value = server[key];
-
- var rCol = $( "<td></td>" ).addClass("noBorder").text( value );
-
- row.append( lCol );
- row.append( rCol );
- servTable.append( row );
- }
-
- for( var key in clArray ) {
-
-
- for( var client in clArray[key] ) {
- var row = $( "<tr></tr>" ).addClass( ipWrapper( client ) );
- var lCol = $( "<td></td>" ).text( client );
- var rCol = $( "<td></td>" ).addClass( 'speed' ).text( bytesToString( clArray[key][client] ) );
- }
- row.append( lCol );
- row.append( rCol );
-
- servTable.append( row );
- }
-
- $( "#div-" + wrappedIp ).append( servTable );
-}
-
-// do stuff stuff stuff stuffy stuff
-function dostuff( obj, statsObj ) {
- // the servers in an array sorted after the number of clients...index 0 the server with the most
- // clients...will also receive the leftmost table
- var leServers = sortServers( obj );
- if (lock == false ) { createTheDivz( leServers ) };
-
- for( i = 0; i < leServers.length; i++ ) {
-
- var wrappedIp = ipWrapper(leServers[i]);
- if(! $( "#div-" + wrappedIp ).length > 0 ) { continue; }
-
- var serverIp = leServers[i];
- var clientsArray = obj[serverIp];
-
- buildTable( serverIp, clientsArray, posibleNrOfRows, statsObj );
-
- makeItPretty( clientsArray );
- }
-}
-// little helper function to wrap the Ip and replace all the . with - and add a c at the start of the ip
-// needed for the html table because the rows cannot have an id with . in it
-function ipWrapper( givenIp ) {
- var localIp = givenIp.replace(/\./g, "-");
- return "c"+localIp;
-}
-
-// function that give us the servers ip which has the most clients
-function sortServers( obj ) {
-
- var keys = [];
-
- for(var key in obj) {
- if( key == 'fresh' || key == "nrOfServers" ) { continue; }
- keys.push( key );
- }
- var sortedKeys = keys.sort( function( a, b ) { return obj[b].length - obj[a].length; } );
-
- return sortedKeys;
-}
-
-
-function update_serverStats ( obj ) {
-
- for( var key in obj['new'] ) {
- var localObject = {};
- if( key in obj['old'] ) {
- var newObject = obj['new'][key];
-
- var oldObject = obj['old'][key];
-
- var stime = ( newObject.timestamp <= oldObject.timestamp ) ?
- 2 :
- ( newObject.timestamp - oldObject.timestamp ) / 1000;
-
- localObject['address'] = newObject.address;
- localObject['timestamp'] = newObject.timestamp < oldObject.timestamp ?
- newObject.timestamp :
- newObject.timestamp - oldObject.timestamp;
- localObject['uptime'] = Math.floor(newObject.uptime / ( 3600 * 24 ) ) + "d " +
- Math.floor(newObject.uptime / 3600 ) % 24 + "h " +
- Math.floor(newObject.uptime / 60 ) % 60 + "min";
-
- var uploadSpeed = newObject.bytesSent < oldObject.bytesSent ?
- 0 :
- Math.round(
- (newObject.bytesSent - oldObject.bytesSent)
- / stime);
- localObject['uploadSpeed'] = bytesToString(uploadSpeed);
-
- var downloadSpeed = newObject.bytesReceived < oldObject.bytesReceived ?
- 0 :
- Math.round(
- (newObject.bytesReceived - oldObject.bytesReceived)
- / stime);
- localObject['downloadSpeed'] = bytesToString(downloadSpeed);
-
- var localBytesSent = (newObject.bytesSent < oldObject.bytesSent) ?
- oldObject.bytesSent : newObject.bytesSent;
- localObject['Total sent'] = bytesToString( localBytesSent );
-
- var localBytesReceived = (newObject.bytesReceived < oldObject.bytesReceived) ?
- oldObject.bytesReceived : newObject.bytesReceived;
-
- localObject['Total received'] = bytesToString( localBytesReceived );
-
- serverStats[localObject.address] = localObject;
- }
- }
-}
-
-// update function for the servClSpeeds object
-function update_servClSpeeds ( obj ) {
- for( var key in obj['new'] ) {
- if( key in obj['old'] ) {
- var newObject = obj['new'][key];
- var oldObject = obj['old'][key];
- var resultObject = speedCalc( newObject, oldObject );
- servClSpeeds[key] = resultObject;
- }
+ </div>
+
+<script src="vue.min.js"></script>
+<script>
+
+var app = new Vue({
+ el: '#app',
+ data: {
+ data: {},
+ log: { server: {}, client: {} },
+ timespan: 120
+ },
+ computed: {
+ servers () {
+ if (!this.data.servers) return []
+ const servers = this.data.servers.slice(0)
+ servers.sort((a, b) => b.clients.length - a.clients.length)
+ servers.forEach(server => {
+ this.calcSpeed('server', server)
+ server.clients.forEach(client => {
+ this.calcSpeed('client', client, server.timestamp)
+ })
+ server.clients = server.clients.filter(client => client.uploadSpeed > 0)
+ server.clients.sort((a, b) => b.uploadSpeed - a.uploadSpeed)
+ })
+ return servers
}
-}
-
-// update function for the sortedClSpeeds
-function update_sortedClSpeeds ( obj ) {
- var nrOfServ = 0;
- for ( var key in obj ) {
- if ( key === 'fresh' ) { continue; }
- var clients = obj[key];
- var sortedArray = getSortedKeys( clients );
- sortedClSpeeds[key] = sortedArray;
- nrOfServ++;
- }
- sortedClSpeeds['fresh'] = 1;
- sortedClSpeeds['nrOfServers'] = nrOfServ;
-}
-
-// helper function for the sortIps() function
-function getSortedKeys( obj ) {
- sortedIps = [];
- var keys = [];
- for( var key in obj ) keys.push( key );
- var sortedKeys = keys.sort( function( a, b ) { return obj[b] - obj[a]; } );
-
- for( var i = 0; i < sortedKeys.length; i++) {
- var smallObj = {};
- var Ip = sortedKeys[i];
- var speed = obj[sortedKeys[i]];
- smallObj[Ip] = speed;
- sortedIps.push( smallObj );
+ },
+ methods: {
+ async updateData () {
+ const response = await fetch('/data2.json')
+ this.data = await response.json()
+ setTimeout(this.updateData, 2000)
+ },
+ calcSpeed (type, obj, timestamp) {
+ var log = this.log[type][obj.address]
+ log = this.log[type][obj.address] = log ? log.filter(x => x.timestamp > this.data.timestamp - this.timespan * 1000) : []
+ if (timestamp) obj.timestamp = timestamp
+ log.push(obj)
+ if (log.length > 0) {
+ const a = log[0]
+ const b = log[log.length - 1]
+ const time = (b.timestamp - a.timestamp) / 1000
+ obj.uploadSpeed = (b.bytesSent - a.bytesSent) / time
+ if (type === 'server') obj.downloadSpeed = (b.bytesReceived - a.bytesReceived) / time
+ }
+ },
+ formatBytes (bytes) {
+ if (bytes < 1024) return bytes.toFixed(2) + ' Bytes'
+ else if (bytes < 1048576) return (bytes / 1024).toFixed(2) + ' KiB'
+ else if (bytes < 1073741824) return (bytes / 1048576).toFixed(2) + ' MiB'
+ else if (bytes < 1099511627776) return (bytes / 1073741824).toFixed(2) + ' GiB'
+ else return (bytes / 1099511627776).toFixed(2) + ' TiB'
+ },
+ formatSeconds (seconds) {
+ return ( Math.floor(seconds / ( 3600 * 24 ) ) + 'd '
+ + Math.floor(seconds / 3600 ) % 24 + 'h '
+ + Math.floor(seconds / 60 ) % 60 + 'min' )
+ },
+ calcBackgroundStyle (speed) {
+ const percent = Math.round(Math.max(0, Math.min(100, Math.log(1 + speed * (100000 / 1073741824)) / Math.log(100000) * 100)))
+ var color = '#056d00'
+ if (speed < 1048576) color = '#8adb8b'
+ else if (speed < 10485760) color = '#5cdb55'
+ else if (speed < 104857600) color = '#26a81f'
+ return { background: `linear-gradient(90deg, ${color} ${percent}%, #e0e0e0 ${percent}%)` }
}
- return sortedIps;
-}
-
-// function that takes the servers-with-clientspeeds object and returns another object that has
-// serverips as keys and as values an array of sorted ips with the leftmost element beeing the ip with the
-// greatest speed and the rightmost one, the one with the smallest speed
-// each element of the array is a string consisting of ip:socket#speedInBytesPerSecond
-function sortIps ( obj ) {
- var localObject = {};
- for( var servip in obj ) {
- var localObject = obj[servip];
- var localArray = getSortedKeys( localObject );
- localObject[serverip] = localArray;
- }
- return localObject;
-}
-
-// function takes new and old parsedServer object and returns a new object where the traffic of each
-// client is now replaced by speed in bytes/s
-function speedCalc( newO, oldO ){
- var localObject = {};
-
- // time in seconds calculated from the difference of timestamps or default 2
- var stime = ( newO.timestamp <= oldO.timestamp ) ?
- 2 :
- ( newO.timestamp - oldO.timestamp ) / 1000;
- for( var ip in newO.clients ) {
- if( ip in oldO.clients ) {
- var bitesDelta = newO.clients[ip] - oldO.clients[ip];
-
- if( bitesDelta < 0 ) { bitesDelta = newO.clients[ip]; }
- // take only the active clients
- if( bitesDelta != 0 ) {
- var speed = Math.round( bitesDelta / stime );
-
- var newClIp = ip.split( ":" )[0];
-
- if( newClIp in localObject ) {
- localObject[newClIp] = localObject[newClIp] + speed;
- } else {
- localObject[newClIp] = speed;
- }
- }
- }
- }
- return localObject;
-}
-
-function parseServersForStats( servers ) {
- var parsedServers = {};
- var numberOfClients = 0;
-
- for (var i in servers ) {
- numberOfClients += servers[i].clientCount;
- newServerObject = {};
- var timestamp = servers[i].timestamp;
- newServerObject['timestamp'] = timestamp;
-
- var serverIp = servers[i].address;
- newServerObject['address'] = serverIp;
-
- newServerObject['uptime'] = servers[i].uptime;
- newServerObject['bytesSent'] = servers[i].bytesSent;
- newServerObject['bytesReceived'] = servers[i].bytesReceived;
-
- parsedServers[serverIp] = newServerObject;
- }
- return parsedServers;
-}
-
-// takes the whole lot of servers and returnes an object whose keys are the server ip and each ip has
-// a timestamp and an adjecent clients object
-// clients object is just key:value pairs
-function parseServers( servers ) {
- var parsedServers = {};
- // servers is a array containing server objects
- for( var i in servers ) {
- // object has .clients argument and .timestamp argument
- newServerObject = {};
- // save and write timestamp of the server
- var timestamp = servers[i].timestamp;
- newServerObject['timestamp'] = timestamp;
- // iterate over clients array and save ip:bytes pairs in local object
- var clientsObject = {};
-
- var clients = servers[i].clients;
- for( var ii in clients ) {
- var key = clients[ii].address;
- var value = clients[ii].bytesSent;
- clientsObject[key] = value;
- }
- newServerObject['clients'] = clientsObject;
-
- var serverIp = servers[i].address;
- // object shoul know its own name; in this case its ip
- newServerObject['address'] = serverIp;
-
- parsedServers[serverIp] = newServerObject;
- }
- return parsedServers;
-}
-
-// Convert bytes to GiB or TiB and return a string in form "10,23 GiB"
-function bytesToString( bytes ) {
- var convertedValue;
- var unit;
- if( bytes >= 1099511627776 ) {
- convertedValue = Math.round( ( bytes / 1099511627776) * 100 ) / 100 ;
- unit = " TiB";
- } else if( bytes >= 1073741824 ) {
- convertedValue = Math.round( ( bytes / 1073741824) * 100 ) / 100 ;
- unit = " GiB";
- } else if( bytes >= 1048576 ) {
- convertedValue = Math.round( ( bytes / 1048576) * 100 ) / 100 ;
- unit = " MiB";
- } else if( bytes >= 1024 ) {
- convertedValue = Math.round( ( bytes / 1024) * 100 ) / 100 ;
- unit = " KiB";
- } else {
- convertedValue = Math.round( bytes );
- unit = " B";
- }
- return convertedValue + unit;
-}
-</script> \ No newline at end of file
+ },
+ created () {
+ const urlParams = new URLSearchParams(window.location.search)
+ this.timespan = parseInt(urlParams.get('timespan')) || 120
+ this.updateData()
+ }
+})
+
+</script>
+</body>
+</html>