This commit introduces a new SNMP monitor feature to the application, allowing users to monitor devices using SNMP (Simple Network Management Protocol).pull/4717/head
parent
bab427f715
commit
d92003e172
@ -0,0 +1,10 @@
|
||||
exports.up = function (knex) {
|
||||
return knex.schema
|
||||
.alterTable("monitor", function (table) {
|
||||
table.string("snmp_community_string", 255).defaultTo("public"); // Add community_string column
|
||||
table.string("snmp_oid").notNullable(); // Add oid column
|
||||
table.enum("snmp_version", ["1", "2c", "3"]).defaultTo("2c"); // Add snmp_version column with enum values
|
||||
table.float("snmp_control_value").notNullable(); // Add control_value column as float
|
||||
table.string("snmp_condition").notNullable(); // Add oid column
|
||||
});
|
||||
};
|
@ -0,0 +1,69 @@
|
||||
const { MonitorType } = require("./monitor-type");
|
||||
const { UP, DOWN } = require("../../src/util");
|
||||
const snmp = require("snmp-native");
|
||||
|
||||
class SNMPMonitorType extends MonitorType {
|
||||
name = "snmp";
|
||||
|
||||
/**
|
||||
* Checks the SNMP value against the condition and control value.
|
||||
* @param {object} monitor The monitor object associated with the check.
|
||||
* @param {object} heartbeat The heartbeat object to update.
|
||||
* @param {object} _server Unused server object.
|
||||
*/
|
||||
async check(monitor, heartbeat, _server) {
|
||||
try {
|
||||
const session = new snmp.Session({ host: monitor.ipAddress, community: monitor.snmpCommunityString, version: monitor.snmpVersion });
|
||||
|
||||
session.get({ oid: monitor.snmpOid }, (err, varbinds) => {
|
||||
if (err) {
|
||||
heartbeat.status = DOWN;
|
||||
heartbeat.msg = `Error: ${err.message}`;
|
||||
return;
|
||||
}
|
||||
|
||||
// Assuming only one varbind is returned
|
||||
const value = varbinds[0].value;
|
||||
|
||||
// Convert value to appropriate type based on SNMP type (assuming it's integer or string for simplicity)
|
||||
const numericValue = parseInt(value);
|
||||
const stringValue = value.toString();
|
||||
|
||||
// Check against condition and control value
|
||||
switch (monitor.snmpCondition) {
|
||||
case '>':
|
||||
heartbeat.status = numericValue > monitor.snmpControlValue ? UP : DOWN;
|
||||
break;
|
||||
case '>=':
|
||||
heartbeat.status = numericValue >= monitor.snmpControlValue ? UP : DOWN;
|
||||
break;
|
||||
case '<':
|
||||
heartbeat.status = numericValue < monitor.snmpControlValue ? UP : DOWN;
|
||||
break;
|
||||
case '<=':
|
||||
heartbeat.status = numericValue <= monitor.snmpControlValue ? UP : DOWN;
|
||||
break;
|
||||
case '==':
|
||||
heartbeat.status = value === monitor.snmpControlValue ? UP : DOWN;
|
||||
break;
|
||||
case 'contains':
|
||||
heartbeat.status = stringValue.includes(monitor.snmpControlValue) ? UP : DOWN;
|
||||
break;
|
||||
default:
|
||||
heartbeat.status = DOWN;
|
||||
heartbeat.msg = `Invalid condition: ${monitor.snmpCondition}`;
|
||||
}
|
||||
|
||||
session.close();
|
||||
});
|
||||
} catch (err) {
|
||||
heartbeat.status = DOWN;
|
||||
heartbeat.msg = `Error: ${err.message}`;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
SNMPMonitorType,
|
||||
};
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue