Flow/Scripting/UsefulFunctions/InterfaceErrorsScript
log.warn("Policy to check for errors on an interface") var rosutils = Java.type('ros.CROSUtils'); //==================================================================== // // Policy to check for errors on an interface // List of devices to be checked contained in the devices array // List of Interfaces to be ignored in the ignoreList array // // Updated Feb 2015 by Shane Conneely // //===================================================================
var mail = true; var sending = 0; var mailText = ; var filename = './resources/webapps/static/iferrors.html'; var w = new java.io.FileWriter(filename, false); var devices = ["83.245.74.6", "10.100.4.1", "10.100.4.2", "10.100.4.5", "10.1.4.1", "10.2.4.1", "10.3.4.1", "10.4.4.1", "10.6.4.1", "10.7.4.1", "10.8.4.1", "10.9.4.1", "10.10.4.1", "10.11.4.1", "10.12.4.1", "10.13.4.1", "10.14.4.1", "10.15.4.1", "10.16.4.1", "88.151.80.179", "83.70.199.180"]; var ignoreList = ["10.2.4.1:10013", "10.9.4.1:10013", "88.151.80.178:2"]; //Add "Device:ifIndex" to this array and it will ignore that index when checking errors
var d = new Date(); var n = d.getHours() % 4; var dataStoreInErrors = actions.getDataStore('ifInErrors'); var dataStoreOutErrors = actions.getDataStore('ifOutErrors'); //if (n==0){ if (n != -1 || typeof dataStoreInErrors === 'undefined') {
for (var i = 0; i < devices.length; i++) {
var thisDevice = actions.getDevice(devices[i]);
var dev_id = rosutils.inet_atob(devices[i]);
log.warn('device # ' + i + ': IP: ' + devices[i] + " ID:" + dev_id);
if (thisDevice != null && thisDevice != 'undefined' && thisDevice != "" && thisDevice.getSysOID().indexOf('1.3.6.1.4.1.9') == 0 && dev_id != 0) {
var dev_name = thisDevice.getName();
log.warn('IN BP1 for device ' + devices[i]);
var uptime = actions.querySNMPNumber(thisDevice, '.1.3.6.1.2.1.1.3.0', -1);
log.warn('IN BP1a - uptime = ' + uptime);
if (uptime == null || uptime == -1) {
log.warn('IN BP1b for uptime, ' + devices[i] + ' Cant be contacted
');
//mailText+=new Date()+' '+kommon.utils.inet_itoa(thisDevice)+ ' Cant be contacted
';
} else {
if (uptime < 360000) {
log.warn('IN BP1b - uptime = ' + devices[i] + ' Has uptime of < 1 hour, up for:' + (uptime / (6000)) + ' Mins.');
//mailText+=new Date()+' '+kommon.utils.inet_itoa(thisDevice)+ ' Has uptime of < 1 hour, up for:'+(uptime/(6000))+' Mins.
';
}
//else {
// log.warn('IN BP1d - uptime = '+kommon.utils.inet_itoa(thisDevice)+ ' Has uptime of > 1 hour, up for:'+(uptime/(6000))+' Mins.');
// mailText+=new Date()+' '+kommon.utils.inet_itoa(thisDevice)+ ' Has uptime of > 1 hour, up for:'+(uptime/(6000))+' Mins.
';
// }
checkInterfaceErrors(thisDevice, dev_name, dev_id);
}
//mailText+='
';
} else {
log.warn('No such device # ' + i + ': IP: ' + devices[i] + " ID:" + dev_id);
}
}
if (mailText.length > 0) {
flog(mailText); // write to file
if (mail == true) {
log.warn("Sending mail" + mailText);
actions.sendMail('ronan.ohart@fastcom.ie', 'IFErrorsLive', mailText);
actions.sendMail('shane.conneely@fastcom.ie', 'IFErrorsLive', mailText);
sending++;
}
// log.warn('interface errors email : '+mailText);
} else {
log.warn('NO PROCESSING DONE FOR DEVICE: ' + devices[i]);
}
}
w.close();
// Write Interface Error results to file
function flog(message) {
w.write(new Date() + ' ' + message);
}
log.warn('All in errors' + dataStoreInErrors); log.warn('All out errors ' + dataStoreOutErrors);
function checkInterfaceErrors(thisDevice, dev_name, dev_id) {
// OID 1.3.6.1.2.1.2.2.1.14 = interface in errors // OID 1.3.6.1.2.1.2.2.1.20 = interface out errors var snmpdata = actions.querySNMPTable(thisDevice, ['.1.3.6.1.2.1.2.2.1.14', '.1.3.6.1.2.1.2.2.1.20']); var _duplex = ;
var spd_unit = ; var spd = ; var duplex = ;
//log.warn(snmpdata);
//log.warn( actions.getInterface(thisDevice, 1));
for (var i = 0; i < snmpdata.size(); i++) {
var anEntry = snmpdata.get(i).getColumns();
var inErrors = 0;
var outErrors = 0;
//log.warn(anEntry);
//var if_status = actions.getInterfaces(thisDevice);
//log.warn('All interfaces for device '+thisDevice+' '+if_status);
log.warn("index:" + snmpdata.get(i).getIndex());
var info1 = actions.getInterface(thisDevice, parseInt(snmpdata.get(i).getIndex()));
//log.warn(info1);
//var if_info2=actions.getInterfaceByKey(thisDevice,if_status[i]);
log.warn('info1 index # ' + i + ' ' + info1);
spd = info1.getSpeed();
if (spd < 1000000000) {
spd_unit = "Mbps";
spd = (spd / 1000000);
} else {
spd_unit = 'Gbps';
spd = (spd / 1000000000);
}
/* switch (info1.get('ifDuplex')) { // Test port duplex status. 1 = half, 2=full, 3=disagree, 4=auto
case 1:
duplex = "Unknown";
break;
case 2:
duplex = "Half Duplex";
break;
case 3:
duplex = "<b> color='green' Full Duplex</b>";
break;
case r:
duplex = "<b>Auto";
break;
} */
log.warn("ifinfo duplex:" + info1.getIfDuplexS() + " speed:" + spd + ' ' + spd_unit);
//log.warn('if_info2 index # ' + i + ' ' + if_info2);
if (anEntry[0] != null) {
inErrors = anEntry[0].getVariable().toLong();
}
log.warn("1ifinfo duplex:" + info1.getIfDuplexS() + " speed:" + spd + ' ' + spd_unit);
if (anEntry[1] != null) {
outErrors = anEntry[1].getVariable().toLong();
}
if (inErrors != 0 || outErrors != 0) {
checkPreviousErrorCount(thisDevice, parseInt(snmpdata.get(i).getIndex()), inErrors, outErrors, dev_name, dev_id);
//mailText+='Interface: '+info1.get('ifName')+' ' +info1.get('ifAlias') +': In Errors:'+inErrors+', Out Errors:'+outErrors+' Speed: '+spd+' '+spd_unit+' '+'Duplex: '+info1.get('ifDuplex')+'
';
}
}
}
function checkPreviousErrorCount(thisDevice, thisIndex, inErrors, outErrors, dev_name, dev_id) {
var key = dev_id + ':' + thisIndex;
if (inErrors != 0) {
log.warn(' SNMPR:' + 'checking key:' + key + ' In:' + inErrors + ', Out:' + outErrors + ' Index:' + thisIndex + ' ' + actions.getInterface(thisDevice, thisIndex));
if (isInArray(ignoreList, String(dev_id + ':' + thisIndex))) {
} else {
if ((inErrors - dataStoreInErrors.get(key)) >= 2) {
if (dataStoreInErrors.containsKey(key)) {
log.warn(' SNMPR E:' + key + ' In was found'); // Had errors before
if (dataStoreInErrors.get(key) !== inErrors) { // Error Rate changed
mail = true;
mailText += 'Interface Alert for Device ' + thisDevice.getIP() + ' -> ' + dev_name + '</b>
';
mailText += 'Interface: ' + '<a href="http://77.95.160.35:8080/overview/device/interface/?difSelection=' + dev_id + '_' + thisIndex + '">' + actions.getInterface(thisDevice, thisIndex).getIfDescr() + ' - ' + actions.getInterface(thisDevice, thisIndex).getIfAlias() + '</a>' + '
';
mailText += 'Total error count: ' + numberWithCommas(inErrors) + ' : ' + 'Errors since last check: ' + numberWithCommas(inErrors - dataStoreInErrors.get(key)) + '
'; mailText += '
';
//mailText+='SNMPR E:'+'In was:'+dataStoreInErrors.get(key)+', now:'+inErrors+' diff:'+(inErrors - dataStoreInErrors.get(key))+' Index:'+thisIndex+' '+actions.getInterface(thisDevice,thisIndex)+'
'; log.warn(' SNMPR E:' + 'In was:' + dataStoreInErrors.get(key) + ', now:' + inErrors + ' diff:' + (inErrors - dataStoreInErrors.get(key)) + ' Index:' + thisIndex + ' ' + actions.getInterface(thisDevice, thisIndex)); } else { log.warn(' SNMPR E:' + 'No change In was:' + dataStoreInErrors.get(key) + ', now:' + inErrors + ' diff:' + (inErrors - dataStoreInErrors.get(key)) + ' Index:' + thisIndex + ' ' + actions.getInterface(thisDevice, thisIndex)); } } } }
dataStoreInErrors.put(key, inErrors);
} else if (dataStoreInErrors.containsKey(key)) {
dataStoreInErrors.remove(key);
} else {
}
if (outErrors !== 0) {
if (isInArray(ignoreList, String(dev_id + ':' + thisIndex))) {
} else {
if ((outErrors - dataStoreInErrors.get(key)) >= 200) {
if (dataStoreOutErrors.containsKey(key)) {
log.warn(' SNMPR E:' + key + ' Out was found'); //Had errors before
if (dataStoreOutErrors.get(key) != outErrors) { //Error Rate changed
mail = true;
mailText += '<b>Interface Alert for Device ' + thisDevice.getIP() + ' -> ' + dev_name + '</b>
';
mailText += 'Interface: ' + '<a href="http://77.95.160.35:8080/overview/device/interface/?difSelectiondifSelection=' + dev_id + '_' + thisIndex + '">' + actions.getInterface(thisDevice, thisIndex).get("ifDescr") + ' - ' + actions.getInterface(thisDevice, thisIndex).get("ifAlias") + '</a>' + '
'; mailText += 'Total error count: ' + numberWithCommas(outErrors) + ' : ' + 'Errors since last check: ' + numberWithCommas(outErrors - dataStoreOutErrors.get(key)) + '
';
//mailText+='SNMPR E:'+'Out was:'+dataStoreOutErrors.get(key)+', now:'+outErrors+' diff:'+(outErrors - dataStoreOutErrors.get(key))+' Index:'+thisIndex+' '+actions.getInterface(thisDevice,thisIndex)+'
'; log.warn(' SNMPR E:' + 'Out was:' + dataStoreOutErrors.get(key) + ', now:' + outErrors + ' diff:' + (outErrors - dataStoreOutErrors.get(key)) + ' Index:' + thisIndex + ' ' + actions.getInterface(thisDevice, thisIndex)); } else { log.warn(' SNMPR E:' + 'No change Out was:' + dataStoreOutErrors.get(key) + ', now:' + outErrors + ' diff:' + (outErrors - dataStoreOutErrors.get(key)) + ' Index:' + thisIndex + ' ' + actions.getInterface(thisDevice, thisIndex)); } } } }
dataStoreOutErrors.put(key, outErrors);
} else if (dataStoreOutErrors.containsKey(key)) {
dataStoreOutErrors.remove(key);
} else {
}
}
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function isInArray(array, search) {
return (array.indexOf(search) >= 0) ? true : false;
} log.warn("Policy to check for errors on an interface Done, send " + sending + " mails")