diff --git a/Setup.bat b/Setup.bat new file mode 100644 index 0000000..046b52d --- /dev/null +++ b/Setup.bat @@ -0,0 +1,3 @@ +"python" %~dp0\setup.py install + +pause \ No newline at end of file diff --git a/contrib/EDDN_Monitor.s3db b/contrib/EDDN_Monitor.s3db new file mode 100644 index 0000000..3cbf2eb Binary files /dev/null and b/contrib/EDDN_Monitor.s3db differ diff --git a/contrib/monitor/css/eddn.css b/contrib/monitor/css/eddn.css new file mode 100644 index 0000000..a53f512 --- /dev/null +++ b/contrib/monitor/css/eddn.css @@ -0,0 +1,27 @@ +body { + padding-top: 70px; +} + +section.container { + margin-bottom: 20px; + + /* FIX ANCHORS */ + padding-top:70px; + margin-top:-70px; +} + + .container h2 { + margin-top: 0; + } + + .container .chart { + height: 300px; + margin-bottom: 10px; + } + +footer .navbar-default { + border-width: 1px 0 0; + margin-bottom: 0; +} + +.highcharts-container{width:100% !important; height:100% !important;} \ No newline at end of file diff --git a/contrib/monitor/index.html b/contrib/monitor/index.html new file mode 100644 index 0000000..514d62a --- /dev/null +++ b/contrib/monitor/index.html @@ -0,0 +1,394 @@ + + + + + + + EDDN Status + + + + + + + + + + + + + +
+ +
+ +
+
+
+

+ This page shows transaction information (messages sent/received) for key points of the EDDN, over a one-, five- and sixty-minute period.
+ Values automatically update every minute. +

+
+
+
+ +
+
+
+

Gateways

+
+
+
+ +
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 min5 min60 min
Messages received---
Invalid messages---
Messages passed to relay---
+
+
+ +
+
+ +
+
+ +
+
+

+ EDDN version: N/A. +

+
+
+

+ Uptime: N/A. +

+
+
+

+ Last updated: N/A. +

+
+
+ +
+
+
+
+
+ +
+
+
+

Relays

+
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 min5 min60 min
Messages received---
Messages duplicate---
Messages passed to subscribers---
+
+
+ +
+
+ +
+
+ +
+
+

+ EDDN version: N/A. +

+
+
+

+ Uptime: N/A. +

+
+
+

+ Last updated: N/A. +

+
+
+ +
+
+
+
+
+ +
+
+
+

Softwares

+
+
+ +
+
+
+
+ +
+
+
+ + + + + + + + + + + + + +
Today hitsYesterday hitsTotal hits
+
+
+
+
+
+
+ +
+
+

+ Last updated: N/A. +

+
+
+ +
+
+
+
+
+ +
+
+
+

Uploaders (Top 20)

+
+
+ +
+
+
+
+ +
+
+
+ + + + + + + + + + + + + +
Today hitsYesterday hitsTotal hits
+
+
+
+
+
+
+ +
+
+

+ Last updated: N/A. +

+
+
+ +
+
+
+
+
+ +
+
+
+

Schemas

+
+
+ +
+
+
+
+ +
+
+
+ + + + + + + + + + + + + +
Today hitsYesterday hitsTotal hits
+
+
+
+
+
+
+ +
+
+

+ Last updated: N/A. +

+
+
+ +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/contrib/status/js/date.js b/contrib/monitor/js/date.js similarity index 99% rename from contrib/status/js/date.js rename to contrib/monitor/js/date.js index 77f4986..2d52e9a 100644 --- a/contrib/status/js/date.js +++ b/contrib/monitor/js/date.js @@ -1,10 +1,10 @@ -/** - * Version: 1.0 Alpha-1 - * Build Date: 13-Nov-2007 - * Copyright (c) 2006-2007, Coolite Inc. (http://www.coolite.com/). All rights reserved. - * License: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. - * Website: http://www.datejs.com/ or http://www.coolite.com/datejs/ - */ +/** + * Version: 1.0 Alpha-1 + * Build Date: 13-Nov-2007 + * Copyright (c) 2006-2007, Coolite Inc. (http://www.coolite.com/). All rights reserved. + * License: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. + * Website: http://www.datejs.com/ or http://www.coolite.com/datejs/ + */ Date.CultureInfo={name:"en-US",englishName:"English (United States)",nativeName:"English (United States)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\+|after|from)/i,subtract:/^(\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\.?m?\.?|p\.?m?\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt)/i,ordinalSuffix:/^\s*(st|nd|rd|th)/i,timeContext:/^\s*(\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; Date.getMonthNumberFromName=function(name){var n=Date.CultureInfo.monthNames,m=Date.CultureInfo.abbreviatedMonthNames,s=name.toLowerCase();for(var i=0;i 24) { + days = Math.floor(hours / 24) + hours = Math.floor((hours - days * 24) / 3600); + } + + if (hours < 10) {hours = "0" + hours;} + if (minutes < 10) {minutes = "0" + minutes;} + if (seconds < 10) {seconds = "0" + seconds;} + + if (days > 0) { + return days + "d " + hours + ":" + minutes + ":" + seconds; + } + else { + return hours + ":" + minutes + ":" + seconds; + } +} + + +var doUpdateSoftwares = function() +{ + var dToday = new Date(), + dYesterday = new (function(d){ d.setDate(d.getDate()-1); return d})(new Date), + + yesterday = dYesterday.getUTCFullYear() + '-' + ("0" + (dYesterday.getUTCMonth() + 1)).slice(-2) + '-' + ("0" + (dYesterday.getUTCDate())).slice(-2), + today = dToday.getUTCFullYear() + '-' + ("0" + (dToday.getUTCMonth() + 1)).slice(-2) + '-' + ("0" + (dToday.getUTCDate())).slice(-2); + + $.ajax({ + dataType: "json", + url: monitorEndPoint + 'getSoftwares/?dateStart=' + yesterday + '&dateEnd = ' + today, + success: function(softwares){ + $.ajax({ + dataType: "json", + url: monitorEndPoint + 'getTotalSoftwares/', + success: function(softwaresTotal){ + var chart = $('#softwares .chart').highcharts(), + series = chart.get('softwares'); + + $('#softwares .table tbody').empty(); + + $.each(softwaresTotal, function(software, hits){ + $('#softwares .table tbody').append( + newTr = $('').attr('data-name', software).on('mouseover', function(){ + chart.get('software-' + makeSlug(software)).setState('hover'); + chart.tooltip.refresh(chart.get('software-' + makeSlug(software))); + }).on('mouseout', function(){ + chart.get('software-' + makeSlug(software)).setState(''); + chart.tooltip.hide(); + }).append( + $('').addClass('square') + ).append( + $('').html('' + software + '') + ) + .append( + $('').addClass('stat today').html(formatNumber(softwares[today][software] || 0)) + ) + .append( + $('').addClass('stat yesterday').html(formatNumber(softwares[yesterday][software] || 0)) + ) + .append( + $('').addClass('stat total').html('' + formatNumber(hits) + '') + ) + ); + + if(!chart.get('software-' + makeSlug(software))) + series.addPoint({id: 'software-' + makeSlug(software), name: software, y: parseInt(hits)}, false); + else + chart.get('software-' + makeSlug(software)).update(parseInt(hits), false); + + newTr.find('.square').css('background', chart.get('software-' + makeSlug(software)).color); + }); + + chart.redraw(); + + $('#softwares').find(".stat").removeClass("warning").each(function() { + if ($(this).html() == "0") + $(this).addClass("warning"); + }); + + $('#softwares').find(".update_timestamp").html(d.toString("yyyy-MM-dd HH:mm:ss")); + } + }); + } + }); +} + + +var doUpdateUploaders = function() +{ + var dToday = new Date(), + dYesterday = new (function(d){ d.setDate(d.getDate()-1); return d})(new Date), + + yesterday = dYesterday.getUTCFullYear() + '-' + ("0" + (dYesterday.getUTCMonth() + 1)).slice(-2) + '-' + ("0" + (dYesterday.getUTCDate())).slice(-2), + today = dToday.getUTCFullYear() + '-' + ("0" + (dToday.getUTCMonth() + 1)).slice(-2) + '-' + ("0" + (dToday.getUTCDate())).slice(-2); + + $.ajax({ + dataType: "json", + url: monitorEndPoint + 'getUploaders/?dateStart=' + yesterday + '&dateEnd = ' + today, + success: function(uploaders){ + $.ajax({ + dataType: "json", + url: monitorEndPoint + 'getTotalUploaders/', + success: function(uploadersTotal){ + var chart = $('#uploaders .chart').highcharts(), + series = chart.get('uploaders'); + + $('#uploaders .table tbody').empty(); + + $.each(uploadersTotal, function(uploader, hits){ + if(uploader.length > 32) + truncateUploader = jQuery.trim(uploader).substring(0, 32)/*.split(" ").slice(0, -1).join(" ")*/ + "..." + else + truncateUploader = uploader + + $('#uploaders .table tbody').append( + newTr = $('').attr('data-name', uploader).on('mouseover', function(){ + chart.get('uploader-' + makeSlug(uploader)).setState('hover'); + chart.tooltip.refresh(chart.get('uploader-' + makeSlug(uploader))); + }).on('mouseout', function(){ + chart.get('uploader-' + makeSlug(uploader)).setState(''); + chart.tooltip.hide(); + }).append( + $('').addClass('square') + ).append( + $('').html('' + truncateUploader + '') + ) + .append( + $('').addClass('stat today').html(formatNumber(uploaders[today][uploader] || 0)) + ) + .append( + $('').addClass('stat yesterday').html(formatNumber(uploaders[yesterday][uploader] || 0)) + ) + .append( + $('').addClass('stat total').html('' + formatNumber(hits) + '') + ) + ); + + if(!chart.get('uploader-' + makeSlug(uploader))) + series.addPoint({id: 'uploader-' + makeSlug(uploader), name: uploader, y: parseInt(hits)}, false); + else + chart.get('uploader-' + makeSlug(uploader)).update(parseInt(hits), false); + + newTr.find('.square').css('background', chart.get('uploader-' + makeSlug(uploader)).color); + }); + + chart.redraw(); + + $('#uploaders').find(".stat").removeClass("warning").each(function() { + if ($(this).html() == "0") + $(this).addClass("warning"); + }); + + $('#uploaders').find(".update_timestamp").html(d.toString("yyyy-MM-dd HH:mm:ss")); + } + }); + } + }); +} + + +var doUpdateSchemas = function() +{ + var dToday = new Date(), + dYesterday = new (function(d){ d.setDate(d.getDate()-1); return d})(new Date), + + yesterday = dYesterday.getUTCFullYear() + '-' + ("0" + (dYesterday.getUTCMonth() + 1)).slice(-2) + '-' + ("0" + (dYesterday.getUTCDate())).slice(-2), + today = dToday.getUTCFullYear() + '-' + ("0" + (dToday.getUTCMonth() + 1)).slice(-2) + '-' + ("0" + (dToday.getUTCDate())).slice(-2); + + $.ajax({ + dataType: "json", + url: monitorEndPoint + 'getSchemas/?dateStart=' + yesterday + '&dateEnd = ' + today, + success: function(schemas){ + $.ajax({ + dataType: "json", + url: monitorEndPoint + 'getTotalSchemas/', + success: function(schemasTotal){ + var chart = $('#schemas .chart').highcharts(), + series = chart.get('schemas'); + + $('#schemas .table tbody').empty(); + + $.each(schemasTotal, function(schema, hits){ + $('#schemas .table tbody').append( + newTr = $('').attr('data-name', schema).on('mouseover', function(){ + chart.get('schema-' + makeSlug(schema)).setState('hover'); + chart.tooltip.refresh(chart.get('schema-' + makeSlug(schema))); + }).on('mouseout', function(){ + chart.get('schema-' + makeSlug(schema)).setState(''); + chart.tooltip.hide(); + }).append( + $('').addClass('square') + ).append( + $('').html('' + schema + '') + ) + .append( + $('').addClass('stat today').html(formatNumber(schemas[today][schema] || 0)) + ) + .append( + $('').addClass('stat yesterday').html(formatNumber(schemas[yesterday][schema] || 0)) + ) + .append( + $('').addClass('stat total').html('' + formatNumber(hits) + '') + ) + ); + + if(!chart.get('schema-' + makeSlug(schema))) + series.addPoint({id: 'schema-' + makeSlug(schema), name: schema, y: parseInt(hits)}, false); + else + chart.get('schema-' + makeSlug(schema)).update(parseInt(hits), false); + + newTr.find('.square').css('background', chart.get('schema-' + makeSlug(schema)).color); + }); + + chart.redraw(); + + $('#schemas').find(".stat").removeClass("warning").each(function() { + if ($(this).html() == "0") + $(this).addClass("warning"); + }); + + $('#schemas').find(".update_timestamp").html(d.toString("yyyy-MM-dd HH:mm:ss")); + } + }); + } + }); +} + + +var doUpdates = function(type){ + $("select[name=" + type + "] option").each(function(){ + var currentItem = $(this).html(), + isSelected = $(this).is(':selected'); + + $.ajax({ + dataType: "json", + url: $(this).val(), + success: function(data){ + d = new Date(); + + stats[type][currentItem]['lastUpdate'] = d.toString("yyyy-MM-dd HH:mm:ss"); + stats[type][currentItem]['last'] = data; + + if(isSelected) + showStats(type, currentItem); + + var chart = $("#" + type + " .chart[data-name='" + currentItem + "']").highcharts(); + + shift = chart.get('inbound').data.length > 60; + chart.get('inbound').addPoint([d.getTime(), (data['inbound'] || {})['1min'] || 0], true, shift); + + if(type == 'gateways') + { + shift = chart.get('invalid').data.length > 60; + chart.get('invalid').addPoint([d.getTime(), (data['invalid'] || {})['1min'] || 0], true, shift); + } + + if(type == 'relays') + { + shift = chart.get('duplicate').data.length > 60; + chart.get('duplicate').addPoint([d.getTime(), (data['duplicate'] || {})['1min'] || 0], true, shift); + } + + shift = chart.get('outbound').data.length > 60; + chart.get('outbound').addPoint([d.getTime(), (data['outbound'] || {})['1min'] || 0], true, shift); + } + }); + }); +}; + +var showStats = function(type, currentItem){ + var el = $('#' + type), + currentItemStats = stats[type][currentItem]['last']; + + el.find(".inbound_1min").html((currentItemStats['inbound'] || {})['1min'] || 0); + el.find(".inbound_5min").html((currentItemStats["inbound"] || {})['5min'] || 0); + el.find(".inbound_60min").html((currentItemStats["inbound"] || {})['60min'] || 0); + + if(type == 'gateways') + { + el.find(".invalid_1min").html((currentItemStats["invalid"] || {})['1min'] || 0); + el.find(".invalid_5min").html((currentItemStats["invalid"] || {})['5min'] || 0); + el.find(".invalid_60min").html((currentItemStats["invalid"] || {})['60min'] || 0); + } + + if(type == 'relays') + { + el.find(".duplicate_1min").html((currentItemStats["duplicate"] || {})['1min'] || 0); + el.find(".duplicate_5min").html((currentItemStats["duplicate"] || {})['5min'] || 0); + el.find(".duplicate_60min").html((currentItemStats["duplicate"] || {})['60min'] || 0); + } + + el.find(".outbound_1min").html((currentItemStats["outbound"] || {})['1min'] || 0); + el.find(".outbound_5min").html((currentItemStats["outbound"] || {})['5min'] || 0); + el.find(".outbound_60min").html((currentItemStats["outbound"] || {})['60min'] || 0); + + el.find(".update_timestamp").html(stats[type][currentItem]['lastUpdate']); + el.find(".version").html(currentItemStats['version'] || 'N/A'); + + if (currentItemStats['uptime']) + el.find(".uptime").html(secondsToDurationString(currentItemStats['uptime'])); + else + el.find(".uptime").html('N/A'); + + el.find(".stat").removeClass("warning").each(function() { + if ($(this).html() == "0") + $(this).addClass("warning"); + }); + + el.find(".chart").hide(); + el.find(".chart[data-name='" + currentItem + "']").show(); + $(window).trigger('resize'); // Fix wrong size in chart +}; + + + +/** + * Launch monitoring + */ +var start = function(){ + Highcharts.setOptions({global: {useUTC: false}}); + + // Grab gateways + gateways = gateways.sort(); + $.each(gateways, function(k, gateway){ + gateway = gateway.replace('tcp://', ''); + gateway = gateway.replace(':8500', ''); + + $("select[name=gateways]").append($('