From f7c8c95ddc80c3b26f0d7978b776e02bc950a9fa Mon Sep 17 00:00:00 2001 From: Tobi Oetiker Date: Thu, 5 Jun 2008 15:36:43 +0000 Subject: improved handling of non responsive hosts routes flapping hosts with multiple ip addresses --- qooxdoo/source/class/Tr/Application.js | 3 +- qooxdoo/source/class/Tr/ui/ActionButton.js | 44 +++++++++++++--- qooxdoo/source/class/Tr/ui/TraceTable.js | 83 ++++++++++++++++-------------- 3 files changed, 83 insertions(+), 47 deletions(-) (limited to 'qooxdoo/source/class/Tr') diff --git a/qooxdoo/source/class/Tr/Application.js b/qooxdoo/source/class/Tr/Application.js index bcac0d9..5c6298b 100644 --- a/qooxdoo/source/class/Tr/Application.js +++ b/qooxdoo/source/class/Tr/Application.js @@ -53,8 +53,9 @@ qx.Class.define('Tr.Application', base_layout.add(top); var trace = new Tr.ui.TraceTable(); base_layout.add(trace); + base_layout.add(new Tr.ui.Footer(this.tr("SmokeTrace is part of the SmokePing suite created by Tobi Oetiker, Copyright 2008."),'http://oss.oetiker.ch/smokeping')); }, - + close : function(e) { this.base(arguments); diff --git a/qooxdoo/source/class/Tr/ui/ActionButton.js b/qooxdoo/source/class/Tr/ui/ActionButton.js index f710df9..ae04efb 100644 --- a/qooxdoo/source/class/Tr/ui/ActionButton.js +++ b/qooxdoo/source/class/Tr/ui/ActionButton.js @@ -8,7 +8,7 @@ qx.Class.define('Tr.ui.ActionButton', { - extend: qx.ui.layout.HorizontalBoxLayout, + extend: qx.ui.layout.VerticalBoxLayout, /* ***************************************************************************** @@ -20,6 +20,12 @@ qx.Class.define('Tr.ui.ActionButton', this.base(arguments); this.set({ + height: 'auto', + width: 'auto', + horizontalChildrenAlign: 'left' + }); + var hbox = new qx.ui.layout.HorizontalBoxLayout; + hbox.set({ height: 'auto', width: 'auto', verticalChildrenAlign: 'middle' @@ -28,7 +34,7 @@ qx.Class.define('Tr.ui.ActionButton', lab1.set({ paddingRight: 6 }); - this.add(lab1); + hbox.add(lab1); var host = new qx.ui.form.TextField(); host.set({ width: 200, @@ -36,20 +42,20 @@ qx.Class.define('Tr.ui.ActionButton', border: 'dark-shadow', padding: 1 }); - this.add(host); + hbox.add(host); this.__host = host; var lab2 = new qx.ui.basic.Label(this.tr("Delay")); lab2.set({ paddingRight: 6, paddingLeft: 12 }); - this.add(lab2); + hbox.add(lab2); var delay = new qx.ui.form.Spinner(1,2,60); delay.set({ border: 'dark-shadow', width: 45 }); - this.add(delay); + hbox.add(delay); this.__delay = delay; var lab3 = new qx.ui.basic.Label(this.tr("Rounds")); @@ -57,13 +63,13 @@ qx.Class.define('Tr.ui.ActionButton', paddingRight: 6, paddingLeft: 12 }); - this.add(lab3); + hbox.add(lab3); var rounds = new qx.ui.form.Spinner(1,20,200); rounds.set({ border: 'dark-shadow', width: 45 }); - this.add(rounds); + hbox.add(rounds); this.__rounds = rounds; var button = new qx.ui.form.Button(''); @@ -75,7 +81,21 @@ qx.Class.define('Tr.ui.ActionButton', border: 'dark-shadow', padding: 2 }); - this.add(button); + hbox.add(button); + this.add(hbox); + var info = new qx.ui.basic.Atom(); + info.set({ + marginTop: 3, + padding: 3, + textColor: 'red', + width: '100%', + height: 'auto', + backgroundColor: '#f0f0f0', + visibility: false + }); + qx.event.message.Bus.subscribe('tr.info',this.__set_info,this); + this.add(info); + this.__info = info; qx.event.message.Bus.subscribe('tr.status',this.__set_status,this); qx.event.message.Bus.dispatch('tr.status','stopped'); @@ -114,6 +134,12 @@ qx.Class.define('Tr.ui.ActionButton', }, members: { + __set_info: function(e){ + this.__info.set({ + label: e.getData(), + visibility: true + }); + }, __set_status: function(m){ var host = this.__host; var rounds = this.__rounds; @@ -124,6 +150,8 @@ qx.Class.define('Tr.ui.ActionButton', case 'starting': if (getUserData('action') == 'go') { setLabel(this.tr("Starting")); + this.__info.setVisibility(false); + border: 'dark-shadow' setEnabled(false); host.setEnabled(false); rounds.setEnabled(false); diff --git a/qooxdoo/source/class/Tr/ui/TraceTable.js b/qooxdoo/source/class/Tr/ui/TraceTable.js index 5141884..3330740 100644 --- a/qooxdoo/source/class/Tr/ui/TraceTable.js +++ b/qooxdoo/source/class/Tr/ui/TraceTable.js @@ -42,7 +42,7 @@ qx.Class.define('Tr.ui.TraceTable', var tcm = this.getTableColumnModel(); this.__tcm = tcm; - //tcm.setDataCellRenderer(0, new Tr.ui.Cellrenderer(2)); + tcm.setDataCellRenderer(0, new Tr.ui.Cellrenderer(1)); tcm.setDataCellRenderer(3, new Tr.ui.Cellrenderer(0,' %')); tcm.setDataCellRenderer(4, new Tr.ui.Cellrenderer(0)); @@ -75,6 +75,14 @@ qx.Class.define('Tr.ui.TraceTable', __make_empty_row: function (){ return ([undefined,undefined,undefined,0,0,undefined,undefined,undefined,undefined,undefined,0,0,0]); }, + __stop_table: function (){ + var tableModel = this.__tableModel; + for (var i=0;i<10;i++){ + tableModel.setColumnSortable(i,true); + } + qx.event.message.Bus.dispatch('tr.status','stopped'); + this.__handle = undefined; + }, __handle_tr: function(m){ var self = this; var f_hop = 0,f_host=1,f_ip=2,f_loss=3,f_snt=4,f_last=5,f_avg=6,f_best=7,f_worst=8,f_stdev=9,f_cnt=10,f_sum=11,f_sqsum=12; @@ -93,49 +101,55 @@ qx.Class.define('Tr.ui.TraceTable', sleep = 0; var hop = retval['output'][i][0]; if (hop == 'SLEEP'){ - sleep = self.__delay * 1000; + sleep = retval['output'][i][1]; continue; - } + } + else if (hop == 'INFO'){ + qx.event.message.Bus.dispatch('tr.info',retval['output'][i][1]); + continue; + } var host = retval['output'][i][1]; var ip = retval['output'][i][2]; var value = retval['output'][i][3]; var ii = 0; var max = data.length; - while ( ii < max - && ( Math.floor(data[ii][0]) < hop - || ( Math.floor(data[ii][0]) == hop && data[ii][1] != host) - ) - ){ + while (true){ + if ( ii == max ) break; + if ( Math.floor(data[ii][0]) > hop) break; + if ( Math.floor(data[ii][0]) == hop ){ + if ( ip == undefined ) break; + if ( ip == data[ii][2] ) break; + } ii++; } - if (ii == max || ( Math.floor(data[ii][0]) == hop && data[ii][1] != host) ){ - if (ii < max){ - hop = data[ii][0] + 0.1; + if (ii == max || Math.floor(data[ii][0]) > hop ){ + if (ii > 0 && Math.floor(data[ii-1][0]) == hop ){ + hop = data[ii-1][0] + 0.1; } data.splice(ii,0,self.__make_empty_row()); data[ii][0] = hop; } var drow = data[ii]; - if (drow[f_host] == undefined){ + if (drow[f_host] == undefined && host != undefined){ drow[f_host] = host; } - if (drow[f_ip] == undefined){ + if (drow[f_ip] == undefined && ip != undefined){ drow[f_ip] = ip; } drow[f_snt]++; drow[f_last] = value; - var best = drow[f_best]; - if (best == undefined || best > value){ - drow[f_best] = value; - } - var worst = drow[f_worst]; - if (worst == undefined || worst < value){ - drow[f_worst] = value; - } if (value != undefined){ + var best = drow[f_best]; + if (best == undefined || best > value){ + drow[f_best] = value; + } + var worst = drow[f_worst]; + if (worst == undefined || worst < value){ + drow[f_worst] = value; + } drow[f_sum] += value; var sum = drow[f_sum]; drow[f_cnt] ++; @@ -154,29 +168,22 @@ qx.Class.define('Tr.ui.TraceTable', fill_table,'run_tr',{ handle: retval['handle'], point: retval['point']})}; qx.client.Timer.once(next_round,self,sleep); - } else - { - for (var i=0;i<10;i++){ - tableModel.setColumnSortable(i,true); - } - qx.event.message.Bus.dispatch('tr.status','stopped'); - self.__handle = undefined; + } + else { + self.__stop_table(); } } else { alert(exc); - if (self.__handle){ - self.__handle = undefined; - } - for (var i=0;i<10;i++){ - self.__tableModel.setColumnSortable(i,true); - } - qx.event.message.Bus.dispatch('tr.status','stopped'); + self.__stop_table(); } }; - var handle_returns = function (data,exc,id){ - if (exc != null){ + var stop_handler = function (data,exc,id){ + if (exc == null){ + qx.event.message.Bus.dispatch('tr.status','stopped'); + } + else { alert(exc); } }; @@ -185,7 +192,7 @@ qx.Class.define('Tr.ui.TraceTable', switch(cmd['action']){ case 'stop': qx.event.message.Bus.dispatch('tr.status','stopping'); - Tr.Server.getInstance().callAsync(handle_returns,'stop_tr',this.__handle); + Tr.Server.getInstance().callAsync(stop_handler,'stop_tr',this.__handle); break; case 'go': this.__data = []; -- cgit v1.2.3-24-g4f1b