node-red-nagios-nsca-send
Version:
A Node-RED node to forward to Nagios using NSCA send
493 lines (460 loc) • 24 kB
HTML
<script type="text/x-red" data-template-name="nagios-nsca-send">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label>
<input type="text" id="node-input-name" placeholder="">
</div>
<div class="form-row">
<label for="node-input-nagioshost"><i class="fa fa-tag"></i> Nagios Host</label>
<input type="text" id="node-input-nagioshost" placeholder="">
</div>
<div class="form-row">
<label for="node-input-nscaport"><i class="fa fa-desktop"></i> NSCA port</label>
<input type="text" id="node-input-nscaport" placeholder="5667">
</div>
<div class="form-row">
<label for="node-input-host"><i class="fa fa-rss"></i> Host</label>
<input type="text" id="node-input-host">
</div>
<div class="form-row">
<label for="node-input-service"><i class="fa fa-wrench"></i> Service</label>
<input type="text" id="node-input-service">
</div>
<div class="form-row">
<label for="node-input-send_nsca_script"><i class="fa fa-wrench"></i> send_nsca script</label>
<input type="text" id="node-input-send_nsca_script" placeholder="/usr/sbin/send_nsca">
</div>
<div class="form-row">
<label for="node-input-send_nsca_config"><i class="fa fa-wrench"></i> <span data-i18n="nagios-nsca-send.label.send_nsca_config"></span></label>
<input type="text" id="node-input-send_nsca_config" placeholder="/etc/send_nsca.cfg">
</div>
<div class="form-row" style="margin-bottom:0;">
<label><i class="fa fa-list"></i> <span data-i18n="nagios-nsca-send.label.perfdata"></span></label>
</div>
<div class="form-row node-input-perfdata-container-row">
<ol id="node-input-perfdata-container"></ol>
</div>
</script>
<script type="text/x-red" data-help-name="nagios-nsca-send">
<p>A node to send a message to the Nagios NSCA service.</p>
<p>The Nagios server running the NSCA service must be given as well as the host and the service for which this passive check sends data.</p>
<p>The input message:</p>
<ul>
<li><code>nagioshost</code>, mandatory, specifies the Nagios host running the NSCA service.</li>
<li><code>nscaport</code>, if set, replaces the default port 5667.</li>
<li><code>host</code>, mandatory, is the name of the host as defined in your Nagios.</li>
<li><code>service</code>, mandatory, is the name of the service as defined in your Nagios.</li>
<li><code>send_nsca_script</code>, mandatory, is full path of the executable used for sending data to the NSCA running Nagios server.</li>
<li><code>send_nsca_config</code>, mandatory, is full path of the configuration file needed to send to that NSCA service..</li>
</ul>
<p>messages for each set of performance data:</p>
<ul>
<li><code>name</code> unique name identifying the performance data.</li>
<li><code>value of key</code> name of the key, that carries the value to be send.</li>
<li><code>warning</code> defines when the warning state is reached.</li>
<li><code>critical</code> defines when the critical state is reached.</li>
<li><code>Minimum</code> defines the lower end of the scale.</li>
<li><code>Maximum</code> defines the upper end of the scale.</li>
<li><code>UOM</code> defines the Unit Of Meassure.</li>
</ul>
<p>Further explanations will be given as the project progresses.</p>
</script>
<script type="text/javascript">
RED.nodes.registerType('nagios-nsca-send', {
category: 'output',
color: '#E2C96C',
defaults: {
name: {
value: '',
type: 'string',
required: false,
},
nagioshost: {
value: '',
type: 'string',
required: true,
},
nscaport: {
value: 5667,
type: 'number',
required: false,
},
host: {
value: '',
type: 'string',
required: true,
},
service: {
value: '',
type: 'string',
required: true,
},
status: {
value: '',
type: 'number',
required: false,
},
send_nsca_script: {
value: '/usr/sbin/send_nsca',
type: 'string',
required: true,
},
send_nsca_config: {
value: '/etc/send_nsca.cfg',
type: 'string',
required: true,
},
perfdata: {
value: [{
/* perfname: 'Temperatur',
perfname_t: 'str',
value_from: 'payload.Temperature',
value_from_t: 'msg',
warn_t: 'between',
warn_lt: 'num',
warn_l: 10,
warn_ht: 'num',
warn_h: 30,
crit_t: 'outside',
crit_lt: 'num',
crit_l: -5,
crit_ht: 'num',
crit_h: -40,
min: '-10',
min_t: 'num',
max: '60',
max_t: 'num',
UOM: '',*/
perfname: '',
perfname_t: 'str',
value_from: '',
value_from_t: 'str',
warn_t: 'above',
warn_lt: 'num',
warn_l: '',
warn_ht: 'num',
warn_h: '',
crit_t: 'above',
crit_lt: 'num',
crit_l: '',
crit_ht: 'num',
crit_h: '',
min: '',
min_t: 'num',
max: '',
max_t: 'num',
UOM: '',
}],
required: false,
}
},
inputs: 1,
outputs: 0,
icon: 'nagios.png',
label: function() {
if (this.name) {
return this.name || 'nagios nsca send';
}
if (!this.perfdata) {
return this._("nagios-nsca-send.label.unconfigured_node",{property:'alex was here'});
} else {
console.log( JSON.stringify(this.perfdata) );
if (this.perfdata.length == 1) {
return this._("nagios-nsca-send.label.NSCA",{property:(this.perfdata[0].perfname||this._("nagios-nsca-send.label.default_name"))});
} else {
return this._("nagios-nsca-send.label.NSCA",{property:(this.perfdata[0].perfname||this._("nagios-nsca-send.label.default_name"))});
}
}
},
labelStyle: function() {
return this.name ? 'node_label_italic' : '';
},
align: 'right',
oneditprepare: function() {
/*
warn
0 < warn < b
a < warn
warn < n
warn < a < b < warn
a <= warn <=b
crit
*/
var perfname = this._("nagios-nsca-send.label.name");
var warn = this._("nagios-nsca-send.label.warn");
var crit = this._("nagios-nsca-send.label.crit");
var value_from = this._("nagios-nsca-send.label.value_from");
var below = this._("nagios-nsca-send.action.below");
var above = this._("nagios-nsca-send.action.above");
var between = this._("nagios-nsca-send.action.between");
var outside = this._("nagios-nsca-send.action.outside");
var and = this._("nagios-nsca-send.label.and");
var min = this._("nagios-nsca-send.label.min");
var max = this._("nagios-nsca-send.label.max");
var uom = this._("nagios-nsca-send.label.UOM");
function resizeRule(perfd) {
var newWidth = perfd.width();
perfd.find('.red-ui-typedInput').typedInput("width",newWidth-150);
}
$('#node-input-perfdata-container').css('min-height','300px').css('min-width','450px').editableList({
addItem: function(container,i,opt) {
var perfd = opt;
console.log( "i", i);
console.log( "container", JSON.stringify(container) );
console.log( "perfd", JSON.stringify(perfd) );
if (!perfd.hasOwnProperty('perfname')) {
/* perfd = {perfname:"",perfname_t:"str",value_from:"",value_from_t:"str",warn_t:"above",warn_l:"",warn_lt:"num",warn_h:50,warn_ht:"num",crit_t:"outside",crit_l:-10,crit_lt:"num",crit_h:60,crit_ht:"num",min:-20,max:70,UOM:""}; */
perfd = {perfname:"",perfname_t:"str",value_from:"payload",value_from_t:"msg",warn_t:"above",warn_l:"",warn_lt:"num",warn_h:"",warn_ht:"num",crit_t:"above",crit_l:"",crit_lt:"num",crit_h:"",crit_ht:"num",min:"",max:"",UOM:""};
}
console.log( "perfd", JSON.stringify(perfd) );
var row = [
$('<div/>').appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container),
$('<div/>',{style:"margin-top:8px;"}).appendTo(container)
];
/* name */
$('<div/>',{style:"display:inline-block; text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(perfname)
.appendTo(row[0]);
var propertyName = $('<input/>',{class:"node-input-perfdata-property-perfname",type:"text"})
.appendTo(row[0])
.typedInput({default:'str',types:['msg','flow','global','str','num','json','jsonata']});
/* value_from */
$('<div/>',{style:"display:inline-block; text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(value_from)
.appendTo(row[1]);
var propertyValueFrom = $('<input/>',{class:"node-input-perfdata-property-value_from",type:"text"})
.appendTo(row[1])
.typedInput({default:'msg',types:['msg','flow','global','str','json','jsonata']});
/* $('<input/>',{class:"node-input-perfdata-type",style:"width:250px; margin-right:10px;"}).appendTo(row[0]); */
/* warn */
var warnrow = $('<div/>',{style:"display:inline-block; text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(warn)
.appendTo(row[2]);
var warnSelectField = $('<select/>',{class:"node-input-perfdata-property-warn_t",style:"width:110px; margin-right:10px;"})
.appendTo(row[2]);
var selectOptions = [{v:"below",l:below},{v:"above",l:above},{v:"between",l:between},{v:"outside",l:outside}];
for (var i=0; i<selectOptions.length; i++) {
warnSelectField.append($("<option></option>").val(selectOptions[i].v).text(selectOptions[i].l));
}
/* warn_l */
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"}).appendTo(row[3]);
var propertyWarn_l = $('<input/>',{class:"node-input-perfdata-property-warn_l",type:"text"})
.appendTo(row[3])
.typedInput({default:'num',types:['msg','flow','global','num','json','jsonata']});
5667
/* and */
var propertyWarnAnd = $('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(and)
.appendTo(row[4]);
/* warn_h */
var propertyWarn_h = $('<input/>',{class:"node-input-perfdata-property-warn_h",type:"text"})
.appendTo(row[4])
.typedInput({default:'num',types:['msg','flow','global','num','json','jsonata']});
warnSelectField.change(function() {
var width = $("#node-input-perfdata-container").width();
var type = $(this).val();
if (type == "below") {
row[3].show();
propertyWarnAnd.hide();
row[4].hide();
} else if (type == "above") {
row[3].hide();
propertyWarnAnd.text("");
propertyWarnAnd.show();
row[4].show();
} else if (type == "between" || type == "outside") {
row[3].show();
propertyWarnAnd.text(and);
propertyWarnAnd.show();
row[4].show();
}
resizeRule(container);
});
/* crit */
var critrow = $('<div/>',{style:"display:inline-block; text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(crit)
.appendTo(row[5]);
var critSelectField = $('<select/>',{class:"node-input-perfdata-property-crit_t",style:"width:110px; margin-right:10px;"})
.appendTo(row[5]);
var selectOptions = [{v:"below",l:below},{v:"above",l:above},{v:"between",l:between},{v:"outside",l:outside}];
for (var i=0; i<selectOptions.length; i++) {
critSelectField.append($("<option></option>").val(selectOptions[i].v).text(selectOptions[i].l));
}
/* crit_l */
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"}).appendTo(row[6]);
var propertyCrit_l = $('<input/>',{class:"node-input-perfdata-property-crit_l",type:"text"})
.appendTo(row[6])
.typedInput({default:'num',types:['msg','flow','global','num','json','jsonata']});
/* and */
var propertyCritAnd = $('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(and)
.appendTo(row[7]);
/* crit_h */
var propertyCrit_h = $('<input/>',{class:"node-input-perfdata-property-crit_h",type:"text"})
.appendTo(row[7])
.typedInput({default:'num',types:['msg','flow','global','num','json','jsonata']});
critSelectField.change(function() {
var width = $("#node-input-perfdata-container").width();
var type = $(this).val();
if (type == "below") {
row[6].show();
propertyCritAnd.hide();
row[7].hide();
} else if (type == "above") {
row[6].hide();
propertyCritAnd.text("");
propertyCritAnd.show();
row[7].show();
} else if (type == "between" || type == "outside") {
row[6].show();
propertyCritAnd.text(and);
propertyCritAnd.show();
row[7].show();
}
resizeRule(container);
});
/* min */
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(min)
.appendTo(row[8]);
var propertyMin = $('<input/>',{class:"node-input-perfdata-property-min",type:"text"})
.appendTo(row[8])
.typedInput({default:'num',types:['msg','flow','global','num','json','jsonata']});
/* max */
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(max)
.appendTo(row[9]);
var propertyMax = $('<input/>',{class:"node-input-perfdata-property-max",type:"text"})
.appendTo(row[9])
.typedInput({default:'num',types:['msg','flow','global','num','json','jsonata']});
/* UOM */
$('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"})
.text(uom)
.appendTo(row[10]);
var propertyUOM = $('<input/>',{class:"node-input-perfdata-property-uom",type:"text"})
.appendTo(row[10])
.typedInput({default:'str',types:['msg','flow','global','str','json','jsonata']});
warnSelectField.val(perfd.warn_t);
critSelectField.val(perfd.crit_t);
propertyName.typedInput('value',perfd.perfname);
propertyName.typedInput('type',perfd.perfname_t);
propertyValueFrom.typedInput('value',perfd.value_from);
propertyValueFrom.typedInput('type',perfd.value_fromt);
propertyWarn_l.typedInput('value',perfd.warn_l);
propertyWarn_l.typedInput('type',perfd.warn_lt);
propertyWarn_h.typedInput('value',perfd.warn_h);
propertyWarn_h.typedInput('type',perfd.warn_ht);
propertyCrit_l.typedInput('value',perfd.crit_l);
propertyCrit_l.typedInput('type',perfd.crit_lt);
propertyCrit_h.typedInput('value',perfd.crit_h);
propertyCrit_h.typedInput('type',perfd.crit_ht);
propertyMin.typedInput('value',perfd.min);
propertyMin.typedInput('type',perfd.min_t);
propertyMax.typedInput('value',perfd.max);
propertyMax.typedInput('type',perfd.max_t);
propertyUOM.typedInput('value',perfd.uom);
propertyUOM.typedInput('type',perfd.uom_t);
warnSelectField.change();
critSelectField.change();
var newWidth = $("#node-input-perfd-container").width();
resizeRule(container);
},
resizeItem: resizeRule,
removable: true,
sortable: true
});
console.log( "perfdata", JSON.stringify(this.perfdata) );
if (!this.perfdata) {
console.log( "this", JSON.stringify(this) );
var perfd = {
perfname: '',
perfname_t: 'str',
value_from: '',
value_fromt: 'msg',
warn_t: 'above',
warn_lt: 'num',
warn_l: '',
warn_ht: 'num',
warn_h: '',
crit_t: 'above',
crit_lt: 'num',
crit_l: '',
crit_ht: 'num',
crit_h: '',
min: '',
min_t: 'num',
max: '',
max_t: 'num',
UOM: ''
}
this.perfdata = [perfd];
}
console.log( "perfdata", JSON.stringify(this.perfdata) );
for (var i=0; i<this.perfdata.length; i++) {
var perfd = this.perfdata[i];
console.log( "perfd", JSON.stringify(perfd) );
$("#node-input-perfdata-container").editableList('addItem',perfd);
console.log( "added one perfdata-row" );
}
console.log( "added alls perfdata-rows" );
},
oneditsave: function() {
var perfdata = $("#node-input-perfdata-container").editableList('items');
console.log( "perfdata while saving", JSON.stringify(this.perfdata) );
var node = this;
node.name = $("#node-input-name").val();
node.nagioshost = $("#node-input-nagioshost").val();
node.nscaport= $("#node-input-nscaport").val();
node.host = $("#node-input-host").val();
node.service = $("#node-input-service").val();
node.send_nsca_script = $("#node-input-send_nsca_script").val();
node.send_nsca_config = $("#node-input-send_nsca_config").val();
node.perfdata= [];
perfdata.each(function(i) {
var perfd = $(this);
var r = {
perfname: perfd.find(".node-input-perfdata-property-perfname").typedInput('value'),
perfname_t: perfd.find(".node-input-perfdata-property-perfname").typedInput('type'),
value_from: perfd.find(".node-input-perfdata-property-value_from").typedInput('value'),
value_fromt: perfd.find(".node-input-perfdata-property-value_from").typedInput('type'),
warn_t: perfd.find(".node-input-perfdata-property-warn_t").val(),
warn_l: perfd.find(".node-input-perfdata-property-warn_l").typedInput('value'),
warn_lt: perfd.find(".node-input-perfdata-property-warn_l").typedInput('type'),
warn_h: perfd.find(".node-input-perfdata-property-warn_h").typedInput('value'),
warn_ht: perfd.find(".node-input-perfdata-property-warn_h").typedInput('type'),
crit_t: perfd.find(".node-input-perfdata-property-crit_t").val(),
crit_l: perfd.find(".node-input-perfdata-property-crit_l").typedInput('value'),
crit_lt: perfd.find(".node-input-perfdata-property-crit_l").typedInput('type'),
crit_h: perfd.find(".node-input-perfdata-property-crit_h").typedInput('value'),
crit_ht: perfd.find(".node-input-perfdata-property-crit_h").typedInput('type'),
min: perfd.find(".node-input-perfdata-property-min").typedInput('value'),
min_t: perfd.find(".node-input-perfdata-property-min").typedInput('type'),
max: perfd.find(".node-input-perfdata-property-max").typedInput('value'),
max_t: perfd.find(".node-input-perfdata-property-max").typedInput('type'),
uom: perfd.find(".node-input-perfdata-property-uom").typedInput('value'),
uom_t: perfd.find(".node-input-perfdata-property-uom").typedInput('type')
};
node.perfdata.push(r);
});
},
oneditresize: function(size) {
var rows = $("#dialog-form>div:not(.node-input-perfdata-container-row)");
var height = size.height;
for (var i=0; i<rows.size(); i++) {
height -= $(rows[i]).outerHeight(true);
}
var editorRow = $("#dialog-form>div.node-input-perfdata-container-row");
height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
$("#node-input-perfdata-container").editableList('height',height);
}
});
</script>