Relevance to E-mail me if a Relay hasn't reported recently

(imported topic written by Shembop91)

I’m looking to create relevance that says if the Relays that are in a certain report have a Report time older than x amount of time from right now, then send an e-mail.

We have had relays not report for a couple of days, and rather than have to actively look at them, I’d like to create an intelligent alerting.

(imported comment written by MattBoyd)

To do this, you’ll need to create the report and create the scheduled e-mail that sends the report if a condition is met. There is probably an easy way to create the report using the report generator that’s built into Web Reports, but I already had a similar custom report so I modified it and attached it to this post. You should be able to import it without any problems.

Next, you’ll have to create the scheduled e-mail. Here’s the settings you should use:

Activity Trigger:

  • Generate report every 30 minutes
  • Generate report when relevance evaluates to true
    Relevance: exists (bes computers whose ( (now - last report time of it) > (“01:30:00” as time interval) and (relay server flag of it = true)))

Include: Full Report

If you run into issues or have any questions, let me know.

(imported comment written by MattBoyd)

Sorry for the double-post, but I couldn’t update the attachment from my original post. Here’s the report file.

(imported comment written by SystemAdmin)

Boyd, can you re-send this report?

(imported comment written by MattBoyd)

Grrr… I’m getting frustrated with the constantly breaking attachments.

Copy and paste this into a blank text file and save it as relays-not-reporting.besreport

<!DOCTYPE html PUBLIC 
"-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=
"http://www.w3.org/1999/xhtml" xml:lang=
"en-us"> <!-- Displays a sortable list of relays that have not reported to BigFix in the last 1.5 hours. Created by Matthew Boyd (mdboyd@gmail.com) on 3/16/2010. http:
//iboyd.net --> <head> <style type=
"text/css">   table.tablesorter 
{ font-family:arial; background-color: #CDCDCD; margin:10px 0pt 15px; font-size: 12pt; width: 100%; text-align: left; 
} table.tablesorter thead tr th, table.tablesorter tfoot tr th 
{ background-color: #e6EEEE; border: 1px solid #FFF; font-size: 14pt; padding: 4px; text-align:left; 
} table.tablesorter thead tr .header 
{ background-repeat: no-repeat; background-position: center right; cursor: pointer; 
} table.tablesorter tbody td 
{ color: #3D3D3D; padding: 4px; background-color: #FFF; vertical-align: top; 
} table.tablesorter tbody tr.odd td 
{ background-color:#F0F0F6; 
} table.tablesorter thead tr .headerSortUp 
{ background-image: url(asc.gif); 
} table.tablesorter thead tr .headerSortDown 
{ background-image: url(desc.gif); 
} table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp 
{ background-color: #8dbdd8; 
} </style> <script src=
"http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.min.js" type=
"text/javascript"></script>   <script type=
"text/javascript" language=
"javascript"> (function($)
{$.extend(
{tablesorter:

new function()
{var parsers=[],widgets=[];this.defaults=
{cssHeader:
"header",cssAsc:
"headerSortUp",cssDesc:
"headerSortDown",sortInitialOrder:
"asc",sortMultiSortKey:
"shiftKey",sortForce:null,sortAppend:null,textExtraction:
"simple",parsers:
{
},widgets:[],widgetZebra:
{css:[
"even",
"odd"]
},headers:
{
},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:
"us",decimal:
'.',debug:

false
};function benchmark(s,d)
{log(s+
","+(

new Date().getTime()-d.getTime())+
"ms");
}this.benchmark=benchmark;function log(s)
{

if(typeof console!=
"undefined"&&typeof console.debug!=
"undefined")
{console.log(s);
}

else
{alert(s);
}
}function buildParserCache(table,$headers)
{

if(table.config.debug)
{var parsersDebug=
"";
}var rows=table.tBodies[0].rows;

if(table.tBodies[0].rows[0])
{var list=[],cells=rows[0].cells,l=cells.length;

for(var i=0;i<l;i++)
{var p=

false;

if($.metadata&&($($headers+).metadata()&&$($headers+).metadata().sorter))
{p=getParserById($($headers+).metadata().sorter);
}

else 

if((table.config.headers+&&table.config.headers+.sorter))
{p=getParserById(table.config.headers+.sorter);
}

if(!p)
{p=detectParserForColumn(table,cells+);
}

if(table.config.debug)
{parsersDebug+=
"column:"+i+
" parser:"+p.id+
"\n";
}list.push(p);
}
}

if(table.config.debug)
{log(parsersDebug);
}

return list;
};function detectParserForColumn(table,node)
{var l=parsers.length;

for(var i=1;i<l;i++)
{

if(parsers+.is($.trim(getElementText(table.config,node)),table,node))
{

return parsers+;
}
}

return parsers[0];
}function getParserById(name)
{var l=parsers.length;

for(var i=0;i<l;i++)
{

if(parsers+.id.toLowerCase()==name.toLowerCase())
{

return parsers+;
}
}

return 

false;
}function buildCache(table)
{

if(table.config.debug)
{var cacheTime=

new Date();
}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache=
{row:[],normalized:[]
};

for(var i=0;i<totalRows;++i)
{var c=table.tBodies[0].rows+,cols=[];cache.row.push($(c));

for(var j=0;j<totalCells;++j)
{cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));
}cols.push(i);cache.normalized.push(cols);cols=

null;
};

if(table.config.debug)
{benchmark(
"Building cache for "+totalRows+
" rows:",cacheTime);
}

return cache;
};function getElementText(config,node)
{

if(!node)return
"";var t=
"";

if(config.textExtraction==
"simple")
{

if(node.childNodes[0]&&node.childNodes[0].hasChildNodes())
{t=node.childNodes[0].innerHTML;
}

else
{t=node.innerHTML;
}
}

else
{

if(typeof(config.textExtraction)==
"function")
{t=config.textExtraction(node);
}

else
{t=$(node).text();
}
}

return t;
}function appendToTable(table,cache)
{

if(table.config.debug)
{var appendTime=

new Date()
}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];

for(var i=0;i<totalRows;i++)
{rows.push(r[n+[checkCell]]);

if(!table.config.appender)
{var o=r[n+[checkCell]];var l=o.length;

for(var j=0;j<l;j++)
{tableBody[0].appendChild(o[j]);
}
}
}

if(table.config.appender)
{table.config.appender(table,rows);
}rows=

null;

if(table.config.debug)
{benchmark(
"Rebuilt table:",appendTime);
}applyWidget(table);setTimeout(function()
{$(table).trigger(
"sortEnd");
},0);
};function buildHeaders(table)
{

if(table.config.debug)
{var time=

new Date();
}var meta=($.metadata)?

true:false,tableHeadersRows=[];

for(var i=0;i<table.tHead.rows.length;i++)
{tableHeadersRows+=0;
};$tableHeaders=$(
"thead th",table);$tableHeaders.each(function(index)
{this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);

if(checkHeaderMetadata(

this)||checkHeaderOptions(table,index))this.sortDisabled=

true;

if(!this.sortDisabled)
{$(

this).addClass(table.config.cssHeader);
}table.config.headerList[index]=

this;
});

if(table.config.debug)
{benchmark(
"Built headers:",time);log($tableHeaders);
}

return $tableHeaders;
};function checkCellColSpan(table,rows,row)
{var arr=[],r=table.tHead.rows,c=r[row].cells;

for(var i=0;i<c.length;i++)
{var cell=c+;

if(cell.colSpan>1)
{arr=arr.concat(checkCellColSpan(table,headerArr,row++));
}

else
{

if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1]))
{arr.push(cell);
}
}
}

return arr;
};function checkHeaderMetadata(cell)
{

if(($.metadata)&&($(cell).metadata().sorter===

false))
{

return 

true;
};

return 

false;
}function checkHeaderOptions(table,i)
{

if((table.config.headers+)&&(table.config.headers+.sorter===

false))
{

return 

true;
};

return 

false;
}function applyWidget(table)
{var c=table.config.widgets;var l=c.length;

for(var i=0;i<l;i++)
{getWidgetById(c+).format(table);
}
}function getWidgetById(name)
{var l=widgets.length;

for(var i=0;i<l;i++)
{

if(widgets+.id.toLowerCase()==name.toLowerCase())
{

return widgets+;
}
}
};function formatSortingOrder(v)
{

if(typeof(v)!=
"Number")
{i=(v.toLowerCase()==
"desc")?1:0;
}

else
{i=(v==(0||1))?v:0;
}

return i;
}function isValueInArray(v,a)
{var l=a.length;

for(var i=0;i<l;i++)
{

if(a+[0]==v)
{

return 

true;
}
}

return 

false;
}function setHeadersCss(table,$headers,list,css)
{$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset)
{

if(!this.sortDisabled)
{h[this.column]=$(

this);
}
});var l=list.length;

for(var i=0;i<l;i++)
{h[list+[0]].addClass(css[list+[1]]);
}
}function fixColumnWidth(table,$headers)
{var c=table.config;

if(c.widthFixed)
{var colgroup=$(
'<colgroup>');$(
"tr:first td",table.tBodies[0]).each(function()
{colgroup.append($(
'<col>').css(
'width',$(

this).width()));
});$(table).prepend(colgroup);
};
}function updateHeaderSortCount(table,sortList)
{var c=table.config,l=sortList.length;

for(var i=0;i<l;i++)
{var s=sortList+,o=c.headerList[s[0]];o.count=s[1];o.count++;
}
}function multisort(table,sortList,cache)
{

if(table.config.debug)
{var sortTime=

new Date();
}var dynamicExp=
"var sortWrapper = function(a,b) {",l=sortList.length;

for(var i=0;i<l;i++)
{var c=sortList+[0];var order=sortList+[1];var s=(getCachedSortType(table.config.parsers,c)==
"text")?((order==0)?
"sortText":
"sortTextDesc"):((order==0)?
"sortNumeric":
"sortNumericDesc");var e=
"e"+i;dynamicExp+=
"var "+e+
" = "+s+
"(a["+c+
"],b["+c+
"]); ";dynamicExp+=
"if("+e+
") { return "+e+
"; } ";dynamicExp+=
"else { ";
}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+=
"return a["+orgOrderCol+
"]-b["+orgOrderCol+
"];";

for(var i=0;i<l;i++)
{dynamicExp+=
"}; ";
}dynamicExp+=
"return 0; ";dynamicExp+=
"}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);

if(table.config.debug)
{benchmark(
"Sorting on "+sortList.toString()+
" and dir "+order+
" time:",sortTime);
}

return cache;
};function sortText(a,b)
{

return((a<b)?-1:((a>b)?1:0));
};function sortTextDesc(a,b)
{

return((b<a)?-1:((b>a)?1:0));
};function sortNumeric(a,b)
{

return a-b;
};function sortNumericDesc(a,b)
{

return b-a;
};function getCachedSortType(parsers,i)
{

return parsers+.type;
};this.construct=function(settings)
{

return this.each(function()
{

if(!this.tHead||!this.tBodies)

return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config=
{
};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(

this);$headers=buildHeaders(

this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(

this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(

this);$headers.click(function(e)
{$this.trigger(
"sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;

if(!this.sortDisabled&&totalRows>0)
{var $cell=$(

this);var i=this.column;this.order=this.count++%2;

if(!e[config.sortMultiSortKey])
{config.sortList=[];

if(config.sortForce!=

null)
{var a=config.sortForce;

for(var j=0;j<a.length;j++)
{

if(a[j][0]!=i)
{config.sortList.push(a[j]);
}
}
}config.sortList.push([i,this.order]);
}

else
{

if(isValueInArray(i,config.sortList))
{

for(var j=0;j<config.sortList.length;j++)
{var s=config.sortList[j],o=config.headerList[s[0]];

if(s[0]==i)
{o.count=s[1];o.count++;s[1]=o.count%2;
}
}
}

else
{config.sortList.push([i,this.order]);
}
};setTimeout(function()
{setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));
},1);

return 

false;
}
}).mousedown(function()
{

if(config.cancelSelection)
{this.onselectstart=function()
{

return 

false
};

return 

false;
}
});$this.bind(
"update",function()
{this.config.parsers=buildParserCache(this,$headers);cache=buildCache(

this);
}).bind(
"sorton",function(e,list)
{$(

this).trigger(
"sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));
}).bind(
"appendCache",function()
{appendToTable(this,cache);
}).bind(
"applyWidgetId",function(e,id)
{getWidgetById(id).format(

this);
}).bind(
"applyWidgets",function()
{applyWidget(

this);
});

if($.metadata&&($(

this).metadata()&&$(

this).metadata().sortlist))
{config.sortList=$(

this).metadata().sortlist;
}

if(config.sortList.length>0)
{$this.trigger(
"sorton",[config.sortList]);
}applyWidget(

this);
});
};this.addParser=function(parser)
{var l=parsers.length,a=

true;

for(var i=0;i<l;i++)
{

if(parsers+.id.toLowerCase()==parser.id.toLowerCase())
{a=

false;
}
}

if(a)
{parsers.push(parser);
};
};this.addWidget=function(widget)
{widgets.push(widget);
};this.formatFloat=function(s)
{var i=parseFloat(s);

return(isNaN(i))?0:i;
};this.formatInt=function(s)
{var i=parseInt(s);

return(isNaN(i))?0:i;
};this.isDigit=function(s,config)
{var DECIMAL=
'\\'+config.decimal;var exp='/(^[+]?0(
'+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)
'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*
'+DECIMAL+'0+$)/
';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a+;if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),'
'));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]
{2
}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));
},format:function(s)
{

return $.tablesorter.formatFloat(

new Date(s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"shortDate",is:function(s)
{return/\d
{1,2
}[\/\-]\d
{1,2
}[\/\-]\d
{2,4
}/.test(s);
},format:function(s,table)
{var c=table.config;s=s.replace(/\-/g,
"/");

if(c.dateFormat==
"us")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{4
})/,
"$3/$1/$2");
}

else 

if(c.dateFormat==
"uk")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{4
})/,
"$3/$2/$1");
}

else 

if(c.dateFormat==
"dd/mm/yy"||c.dateFormat==
"dd-mm-yy")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{2
})/,
"$1/$2/$3");
}

return $.tablesorter.formatFloat(

new Date(s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"time",is:function(s)
{return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
},format:function(s)
{

return $.tablesorter.formatFloat(

new Date(
"2000/01/01 "+s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"metadata",is:function(s)
{

return 

false;
},format:function(s,table,cell)
{var c=table.config,p=(!c.parserMetadataName)?
'sortValue':c.parserMetadataName;

return $(cell).metadata()[p];
},type:
"numeric"
});ts.addWidget(
{id:
"zebra",format:function(table)
{

if(table.config.debug)
{var time=

new Date();
}$(
"tr:visible",table.tBodies[0]).filter(
':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(
':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);

if(table.config.debug)
{$.tablesorter.benchmark(
"Applying Zebra widget",time);
}
}
});
})(jQuery); </script> <script type=
"text/javascript"> (function($) 
{ $.extend(
{ tablesorterPager: 

new function() 
{ function updatePageDisplay(c) 
{ var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages); 
} function setPageSize(table,size) 
{ var c = table.config; c.size = size; c.totalPages = Math.ceil(c.totalRows / c.size); c.pagerPositionSet = 

false; moveToPage(table); fixPosition(table); 
} function fixPosition(table) 
{ var c = table.config; 

if(!c.pagerPositionSet && c.positionFixed) 
{ var c = table.config, o = $(table); 

if(o.offset) 
{ c.container.css(
{ top: o.offset().top + o.height() + 
'px', position: 
'absolute' 
}); 
} c.pagerPositionSet = 

true; 
} 
} function moveToFirstPage(table) 
{ var c = table.config; c.page = 0; moveToPage(table); 
} function moveToLastPage(table) 
{ var c = table.config; c.page = (c.totalPages-1); moveToPage(table); 
} function moveToNextPage(table) 
{ var c = table.config; c.page++; 

if(c.page >= (c.totalPages-1)) 
{ c.page = (c.totalPages-1); 
} moveToPage(table); 
} function moveToPrevPage(table) 
{ var c = table.config; c.page--; 

if(c.page <= 0) 
{ c.page = 0; 
} moveToPage(table); 
} function moveToPage(table) 
{ var c = table.config; 

if(c.page < 0 || c.page > (c.totalPages-1)) 
{ c.page = 0; 
} renderTable(table,c.rowsCopy); 
} function renderTable(table,rows) 
{ var c = table.config; var l = rows.length; var s = (c.page * c.size); var e = (s + c.size); 

if(e > rows.length ) 
{ e = rows.length; 
} var tableBody = $(table.tBodies[0]); 
// clear the table body $.tablesorter.clearTableBody(table); 

for(var i = s; i < e; i++) 
{ 
//tableBody.append(rows+); var o = rows+; var l = o.length; 

for(var j=0; j < l; j++) 
{ tableBody[0].appendChild(o[j]);   
} 
} fixPosition(table,tableBody); $(table).trigger(
"applyWidgets"); 

if( c.page >= c.totalPages ) 
{ moveToLastPage(table); 
} updatePageDisplay(c); 
} this.appender = function(table,rows) 
{ var c = table.config; c.rowsCopy = rows; c.totalRows = rows.length; c.totalPages = Math.ceil(c.totalRows / c.size); renderTable(table,rows); 
}; this.defaults = 
{ size: 10, offset: 0, page: 0, totalRows: 0, totalPages: 0, container: null, cssNext: 
'.next', cssPrev: 
'.prev', cssFirst: 
'.first', cssLast: 
'.last', cssPageDisplay: 
'.pagedisplay', cssPageSize: 
'.pagesize', seperator: 
"/", positionFixed: true, appender: this.appender 
}; this.construct = function(settings) 
{ 

return this.each(function() 
{ config = $.extend(this.config, $.tablesorterPager.defaults, settings); var table = this, pager = config.container; $(

this).trigger(
"appendCache"); config.size = parseInt($(
".pagesize",pager).val()); $(config.cssFirst,pager).click(function() 
{ moveToFirstPage(table); 

return 

false; 
}); $(config.cssNext,pager).click(function() 
{ moveToNextPage(table); 

return 

false; 
}); $(config.cssPrev,pager).click(function() 
{ moveToPrevPage(table); 

return 

false; 
}); $(config.cssLast,pager).click(function() 
{ moveToLastPage(table); 

return 

false; 
}); $(config.cssPageSize,pager).change(function() 
{ setPageSize(table,parseInt($(

this).val())); 

return 

false; 
}); 
}); 
}; 
} 
}); 
// extend plugin scope $.fn.extend(
{ tablesorterPager: $.tablesorterPager.construct 
}); 
})(jQuery);   </script> <script type=
"text/javascript" > $(document).ready(function() 
{ $(
"#myTable").tablesorter(
{widgets: [
'zebra']
}); 
} ); </script>   </head> <body>   <table id=
"myTable" class=
"tablesorter"> <thead> <tr> <th>Computer ID</th> <th>Name</th> <th>Last Report Time</th> <th>Time Since Last Report</th> </tr> </thead> <tbody> <?Relevance   concatenation of trs of (td of preceding text of first 
"||" of following text of first 
"||" of it & td of preceding text of first 
"||" of it &  td of preceding text of first 
"||" of following text of first 
"||" of following text of first 
"||" of it  & td of following text of first 
"||" of following text of first 
"||" of following text of first 
"||" of it ) of unique values of (concatenation of names of it & 
"||" & id of it as string & 
"||" & last report time of it as string & 
"||" & (now - last report time of it) as string) of (bes computers whose ( (now - last report time of it) > (
"01:30:00" as time interval) and (relay server flag of it = 

true)))  ?> </tbody> </table> </body> </html>

By the way, I did not test this with Web Reports 8

(imported comment written by tscott91)

I tried this with Web Reports 8 (I know you said you didn’t test) and it didn’t work. The report displays it just doesn’t contain any computers. (or maybe it’s not supposed to show any if they are reporting?)

(imported comment written by MattBoyd)

tscott

I tried this with Web Reports 8 (I know you said you didn’t test) and it didn’t work. The report displays it just doesn’t contain any computers. (or maybe it’s not supposed to show any if they are reporting?)

The report will not display relays that are reporting in, so if they’re all reporting you won’t see any. By default, the report will only show relays that have not reported in the last 1 hour 30 minutes. You can adjust this by searching for and modifying this string in the source code:

(
"01:30:00" as time interval)

(imported comment written by MrFixit)

Very useful with many relays in the environment.

Wouldn’t you expect that a relay would be reporting much more frequently than 1 hour and 30 minutes?

When I started looking at this the relays really varied in the frequency of the reports. What are the controlling factors that affect this?

thanks,

-Gary

(imported comment written by adiponio91)

Still a complete newb here… I love this report, but would like to add some additional columns showing user name and a custm property we have set up “Location By IP Range”. How would I go about modifying the code to include these?

(imported comment written by MattBoyd)

adiponio,

I

think

this will do what you want it to:

<!DOCTYPE html PUBLIC 
"-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=
"http://www.w3.org/1999/xhtml" xml:lang=
"en-us"> <!-- Displays a sortable list of relays that have not reported to BigFix in the last 1.5 hours. Created by Matthew Boyd (mdboyd@gmail.com) on 3/16/2010. http:
//iboyd.net --> <head> <style type=
"text/css">   table.tablesorter 
{ font-family:arial; background-color: #CDCDCD; margin:10px 0pt 15px; font-size: 12pt; width: 100%; text-align: left; 
} table.tablesorter thead tr th, table.tablesorter tfoot tr th 
{ background-color: #e6EEEE; border: 1px solid #FFF; font-size: 14pt; padding: 4px; text-align:left; 
} table.tablesorter thead tr .header 
{ background-repeat: no-repeat; background-position: center right; cursor: pointer; 
} table.tablesorter tbody td 
{ color: #3D3D3D; padding: 4px; background-color: #FFF; vertical-align: top; 
} table.tablesorter tbody tr.odd td 
{ background-color:#F0F0F6; 
} table.tablesorter thead tr .headerSortUp 
{ background-image: url(asc.gif); 
} table.tablesorter thead tr .headerSortDown 
{ background-image: url(desc.gif); 
} table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp 
{ background-color: #8dbdd8; 
} </style> <script src=
"http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.min.js" type=
"text/javascript"></script>   <script type=
"text/javascript" language=
"javascript"> (function($)
{$.extend(
{tablesorter:

new function()
{var parsers=[],widgets=[];this.defaults=
{cssHeader:
"header",cssAsc:
"headerSortUp",cssDesc:
"headerSortDown",sortInitialOrder:
"asc",sortMultiSortKey:
"shiftKey",sortForce:null,sortAppend:null,textExtraction:
"simple",parsers:
{
},widgets:[],widgetZebra:
{css:[
"even",
"odd"]
},headers:
{
},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:
"us",decimal:
'.',debug:

false
};function benchmark(s,d)
{log(s+
","+(

new Date().getTime()-d.getTime())+
"ms");
}this.benchmark=benchmark;function log(s)
{

if(typeof console!=
"undefined"&&typeof console.debug!=
"undefined")
{console.log(s);
}

else
{alert(s);
}
}function buildParserCache(table,$headers)
{

if(table.config.debug)
{var parsersDebug=
"";
}var rows=table.tBodies[0].rows;

if(table.tBodies[0].rows[0])
{var list=[],cells=rows[0].cells,l=cells.length;

for(var i=0;i<l;i++)
{var p=

false;

if($.metadata&&($($headers+).metadata()&&$($headers+).metadata().sorter))
{p=getParserById($($headers+).metadata().sorter);
}

else 

if((table.config.headers+&&table.config.headers+.sorter))
{p=getParserById(table.config.headers+.sorter);
}

if(!p)
{p=detectParserForColumn(table,cells+);
}

if(table.config.debug)
{parsersDebug+=
"column:"+i+
" parser:"+p.id+
"\n";
}list.push(p);
}
}

if(table.config.debug)
{log(parsersDebug);
}

return list;
};function detectParserForColumn(table,node)
{var l=parsers.length;

for(var i=1;i<l;i++)
{

if(parsers+.is($.trim(getElementText(table.config,node)),table,node))
{

return parsers+;
}
}

return parsers[0];
}function getParserById(name)
{var l=parsers.length;

for(var i=0;i<l;i++)
{

if(parsers+.id.toLowerCase()==name.toLowerCase())
{

return parsers+;
}
}

return 

false;
}function buildCache(table)
{

if(table.config.debug)
{var cacheTime=

new Date();
}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache=
{row:[],normalized:[]
};

for(var i=0;i<totalRows;++i)
{var c=table.tBodies[0].rows+,cols=[];cache.row.push($(c));

for(var j=0;j<totalCells;++j)
{cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));
}cols.push(i);cache.normalized.push(cols);cols=

null;
};

if(table.config.debug)
{benchmark(
"Building cache for "+totalRows+
" rows:",cacheTime);
}

return cache;
};function getElementText(config,node)
{

if(!node)return
"";var t=
"";

if(config.textExtraction==
"simple")
{

if(node.childNodes[0]&&node.childNodes[0].hasChildNodes())
{t=node.childNodes[0].innerHTML;
}

else
{t=node.innerHTML;
}
}

else
{

if(typeof(config.textExtraction)==
"function")
{t=config.textExtraction(node);
}

else
{t=$(node).text();
}
}

return t;
}function appendToTable(table,cache)
{

if(table.config.debug)
{var appendTime=

new Date()
}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];

for(var i=0;i<totalRows;i++)
{rows.push(r[n+[checkCell]]);

if(!table.config.appender)
{var o=r[n+[checkCell]];var l=o.length;

for(var j=0;j<l;j++)
{tableBody[0].appendChild(o[j]);
}
}
}

if(table.config.appender)
{table.config.appender(table,rows);
}rows=

null;

if(table.config.debug)
{benchmark(
"Rebuilt table:",appendTime);
}applyWidget(table);setTimeout(function()
{$(table).trigger(
"sortEnd");
},0);
};function buildHeaders(table)
{

if(table.config.debug)
{var time=

new Date();
}var meta=($.metadata)?

true:false,tableHeadersRows=[];

for(var i=0;i<table.tHead.rows.length;i++)
{tableHeadersRows+=0;
};$tableHeaders=$(
"thead th",table);$tableHeaders.each(function(index)
{this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);

if(checkHeaderMetadata(

this)||checkHeaderOptions(table,index))this.sortDisabled=

true;

if(!this.sortDisabled)
{$(

this).addClass(table.config.cssHeader);
}table.config.headerList[index]=

this;
});

if(table.config.debug)
{benchmark(
"Built headers:",time);log($tableHeaders);
}

return $tableHeaders;
};function checkCellColSpan(table,rows,row)
{var arr=[],r=table.tHead.rows,c=r[row].cells;

for(var i=0;i<c.length;i++)
{var cell=c+;

if(cell.colSpan>1)
{arr=arr.concat(checkCellColSpan(table,headerArr,row++));
}

else
{

if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1]))
{arr.push(cell);
}
}
}

return arr;
};function checkHeaderMetadata(cell)
{

if(($.metadata)&&($(cell).metadata().sorter===

false))
{

return 

true;
};

return 

false;
}function checkHeaderOptions(table,i)
{

if((table.config.headers+)&&(table.config.headers+.sorter===

false))
{

return 

true;
};

return 

false;
}function applyWidget(table)
{var c=table.config.widgets;var l=c.length;

for(var i=0;i<l;i++)
{getWidgetById(c+).format(table);
}
}function getWidgetById(name)
{var l=widgets.length;

for(var i=0;i<l;i++)
{

if(widgets+.id.toLowerCase()==name.toLowerCase())
{

return widgets+;
}
}
};function formatSortingOrder(v)
{

if(typeof(v)!=
"Number")
{i=(v.toLowerCase()==
"desc")?1:0;
}

else
{i=(v==(0||1))?v:0;
}

return i;
}function isValueInArray(v,a)
{var l=a.length;

for(var i=0;i<l;i++)
{

if(a+[0]==v)
{

return 

true;
}
}

return 

false;
}function setHeadersCss(table,$headers,list,css)
{$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset)
{

if(!this.sortDisabled)
{h[this.column]=$(

this);
}
});var l=list.length;

for(var i=0;i<l;i++)
{h[list+[0]].addClass(css[list+[1]]);
}
}function fixColumnWidth(table,$headers)
{var c=table.config;

if(c.widthFixed)
{var colgroup=$(
'<colgroup>');$(
"tr:first td",table.tBodies[0]).each(function()
{colgroup.append($(
'<col>').css(
'width',$(

this).width()));
});$(table).prepend(colgroup);
};
}function updateHeaderSortCount(table,sortList)
{var c=table.config,l=sortList.length;

for(var i=0;i<l;i++)
{var s=sortList+,o=c.headerList[s[0]];o.count=s[1];o.count++;
}
}function multisort(table,sortList,cache)
{

if(table.config.debug)
{var sortTime=

new Date();
}var dynamicExp=
"var sortWrapper = function(a,b) {",l=sortList.length;

for(var i=0;i<l;i++)
{var c=sortList+[0];var order=sortList+[1];var s=(getCachedSortType(table.config.parsers,c)==
"text")?((order==0)?
"sortText":
"sortTextDesc"):((order==0)?
"sortNumeric":
"sortNumericDesc");var e=
"e"+i;dynamicExp+=
"var "+e+
" = "+s+
"(a["+c+
"],b["+c+
"]); ";dynamicExp+=
"if("+e+
") { return "+e+
"; } ";dynamicExp+=
"else { ";
}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+=
"return a["+orgOrderCol+
"]-b["+orgOrderCol+
"];";

for(var i=0;i<l;i++)
{dynamicExp+=
"}; ";
}dynamicExp+=
"return 0; ";dynamicExp+=
"}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);

if(table.config.debug)
{benchmark(
"Sorting on "+sortList.toString()+
" and dir "+order+
" time:",sortTime);
}

return cache;
};function sortText(a,b)
{

return((a<b)?-1:((a>b)?1:0));
};function sortTextDesc(a,b)
{

return((b<a)?-1:((b>a)?1:0));
};function sortNumeric(a,b)
{

return a-b;
};function sortNumericDesc(a,b)
{

return b-a;
};function getCachedSortType(parsers,i)
{

return parsers+.type;
};this.construct=function(settings)
{

return this.each(function()
{

if(!this.tHead||!this.tBodies)

return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config=
{
};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(

this);$headers=buildHeaders(

this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(

this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(

this);$headers.click(function(e)
{$this.trigger(
"sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;

if(!this.sortDisabled&&totalRows>0)
{var $cell=$(

this);var i=this.column;this.order=this.count++%2;

if(!e[config.sortMultiSortKey])
{config.sortList=[];

if(config.sortForce!=

null)
{var a=config.sortForce;

for(var j=0;j<a.length;j++)
{

if(a[j][0]!=i)
{config.sortList.push(a[j]);
}
}
}config.sortList.push([i,this.order]);
}

else
{

if(isValueInArray(i,config.sortList))
{

for(var j=0;j<config.sortList.length;j++)
{var s=config.sortList[j],o=config.headerList[s[0]];

if(s[0]==i)
{o.count=s[1];o.count++;s[1]=o.count%2;
}
}
}

else
{config.sortList.push([i,this.order]);
}
};setTimeout(function()
{setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));
},1);

return 

false;
}
}).mousedown(function()
{

if(config.cancelSelection)
{this.onselectstart=function()
{

return 

false
};

return 

false;
}
});$this.bind(
"update",function()
{this.config.parsers=buildParserCache(this,$headers);cache=buildCache(

this);
}).bind(
"sorton",function(e,list)
{$(

this).trigger(
"sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));
}).bind(
"appendCache",function()
{appendToTable(this,cache);
}).bind(
"applyWidgetId",function(e,id)
{getWidgetById(id).format(

this);
}).bind(
"applyWidgets",function()
{applyWidget(

this);
});

if($.metadata&&($(

this).metadata()&&$(

this).metadata().sortlist))
{config.sortList=$(

this).metadata().sortlist;
}

if(config.sortList.length>0)
{$this.trigger(
"sorton",[config.sortList]);
}applyWidget(

this);
});
};this.addParser=function(parser)
{var l=parsers.length,a=

true;

for(var i=0;i<l;i++)
{

if(parsers+.id.toLowerCase()==parser.id.toLowerCase())
{a=

false;
}
}

if(a)
{parsers.push(parser);
};
};this.addWidget=function(widget)
{widgets.push(widget);
};this.formatFloat=function(s)
{var i=parseFloat(s);

return(isNaN(i))?0:i;
};this.formatInt=function(s)
{var i=parseInt(s);

return(isNaN(i))?0:i;
};this.isDigit=function(s,config)
{var DECIMAL=
'\\'+config.decimal;var exp='/(^[+]?0(
'+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)
'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*
'+DECIMAL+'0+$)/
';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a+;if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),'
'));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]
{2
}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));
},format:function(s)
{

return $.tablesorter.formatFloat(

new Date(s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"shortDate",is:function(s)
{return/\d
{1,2
}[\/\-]\d
{1,2
}[\/\-]\d
{2,4
}/.test(s);
},format:function(s,table)
{var c=table.config;s=s.replace(/\-/g,
"/");

if(c.dateFormat==
"us")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{4
})/,
"$3/$1/$2");
}

else 

if(c.dateFormat==
"uk")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{4
})/,
"$3/$2/$1");
}

else 

if(c.dateFormat==
"dd/mm/yy"||c.dateFormat==
"dd-mm-yy")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{2
})/,
"$1/$2/$3");
}

return $.tablesorter.formatFloat(

new Date(s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"time",is:function(s)
{return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
},format:function(s)
{

return $.tablesorter.formatFloat(

new Date(
"2000/01/01 "+s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"metadata",is:function(s)
{

return 

false;
},format:function(s,table,cell)
{var c=table.config,p=(!c.parserMetadataName)?
'sortValue':c.parserMetadataName;

return $(cell).metadata()[p];
},type:
"numeric"
});ts.addWidget(
{id:
"zebra",format:function(table)
{

if(table.config.debug)
{var time=

new Date();
}$(
"tr:visible",table.tBodies[0]).filter(
':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(
':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);

if(table.config.debug)
{$.tablesorter.benchmark(
"Applying Zebra widget",time);
}
}
});
})(jQuery); </script> <script type=
"text/javascript"> (function($) 
{ $.extend(
{ tablesorterPager: 

new function() 
{ function updatePageDisplay(c) 
{ var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages); 
} function setPageSize(table,size) 
{ var c = table.config; c.size = size; c.totalPages = Math.ceil(c.totalRows / c.size); c.pagerPositionSet = 

false; moveToPage(table); fixPosition(table); 
} function fixPosition(table) 
{ var c = table.config; 

if(!c.pagerPositionSet && c.positionFixed) 
{ var c = table.config, o = $(table); 

if(o.offset) 
{ c.container.css(
{ top: o.offset().top + o.height() + 
'px', position: 
'absolute' 
}); 
} c.pagerPositionSet = 

true; 
} 
} function moveToFirstPage(table) 
{ var c = table.config; c.page = 0; moveToPage(table); 
} function moveToLastPage(table) 
{ var c = table.config; c.page = (c.totalPages-1); moveToPage(table); 
} function moveToNextPage(table) 
{ var c = table.config; c.page++; 

if(c.page >= (c.totalPages-1)) 
{ c.page = (c.totalPages-1); 
} moveToPage(table); 
} function moveToPrevPage(table) 
{ var c = table.config; c.page--; 

if(c.page <= 0) 
{ c.page = 0; 
} moveToPage(table); 
} function moveToPage(table) 
{ var c = table.config; 

if(c.page < 0 || c.page > (c.totalPages-1)) 
{ c.page = 0; 
} renderTable(table,c.rowsCopy); 
} function renderTable(table,rows) 
{ var c = table.config; var l = rows.length; var s = (c.page * c.size); var e = (s + c.size); 

if(e > rows.length ) 
{ e = rows.length; 
} var tableBody = $(table.tBodies[0]); 
// clear the table body $.tablesorter.clearTableBody(table); 

for(var i = s; i < e; i++) 
{ 
//tableBody.append(rows+); var o = rows+; var l = o.length; 

for(var j=0; j < l; j++) 
{ tableBody[0].appendChild(o[j]);   
} 
} fixPosition(table,tableBody); $(table).trigger(
"applyWidgets"); 

if( c.page >= c.totalPages ) 
{ moveToLastPage(table); 
} updatePageDisplay(c); 
} this.appender = function(table,rows) 
{ var c = table.config; c.rowsCopy = rows; c.totalRows = rows.length; c.totalPages = Math.ceil(c.totalRows / c.size); renderTable(table,rows); 
}; this.defaults = 
{ size: 10, offset: 0, page: 0, totalRows: 0, totalPages: 0, container: null, cssNext: 
'.next', cssPrev: 
'.prev', cssFirst: 
'.first', cssLast: 
'.last', cssPageDisplay: 
'.pagedisplay', cssPageSize: 
'.pagesize', seperator: 
"/", positionFixed: true, appender: this.appender 
}; this.construct = function(settings) 
{ 

return this.each(function() 
{ config = $.extend(this.config, $.tablesorterPager.defaults, settings); var table = this, pager = config.container; $(

this).trigger(
"appendCache"); config.size = parseInt($(
".pagesize",pager).val()); $(config.cssFirst,pager).click(function() 
{ moveToFirstPage(table); 

return 

false; 
}); $(config.cssNext,pager).click(function() 
{ moveToNextPage(table); 

return 

false; 
}); $(config.cssPrev,pager).click(function() 
{ moveToPrevPage(table); 

return 

false; 
}); $(config.cssLast,pager).click(function() 
{ moveToLastPage(table); 

return 

false; 
}); $(config.cssPageSize,pager).change(function() 
{ setPageSize(table,parseInt($(

this).val())); 

return 

false; 
}); 
}); 
}; 
} 
}); 
// extend plugin scope $.fn.extend(
{ tablesorterPager: $.tablesorterPager.construct 
}); 
})(jQuery);   </script> <script type=
"text/javascript" > $(document).ready(function() 
{ $(
"#myTable").tablesorter(
{widgets: [
'zebra']
}); 
} ); </script>   </head> <body>   <table id=
"myTable" class=
"tablesorter"> <thead> <tr> <th>Computer ID</th> <th>Name</th> <th>Location by IP</th> <th>Last Report Time</th> <th>Time Since Last Report</th> </tr> </thead> <tbody> <?Relevance    concatenation of trs of (concatenation of tds of item 0 of it & concatenation of tds of item 1 of it & concatenation of tds of item 2 of it & concatenation of tds of item 3 of it & concatenation of tds of item 4 of it) of (id of it as string, names of it, (

if exists results (it, bes properties 
"Location By IP Range") then values of results (it, bes properties 
"Location By IP Range") as string 

else 
""), last report time of it as string, (now - last report time of it) as string) of (bes computers whose ( (now - last report time of it) > (
"01:30:00" as time interval) and (relay server flag of it = 

true)))  ?> </tbody> </table> </body> </html>

I tried to simplify the relevance a bit so that it’s easier to understand. I hope that helps.

(imported comment written by adiponio91)

Thanks Boyd,

That did do the trick. If I wanted to add additional columns reporting on other properties, what sections do i need to edit? For example I changed the last section as follows to add the current user, but it did not work.

<?Relevance concatenation of trs of (concatenation of tds of item 0 of it & concatenation of tds of item 1 of it & concatenation of tds of item 2 of it & concatenation of tds of item 3 of it & concatenation of tds of item 4 of it & concatenation of tds of item 5 of it) of (id of it as string, names of it, (if exists results (it, bes properties "Location By IP Range") then values of results (it, bes properties "Location By IP Range") as string else ""), last report time of it as string, (now - last report time of it) as string, (if exists current user then name of current user else “Uknown�� )) of (bes computers whose ( (now - last report time of it) > ("01:30:00" as time interval) and (relay server flag of it = true))) ?>
Computer ID Name Location by IP Last Report Time Time Since Last Report User Name

Thanks again for your help…

Regards,

adiponio

(imported comment written by MattBoyd)

Adiponio

You edited all of the right places, but I don’t think you’ll be able to use “current user” in your relevance clause for Web Reports. Instead, you should use this to retrieve the bes property “User Name” :

<?Relevance concatenation of trs of (concatenation of tds of item 0 of it & concatenation of tds of item 1 of it & concatenation of tds of item 2 of it & concatenation of tds of item 3 of it & concatenation of tds of item 4 of it & concatenation of tds of item 5 of it) of (id of it as string, names of it, (if exists results (it, bes properties "Location By IP Range") then values of results (it, bes properties "Location By IP Range") as string else ""), last report time of it as string, (now - last report time of it) as string, color=red values of results (it, bes properties "User Name")[/color]) of (bes computers whose ( (now - last report time of it) > ("01:30:00" as time interval) and (relay server flag of it = false))) ?>

(imported comment written by adiponio91)

Sorry for the late acknowledgement, but this is much appreciated. Thanks boyd

(imported comment written by SystemAdmin)

I have been using this report for a while now. After we finished our version 8 upgrade, I had a few relay computers that I needed to uninstall and reinstall the BES client on because they were not reporting correctly. The process was to uninstall the client and clear the reg keys, then delete the duplicate computer from the console (this was done on about 5 relay computers). This report is still showing me results for the computers that I deleted from the console. If I search for the computer name listed in the report, I find that relay being active, but with a different computer ID, if I search for the comptuer ID listed in the report I don’t see any results.

Any suggestions?

(imported comment written by MattBoyd)

My only suggestion would be to try clearing and reloading your web reports cache: http://support.bigfix.com/cgi-bin/kbdirect.pl?id=360 .

I looked for relevance that could check if the computer was deleted, but couldn’t find anything.