Beispiel #1
0
        public static void Check(CredentialsSnmp credentials)
        {
            // Populate the List of OID's to Get
            var asnItems = new Dictionary <string, SnmpAsnItem>
            {
                { BaseOid + "1.1.0", new SnmpAsnItem("Model") },
                { BaseOid + "1.2.0", new SnmpAsnItem("Serial Number") },
                { BaseOid + "1.5.0", new SnmpAsnItem("Software Version") },
                { BaseOid + "2.1.0", new SnmpAsnItem("Battery Status") },
                { BaseOid + "2.3.0", new SnmpAsnItem("Estimated Runtime") },
                { BaseOid + "6.1.0", new SnmpAsnItem("Alarms Present") },
                { BaseOid + "7.1.0", new SnmpAsnItem("UPS Status") },
                { BaseOid + "10.1.0", new SnmpAsnItem("Temperature") },
                { BaseOid + "10.2.0", new SnmpAsnItem("Humidity") }
            };

            var asnItemsLookup = new Dictionary <string, Vb>();

            // SNMP Query
            var snmpCommunity = new OctetString(credentials.Community);
            var agentParams   = new AgentParameters(snmpCommunity)
            {
                Version = SnmpVersion.Ver2
            };

            var agent  = new IpAddress(credentials.Host);
            var target = new UdpTarget((IPAddress)agent, Port, 2000, 1);

            var pdu = new Pdu(PduType.Get);

            foreach (var item in asnItems)
            {
                pdu.VbList.Add(item.Key);
            }

            var result = new SnmpV2Packet();

            try
            {
                result = (SnmpV2Packet)target.Request(pdu, agentParams);
            }
            catch (Exception ex)
            {
                if (ex.Message == "Request has reached maximum retries.")
                {
                    Error.WriteOutput("SNMP Request to " + credentials.Host + " with community " + credentials.Community + " has exceeded the maximum number of retries.");
                    return;
                }
            }

            if (result != null)
            {
                // Populate Results
                foreach (var item in result.Pdu.VbList)
                {
                    if (asnItems.ContainsKey(item.Oid.ToString()))
                    {
                        asnItems[item.Oid.ToString()].Vb = item;
                    }
                }

                // Build Reverse Lookup Dictionary
                foreach (var item in asnItems)
                {
                    asnItemsLookup.Add(item.Value.Description, item.Value.Vb);
                }

                var output = new Result();
                var model  = asnItemsLookup["Model"].Value.ToString();

                var message = model;
                message += " SN " + asnItemsLookup["Serial Number"].Value;
                message += " (SW v" + asnItemsLookup["Software Version"].Value + ")";

                Channel channel;

                // Humidity
                var tempStr = asnItemsLookup["Humidity"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    if (tempStr != "Null" && tempStr != "SNMP No-Such-Instance")
                    {
                        var humidity = Convert.ToInt32(tempStr) / 10;
                        channel = new Channel
                        {
                            Description     = "Humidity",
                            Unit            = Unit.Percent,
                            Value           = humidity.ToString(),
                            LimitMinError   = "5",
                            LimitMinWarning = "10",
                            LimitMaxWarning = "90",
                            LimitMaxError   = "95",
                            LimitMode       = "1"
                        };
                        output.Channels.Add(channel);
                    }
                }

                // Temperature
                tempStr = asnItemsLookup["Temperature"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    if (tempStr != "Null" && tempStr != "SNMP No-Such-Instance")
                    {
                        var temp = Convert.ToInt32(tempStr) / 10;
                        channel = new Channel
                        {
                            Description     = "Temperature",
                            Unit            = Unit.Temperature,
                            Value           = temp.ToString(),
                            LimitMinError   = "10",
                            LimitMinWarning = "15",
                            LimitMaxWarning = "50",
                            LimitMaxError   = "55",
                            LimitMode       = "1"
                        };
                        output.Channels.Add(channel);
                    }
                }

                // UPS Status
                tempStr = asnItemsLookup["UPS Status"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    channel = new Channel
                    {
                        Description = "UPS Status",
                        Unit        = Unit.Custom,
                        Value       = tempStr
                    };

                    switch (Convert.ToInt32(tempStr))
                    {
                    case 1:
                        channel.Warning = "1";
                        message        += " Standby On";
                        output.Error    = true;
                        break;

                    case 2:
                        channel.Warning = "1";
                        message        += " Standby Off";
                        output.Error    = true;
                        break;

                    case 3:
                        message += " Eco Mode";
                        break;

                    case 4:
                        break;

                    case 5:
                        channel.Warning = "1";
                        message        += " Alarm Reset";
                        break;

                    case 6:
                        channel.Warning = "1";
                        message        += " On Bypass";
                        break;

                    case 7:
                        channel.Warning = "1";
                        message        += " On Inverter";
                        break;

                    default:
                        channel.Warning = "1";
                        message        += " Unknown Status";
                        output.Error    = true;
                        break;
                    }

                    output.Channels.Add(channel);
                }

                // Battery Status
                tempStr = asnItemsLookup["Battery Status"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    channel = new Channel
                    {
                        Description = "Battery Status",
                        Unit        = Unit.Custom,
                        Value       = tempStr
                    };

                    switch (Convert.ToInt32(tempStr))
                    {
                    case 2:
                        break;

                    case 3:
                        break;

                    case 4:
                        message        += " [Battery Test]";
                        channel.Warning = "1";
                        break;

                    case 5:
                        message        += " [Battery Discharging]";
                        channel.Warning = "1";
                        break;

                    case 6:
                        message        += " [Battery Low]";
                        channel.Warning = "1";
                        output.Error    = true;
                        break;

                    case 7:
                        message        += " [Battery Depleted]";
                        channel.Warning = "1";
                        output.Error    = true;
                        break;

                    case 8:
                        message        += " [Battery Failure]";
                        channel.Warning = "1";
                        output.Error    = true;
                        break;

                    case 9:
                        message        += " [Battery Disconnected]";
                        channel.Warning = "1";
                        output.Error    = true;
                        break;

                    default:
                        message        += " [Battery Status Unknown]";
                        channel.Warning = "1";
                        break;
                    }

                    output.Channels.Add(channel);
                }

                // Estimated Runtime
                tempStr = asnItemsLookup["Estimated Runtime"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    if (tempStr != "Null" && tempStr != "SNMP No-Such-Instance")
                    {
                        var minutes = Convert.ToInt32(tempStr);
                        if (minutes > 120)
                        {
                            minutes = 120;
                        }
                        channel = new Channel
                        {
                            Description = "Estimated Runtime",
                            Unit        = Unit.Count,
                            CustomUnit  = "minutes",
                            Value       = minutes.ToString()
                        };
                        if (minutes < 15)
                        {
                            output.Error    = true;
                            channel.Warning = "1";
                            message        += " < 15mins Runtime";
                        }
                        output.Channels.Add(channel);
                    }
                }

                // Alarms Present
                var alarmsPresent = asnItemsLookup["Alarms Present"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    var alarmsPresentWarning = "0";
                    if (alarmsPresent != "0")
                    {
                        alarmsPresentWarning = "1";
                    }
                    channel = new Channel
                    {
                        Description = "# Alarms Present",
                        Unit        = Unit.Count,
                        Value       = alarmsPresent,
                        Warning     = alarmsPresentWarning
                    };
                    output.Channels.Add(channel);
                }

                output.Text = message;
                output.WriteOutput();
            }
            else
            {
                Error.WriteOutput("No Results Received from " + credentials.Host + " using community " + credentials.Community);
            }
        }
Beispiel #2
0
        public static void Check(CredentialsSnmp credentials)
        {
            // Populate the List of OID's to Get
            var asnItems = new Dictionary <string, SnmpAsnItem>
            {
                { BaseOid + "1.2.0", new SnmpAsnItem("Model") },
                { BaseOid + "1.3.0", new SnmpAsnItem("Firmware Version") },
                { BaseOid + "1.4.0", new SnmpAsnItem("Software Version") },
                { BaseOid + "1.5.0", new SnmpAsnItem("Serial Number") },
                { BaseOid + "6.1.0", new SnmpAsnItem("Alarms Present") },
                { BaseOid + "7.3.0", new SnmpAsnItem("Test Result Summary") },
                { BaseOid + "7.5.0", new SnmpAsnItem("Last Test Up Time") },

                { "1.3.6.1.2.1.1.3.0", new SnmpAsnItem("Up Time") },
                { "1.3.6.1.4.1.534.1.6.5.0", new SnmpAsnItem("Temperature") },
                { "1.3.6.1.4.1.534.1.6.6.0", new SnmpAsnItem("Humidity") }
            };

            var asnItemsLookup = new Dictionary <string, Vb>();

            // SNMP Query
            var snmpCommunity = new OctetString(credentials.Community);
            var agentParams   = new AgentParameters(snmpCommunity)
            {
                Version = SnmpVersion.Ver2
            };

            var agent  = new IpAddress(credentials.Host);
            var target = new UdpTarget((IPAddress)agent, Port, 2000, 1);

            var pdu = new Pdu(PduType.Get);

            foreach (var item in asnItems)
            {
                pdu.VbList.Add(item.Key);
            }

            var result = new SnmpV2Packet();

            try
            {
                result = (SnmpV2Packet)target.Request(pdu, agentParams);
            }
            catch (Exception ex)
            {
                if (ex.Message == "Request has reached maximum retries.")
                {
                    Error.WriteOutput("SNMP Request to " + credentials.Host + " with community " + credentials.Community + " has exceeded the maximum number of retries.");
                    return;
                }
            }

            if (result != null)
            {
                // Populate Results
                foreach (var item in result.Pdu.VbList)
                {
                    if (asnItems.ContainsKey(item.Oid.ToString()))
                    {
                        asnItems[item.Oid.ToString()].Vb = item;
                    }
                }

                // Build Reverse Lookup Dictionary
                foreach (var item in asnItems)
                {
                    asnItemsLookup.Add(item.Value.Description, item.Value.Vb);
                }

                var output = new Result();
                var model  = asnItemsLookup["Model"].Value.ToString();

                var message = model;
                message += " SN " + asnItemsLookup["Serial Number"].Value;
                message += " (SW v" + asnItemsLookup["Software Version"].Value;
                message += " / FW v" + asnItemsLookup["Firmware Version"].Value + ")";

                var globalMessage = "";

                Channel channel;

                // Humidity
                // TODO - This is untested code
                var tempStr = asnItemsLookup["Humidity"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    if (tempStr != "Null" && tempStr != "SNMP No-Such-Instance")
                    {
                        channel = new Channel
                        {
                            Description = "Humidity",
                            Unit        = Unit.Percent,
                            Value       = asnItemsLookup["Humidity"].Value.ToString()
                        };
                        output.Channels.Add(channel);
                    }
                }

                // Temperature
                // TODO - This is untested code
                tempStr = asnItemsLookup["Temperature"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    if (tempStr != "Null" && tempStr != "SNMP No-Such-Instance")
                    {
                        var temp = Convert.ToInt32(tempStr); // / 10;
                        //temp = (temp - 32) * 5 / 9; // (°F − 32) × 5/9 = °C
                        channel = new Channel
                        {
                            Description = "Temperature",
                            Unit        = Unit.Temperature,
                            Value       = temp.ToString()
                        };
                        output.Channels.Add(channel);
                    }
                }

                // Alarms Present
                var alarmsPresent = asnItemsLookup["Alarms Present"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    var alarmsPresentWarning = "0";
                    if (alarmsPresent != "0")
                    {
                        alarmsPresentWarning = "1";
                    }
                    channel = new Channel
                    {
                        Description = "# Alarms Present",
                        Unit        = Unit.Count,
                        Value       = alarmsPresent,
                        Warning     = alarmsPresentWarning
                    };
                    output.Channels.Add(channel);
                }

                // Test Results Summary
                var testResult        = asnItemsLookup["Test Result Summary"].Value.ToString().Trim();
                var testResultWarning = "0";
                switch (testResult)
                {
                case "1":
                    testResult = "donePass";
                    break;

                case "2":
                    testResult        = "doneWarning";
                    globalMessage     = "[Test Warning]";
                    testResultWarning = "1";
                    break;

                case "3":
                    testResult        = "doneError";
                    globalMessage     = "[Test Error]";
                    testResultWarning = "1";
                    break;

                case "4":
                    testResult        = "aborted";
                    globalMessage     = "[Test Aborted]";
                    testResultWarning = "1";
                    break;

                case "5":
                    testResult    = "inProgress";
                    globalMessage = "[Test In Progress]";
                    break;

                case "6":
                    testResult        = "noTestsInitiated";
                    globalMessage     = "[Test Never Initiated]";
                    testResultWarning = "1";
                    break;

                default:
                    testResult        = "unknown";
                    globalMessage     = "[Test Result Unknown]";
                    testResultWarning = "1";
                    break;
                }
                channel = new Channel
                {
                    Description = "UPS Test Result",
                    Unit        = Unit.Custom,
                    CustomUnit  = "Result",
                    Value       = testResult,
                    Warning     = testResultWarning,
                };
                output.Channels.Add(channel);

                // Last Test Date
                var timeSinceBoot         = (TimeTicks)asnItemsLookup["Up Time"].Value;
                var timeSinceTest         = (TimeTicks)asnItemsLookup["Last Test Up Time"].Value;
                var relativeTimeSinceTest = timeSinceBoot.Milliseconds - timeSinceTest.Milliseconds;
                var lastTestDate          = DateTime.Now - TimeSpan.FromMilliseconds(relativeTimeSinceTest);

                var daysSinceBatteryTest = Convert.ToInt16((DateTime.Now - lastTestDate).TotalDays);
                channel = new Channel
                {
                    Description         = "Days Since UPS Test",
                    Unit                = Unit.Custom,
                    CustomUnit          = "Days",
                    LimitErrorMessage   = "UPS Test Overdue",
                    LimitWarningMessage = "UPS Test Required",
                    LimitMaxWarning     = TestWarningDays.ToString(),
                    LimitMaxError       = TestErrorDays.ToString(),
                    LimitMode           = "1",
                    Value               = daysSinceBatteryTest.ToString()
                };
                output.Channels.Add(channel);

                if (!string.IsNullOrEmpty(globalMessage))
                {
                    message += " " + globalMessage;
                }
                output.Text = message;
                output.WriteOutput();
            }
            else
            {
                Error.WriteOutput("No Results Received from " + credentials.Host + " using community " + credentials.Community);
            }
        }
Beispiel #3
0
        public static void Check(CredentialsSnmp credentials)
        {
            // Populate the List of OID's to Get
            var asnItems = new Dictionary <string, SnmpAsnItem>
            {
                { BaseOid + "1.1.2.4.0", new SnmpAsnItem("Software Version") },
                { BaseOid + "1.1.2.1.0", new SnmpAsnItem("Firmware Version") },
                { BaseOid + "1.1.1.1.0", new SnmpAsnItem("Model") },
                { BaseOid + "1.2.1.3.0", new SnmpAsnItem("Battery Replacement Date") },
                { BaseOid + "1.7.2.4.0", new SnmpAsnItem("Battery Test Date") },
                { BaseOid + "1.7.2.3.0", new SnmpAsnItem("Battery Test Result") },
                { BaseOid + "1.7.2.8.0", new SnmpAsnItem("Battery Calibration Date") },
                { BaseOid + "1.7.2.7.0", new SnmpAsnItem("Battery Calibration Result") },
                { BaseOid + "4.3.1.0", new SnmpAsnItem("Humidity") },
                { BaseOid + "4.2.1.0", new SnmpAsnItem("Temperature") },
                { BaseOid + "1.1.2.3.0", new SnmpAsnItem("Serial Number") }
            };

            var asnItemsLookup = new Dictionary <string, Vb>();

            // SNMP Query
            var snmpCommunity = new OctetString(credentials.Community);
            var agentParams   = new AgentParameters(snmpCommunity)
            {
                Version = SnmpVersion.Ver1
            };

            var agent  = new IpAddress(credentials.Host);
            var target = new UdpTarget((IPAddress)agent, Port, 2000, 1);

            var pdu = new Pdu(PduType.Get);

            foreach (var item in asnItems)
            {
                pdu.VbList.Add(item.Key);
            }

            var result = new SnmpV1Packet();

            try
            {
                result = (SnmpV1Packet)target.Request(pdu, agentParams);
            }
            catch (Exception ex)
            {
                if (ex.Message == "Request has reached maximum retries.")
                {
                    Error.WriteOutput("SNMP Request to " + credentials.Host + " with community " + credentials.Community + " has exceeded the maximum number of retries.");
                    return;
                }
            }

            if (result != null)
            {
                // Populate Results
                foreach (var item in result.Pdu.VbList)
                {
                    if (asnItems.ContainsKey(item.Oid.ToString()))
                    {
                        asnItems[item.Oid.ToString()].Vb = item;
                    }
                }

                // Build Reverse Lookup Dictionary
                foreach (var item in asnItems)
                {
                    asnItemsLookup.Add(item.Value.Description, item.Value.Vb);
                }

                var output = new Result();
                var model  = asnItemsLookup["Model"].Value.ToString();

                var message = "CyberPower " + model;
                if (!string.IsNullOrEmpty(asnItemsLookup["Serial Number"].Value.ToString()))
                {
                    message += " SN " + asnItemsLookup["Serial Number"].Value;
                }
                message += " (SW v" + asnItemsLookup["Software Version"].Value;
                message += " / FW v" + asnItemsLookup["Firmware Version"].Value + ")";

                Channel channel;

                // Humidity
                var tempStr = asnItemsLookup["Humidity"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    if (tempStr != "Null")
                    {
                        channel = new Channel
                        {
                            Description = "Humidity",
                            Unit        = Unit.Percent,
                            Value       = asnItemsLookup["Humidity"].Value.ToString()
                        };
                        output.Channels.Add(channel);
                    }
                }

                // Temperature
                tempStr = asnItemsLookup["Temperature"].Value.ToString();
                if (!string.IsNullOrEmpty(tempStr))
                {
                    if (tempStr != "Null")
                    {
                        var temp = Convert.ToInt32(tempStr) / 10;
                        temp    = (temp - 32) * 5 / 9; // (°F − 32) × 5/9 = °C
                        channel = new Channel
                        {
                            Description = "Temperature",
                            Unit        = Unit.Temperature,
                            Value       = temp.ToString()
                        };
                        output.Channels.Add(channel);
                    }
                }

                // Battery Test Result
                var batteryTestResult  = asnItemsLookup["Battery Test Result"].Value.ToString().Trim();
                var batteryTestWarning = "0";
                if (batteryTestResult != "1")
                {
                    batteryTestResult  = "FAILURE";
                    batteryTestWarning = "1";
                }
                channel = new Channel
                {
                    Description = "Battery Test Result",
                    Unit        = Unit.Custom,
                    CustomUnit  = "Result",
                    Value       = batteryTestResult,
                    Warning     = batteryTestWarning
                };
                output.Channels.Add(channel);

                // Battery Calibration Result
                var batteryCalibrationResult  = asnItemsLookup["Battery Calibration Result"].Value.ToString().Trim();
                var batteryCalibrationWarning = "0";
                if (batteryCalibrationResult != "1")
                {
                    batteryCalibrationResult  = "FAILURE";
                    batteryCalibrationWarning = "1";
                }
                channel = new Channel
                {
                    Description = "Battery Calibration Result",
                    Unit        = Unit.Custom,
                    CustomUnit  = "Result",
                    Value       = batteryCalibrationResult,
                    Warning     = batteryCalibrationWarning
                };
                output.Channels.Add(channel);

                // Battery Test Date
                DateTime batteryTestDate;
                var      batteryTestDateStr = CheckDateTimeFormat(asnItemsLookup["Battery Test Date"].Value.ToString(), model);
                if (string.IsNullOrEmpty(batteryTestDateStr) || batteryTestDateStr.ToLower() == "null")
                {
                    batteryTestDate = new DateTime(2010, 01, 01);
                }
#if OLDCODE
                else
                {
                    if (model == "OL1500ERTXL2U")
                    {
                        batteryTestDate = DateTime.ParseExact(batteryTestDateStr, "MM/dd/yyyy", CultureInfo.InvariantCulture);
                    }
                    else
                    {
                        batteryTestDate = DateTime.Parse(batteryTestDateStr);
                    }
                }
#else
                else
                {
                    batteryTestDate = DateTime.Parse(batteryTestDateStr);
                }
#endif
                var daysSinceBatteryTest = Convert.ToInt16((DateTime.Now - batteryTestDate).TotalDays);
                channel = new Channel
                {
                    Description         = "Days Since Battery Test",
                    Unit                = Unit.Custom,
                    CustomUnit          = "Days",
                    LimitErrorMessage   = "Battery Test Overdue",
                    LimitWarningMessage = "Battery Test Required",
                    LimitMaxWarning     = BatteryTestWarningDays.ToString(),
                    LimitMaxError       = BatteryTestErrorDays.ToString(),
                    LimitMode           = "1",
                    Value               = daysSinceBatteryTest.ToString()
                };
                output.Channels.Add(channel);

                // Battery Calibration Date
                DateTime batteryCalibrationDate;
                var      batteryCalibrationCalibration = CheckDateTimeFormat(asnItemsLookup["Battery Calibration Date"].Value.ToString(), model);
                if (string.IsNullOrEmpty(batteryCalibrationCalibration) || batteryCalibrationCalibration.ToLower() == "null")
                {
                    batteryCalibrationDate = new DateTime(2010, 01, 01);
                }
                else
                {
                    batteryCalibrationDate = DateTime.Parse(batteryCalibrationCalibration);
                }
                var daysSinceBatteryCalibration = Convert.ToInt16((DateTime.Now - batteryCalibrationDate).TotalDays);
                channel = new Channel
                {
                    Description         = "Days Since Battery Calibration",
                    Unit                = Unit.Custom,
                    CustomUnit          = "Days",
                    LimitErrorMessage   = "Battery Calibration Overdue",
                    LimitWarningMessage = "Battery Calibration Required",
                    LimitMaxWarning     = BatteryCalibrationWarningDays.ToString(),
                    LimitMaxError       = BatteryCalibrationErrorDays.ToString(),
                    LimitMode           = "1",
                    Value               = daysSinceBatteryCalibration.ToString()
                };
                output.Channels.Add(channel);

                output.Text = message;
                output.WriteOutput();
            }