Hi Tuxtom007,
Kannst du bitte mal das komplette Script posten?
Ich habe es auch soeben bei meinem QNAP versucht und bekomme mit diesem Skript:
<?
// *****************************************************************************
// ** Script zum Auslesen der MIB von SNMP Server
// ** Die Idee stammt von hardlog aus dem Symcon Forum (https://www.symcon.de/forum/threads/26977-Status-der-Synology-DS-per-Script-auslesen?p=247930#post247930)
// ** läuft so nur unter Windows, da das Komandozeilenprogramm "ssmnpq.exe"
// ** benötig: genanntes Programm hier http://www.digigrupp.com/ssnmpq/ downloaden
// ** in einen beliebigen Ornder entpacken und den Ornder in diesem Script
// ** entsprechend anpassen
// ** Bei NAS-Servern wie Synology / QNAP muss der SNMP-Dienst aktiviert werden.
// ** Den Standardport am SNMP Server bitte nicht ändern.
// **
// ** Dieses Skript funktioniert folgendermaßen:
// ** Du konfigurierst, welche Werte deines SNMP Servers du gerne auslesen,
// ** möchtest (siehe "registerSNMPObj" weiter unten).
// ** Das Skript wird den Datentyp der SNMP Daten ermitteln und als IPS-Variablen
// ** unterhalb des Skriptes anlegen (sofern diese nicht bereits existieren.)
// ** Der Name der Variable entspricht der von dir benannten "Beschreibung" für
// ** den SNMP-Wert.
// ** Die Werte der Variablen werden mit jeder Ausführung des Skripts aktualisiert.
// **
// ** Das Skript legt benötigte Variablenprofile an. Diese sind mit einem Präfix
// ** "SNMP_" versehen. Beispielsweise "SNMP_CapacityMB".
// *****************************************************************************
/**
KONFIGURATION der SNMP Verbindung
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**/
$host = "172.168.3.34"; // IP Adresse deines SNMP Servers (QNAP, Synology, etc.)
$community = "public"; // SNMP Community
$binary = "C:\IP-Symcon\automatic\SnmpGet\SnmpGet.exe"; // Pfad zum SNMP Binary
$debug = false; // Bei true werden Debuginformationen (echo) ausgegeben
$snmp = new SNMP($host, $community, $binary, $debug); //DIESE ZEILE NICHT VERÄNDERN!
/**
KONFIGURATION abzurufender Werte
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mit $snmp->registerSNMPObj($oid, $desc, $convertType) kannst du angeben,
welche Daten per SNMP abgerufen werden sollen.
Die Funktion benötigt drei Parameter:
Parameter1 ($oid):
------------------
die ID des Wertes am SNMP Server (Mit dem iReasoning MIB Browser kannst du mit
einem Windowsprogramm angenehm nach gültigen ID's in deinem System suchen.
http://www.ireasoning.com
Die vorbelegten OIDs basieren auf den Werten meiner QNAP und müssen evtl.
angepasst werden.
Parameter2 ($desc):
-------------------
Die Bezeichnung legt fest, wie die IPS-Variable genannt werden soll.
Bitte berücksichtige, dass jede OID und jede Bezeichnung eindeutig sein müssen
(keine doppelten Einträge). Ausserdem löscht das Skript keine einmal erstellten
Variablen. D.h. wenn du eine Bezeichnung umbenennst, denn musst du die "alte"
Variable manuell löschen.
Parameter 3 (convertType)
-------------------------
dieser Parameter ist optional. Wird er nicht gesetzt oder als "none" übergeben,
werden die Daten "wie empfangen" in der zugehörigen IPS-Variable gespeichert.
In einigen Fällen ist dies jedoch nicht erwünscht. Beispielsweise liefert eine
QNAP als freie Festplattenkapazität den Wert inkl. der Mengeneinheit als Text:
3.96 TB. Damit ist eine geeignete Weiterverarbeitung in IPS sowie ein Logging
der Variable ausgeschlossen.
Um das zu ändern beinhaltet das Skript einige "Converter". In diesem Fall auf
die Rohdaten der QNAP abgestimmt. Der Converter "Capacity" wandelt MB/GB/TB
(Megabyte, Gigabyte, Terrabyte)-Strings in Megabyte Zahlen um.
Aus "3.96 TB" werden "3960000".
Derzeit verfügbare Converter:
CapacityMB (Speichergrößen in Megabyte als Float)
CapacityGB(Speichergrößen in Megabyte als Float)
CapacityTB (Speichergrößen in Megabyte als Float)
Temperature (Celsius Temperatur als Integer)
FanSpeed (RPM als Integer)
SmartStatus (S.M.A.R.T Informationen der HDD, Ergebnis ist Boolean => gut / schlecht)
**/
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.12.0", "ModelName");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.2.0", "SystemTotalMem", "CapacityMB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.3.0", "SystemFreeMem", "CapacityMB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.4.1", "SysVolumeTotalSize", "CapacityGB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.17.1.5.1", "SysVolumeFreeSize", "CapacityGB");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.4.0", "SystemUptime");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.5.0", "CPU-Temperature", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.6.0", "System-Temperature", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.15.1.3.1", "System-FanSpeed", "FanSpeed");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.1", "HDTemperature1", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.2", "HDTemperature2", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.3", "HDTemperature3", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.3.4", "HDTemperature4", "Temperature");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.1", "HDSmartInfo1", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.2", "HDSmartInfo2", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.3", "HDSmartInfo3", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.11.1.7.4", "HDSmartInfo4", "SmartStatus");
$snmp->registerSNMPObj(".1.3.6.1.4.1.24681.1.2.1.0", "CPU usage", "Percent");
// ***** ab hier nichts mehr ändern
$snmp->update();
class SNMP
{
//Objekteigenschaften
protected $host; //SNMP Serveradresse
protected $community; //SNMP Community
protected $binary; //Dateipfad zur ssnmpq.exe
public $debug = false; //Bei true werden Debuginformationen ausgegeben
protected $snmpobj=array(); //array registrierter snmp objekte welche beim server abgefragt werden
//IPS Datentypen
const tBOOL = 0;
const tINT = 1;
const tFLOAT = 2;
const tSTRING = 3;
public function __construct($host, $community, $binary, $debug) {
$this->host = $host;
$this->community = $community;
$this->binary = $binary;
$this->debug = $debug;
//Prüfe ob Variablenprofile existieren und erstelle diese wenn nötig
$this->createVariableProfile("SNMP_Percent", self::tFLOAT, "", " %", 2);
$this->createVariableProfile("SNMP_CapacityMB", self::tFLOAT, "", " MB", 0);
$this->createVariableProfile("SNMP_CapacityGB", self::tFLOAT, "", " GB", 0);
$this->createVariableProfile("SNMP_CapacityTB", self::tFLOAT, "", " TB", 0);
$this->createVariableProfile("SNMP_Temperature", self::tINT, "", " °C", 0);
$this->createVariableProfile("SNMP_FanSpeed", self::tINT, "", " RPM", 0);
if (!IPS_VariableProfileExists("SNMP_SmartStatus")) {
$this->createVariableProfile("SNMP_SmartStatus", self::tBOOL, "", "", 0);
IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 1, "Gut", "", 0x00FF04);
IPS_SetVariableProfileAssociation("SNMP_SmartStatus", 0, "Defekt", "", 0xFF0000);
}
}
private function createVariableProfile($name, $type, $pre, $suff, $digits) {
if (!IPS_VariableProfileExists($name)) {
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "INFO - VariablenProfil ".$name." existiert nicht und wird angelegt.");
IPS_CreateVariableProfile($name, $type);
IPS_SetVariableProfileDigits($name, $digits);
IPS_SetVariableProfileText($name, $pre, $suff);
}
}
public function registerSNMPObj($oid, $desc, $convertType = "none") {
//prüfe auf doppelte Einträge beim Registrieren neuer SNMP Objekte
foreach($this->snmpobj as $obj) {
if ($desc==$obj->desc) {
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "ERROR - registerSNMPObj: Variable description ".$desc." already exists, it must be unique!");
exit;
}
if ($oid==$obj->OID) {
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "ERROR - registerSNMPObj: Variable OID ".$oid." already exists, it must be unique!");
exit;
}
}
//prüfe ob IPS Variablen für SNMP Objekt existiert (Variablenname entspricht description)
$parentID = IPS_GetParent($_IPS['SELF']); // übergeordnete Kategorie als Basis
// $parentID = $_IPS['SELF'];
$ips_var = @IPS_GetVariableIDByName($desc, $parentID);
if ($ips_var == false) {
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Variable ".$desc." not found - create IPSVariable");
if ($convertType == "none")
$type = $this->getSNMPType($oid);
if ($convertType == "CapacityMB" || $convertType == "CapacityGB" || $convertType == "CapacityTB" || $convertType == "Percent")
$type = self::tFLOAT;
if ($convertType == "Temperature")
$type = self::tINT;
if ($convertType == "FanSpeed")
$type = self::tINT;
if ($convertType == "SmartStatus")
$type = self::tBOOL;
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Type of OID ".$oid." is ".$type);
$ips_var = IPS_CreateVariable($type);
IPS_SetName($ips_var, $desc);
IPS_SetParent($ips_var, $parentID);
//Verknüpfe Variablenprofil mit neu erstellter Variable
if ($convertType == "CapacityMB")
IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityMB");
if ($convertType == "CapacityGB")
IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityGB");
if ($convertType == "CapacityTB")
IPS_SetVariableCustomProfile($ips_var, "SNMP_CapacityTB");
if ($convertType == "Temperature")
IPS_SetVariableCustomProfile($ips_var, "SNMP_Temperature");
if ($convertType == "FanSpeed")
IPS_SetVariableCustomProfile($ips_var, "SNMP_FanSpeed");
if ($convertType == "SmartStatus")
IPS_SetVariableCustomProfile($ips_var, "SNMP_SmartStatus");
if ($convertType == "Percent")
IPS_SetVariableCustomProfile($ips_var, "SNMP_Percent");
}
$count = count($this->snmpobj);
array_push($this->snmpobj, new SNMPObj($oid, $desc, $convertType, $ips_var));
$count = count($this->snmpobj);
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "New SNMPObj registered, now monitoring ".$count." snmp variables");
}
//startet eine Abfrage am SNMP Server und aktualisiert die IPS-Variablen der registrierten
//SNMP Objekte
public function update() {
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Updating ".count($this->snmpobj)." variable(s)");
foreach ($this->snmpobj as $obj) {
// $oid = ltrim($obj->OID,".");
$oid = $obj->OID;
$exec_param =" -v1 -O vq -c ".$this->community." ".$this->host." ". $oid ."";
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Execute SNMP-Query: ".$this->binary.$exec_param);
$obj->value = str_replace('"', '', trim(system($this->binary.$exec_param)));
if ($this->debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Result of ".$obj->desc.": ".$obj->value);
if ($obj->convertType == "Percent") $obj->value = $this->convertPercent($obj->value, "%");
if ($obj->convertType == "CapacityMB") $obj->value = $this->convertCapacity($obj->value, "MB");
if ($obj->convertType == "CapacityGB") $obj->value = $this->convertCapacity($obj->value, "GB");
if ($obj->convertType == "CapacityTB") $obj->value = $this->convertCapacity($obj->value, "TB");
if ($obj->convertType == "Temperature") $obj->value = $this->convertTemperature($obj->value);
if ($obj->convertType == "FanSpeed") $obj->value = $this->convertFanSpeed($obj->value);
if ($obj->convertType == "SmartStatus") $obj->value = $this->convertSmartStatus($obj->value);
SetValue($obj->ips_var, $obj->value);
}
}
//prüfe um welchen SNMP Rückgabetyp es sich handelt
//returns 3 => String / 1 => Integer / 2 => Float
private function getSNMPType($oid) {
$oid = ltrim($oid,".");
$exec_param =" -v1 -O v -c ".$this->community." ".$this->host." ". $oid;
$result = system($this->binary.$exec_param);
$pos_start = stripos ($result, " = ");
$pos_end = stripos ($result, ': "');
$type = substr($result, $pos_start, $pos_end - $pos_start);
switch($type) {
case "STRING":
return self::tSTRING;
case "Integer":
return self::tINT;
case "Timeticks":
return self::tFLOAT;
default:
return self::tSTRING;
}
}
//returns -1 on error
private function convertCapacity($input, $unit) {
$pos = stripos($input, "MB");
if ($pos === false) {
$pos = stripos($input, "GB");
if ($pos === false) {
$pos = stripos($input, "TB");
if ($pos === false) {
return -1;
} else {
$funit = "TB";
}
} else {
$funit = "GB";
}
} else {
$funit = "MB";
}
$result = substr($input, 0, $pos);
$result = trim($result);
switch ($funit) {
case "GB":
$result = $result*1000;
break;
case "TB":
$result = $result*1000*1000;
break;
}
switch($unit) {
case "MB":
return round($result);
case "GB":
return round($result / 1000);
case "TB";
return round($result / 1000000);
}
}
//returns -1 on error
private function convertTemperature($input) {
$pos = stripos($input, "C");
if ($pos === false) {
$result = -1;
} else {
$result = substr($input, 0, $pos);
$result = round(trim($result));
}
return $result;
}
private function convertPercent($input) {
$pos = stripos($input, "%");
if ($pos === false) {
$result = -1;
} else {
$result = substr($input, 0, $pos);
$result = trim($result);
}
return $result;
}
//returns -1 on error
private function convertFanSpeed($input) {
$pos = stripos($input, "RPM");
if ($pos === false) {
$result = -1;
} else {
$result = substr($input, 0, $pos);
$result = round(trim($result));
}
return $result;
}
private function convertSmartStatus($input) {
$pos = stripos($input, "GOOD") + stripos($input, "Normal");
if ($pos === false) {
return false;
} else {
return true;
}
}
}
class SNMPObj
{
//Objekteigenschaften
public $OID; //SNMP Message ID
public $desc; //Beschreibung
public $value; //Wert
public $convertType; //Typ-Converter
public $ips_var; //ID der IPS-Variable welche den SNMP Wert speichert
public function __construct($OID, $desc, $convertType, $ips_var) {
$this->OID = $OID;
$this->desc = $desc;
$this->convertType = $convertType;
$this->ips_var = $ips_var;
}
}
?>
… folgende Fehlermeldung:
Notice: A non well formed numeric value encountered in C:\IP-Symcon\scripts\57473.ips.php on line 34
Fatal error: Uncaught exception 'Exception' with message 'Unknown SNMP protocol version' in C:\IP-Symcon\scripts\57473.ips.php:34
Stack trace:
#0 C:\IP-Symcon\scripts\57473.ips.php(34): SNMP->__construct('172.168.3.34', 'public', 'C:\\IP-Symcon\\au...', 0)
#1 {main}
thrown in C:\IP-Symcon\scripts\57473.ips.php on line 34
Abort Processing during Fatal-Error: Uncaught exception 'Exception' with message 'Unknown SNMP protocol version' in C:\IP-Symcon\scripts\57473.ips.php:34
Stack trace:
#0 C:\IP-Symcon\scripts\57473.ips.php(34): SNMP->__construct('172.168.3.34', 'public', 'C:\\IP-Symcon\\au...', 0)
#1 {main}
thrown
Error in Script C:\IP-Symcon\scripts\57473.ips.php on Line 34
Die SnmpGet.exe habe ich von https://www.snmpsoft.com/cmd-tools/snmp-get/