183 lines
4.4 KiB
Go
183 lines
4.4 KiB
Go
package ups
|
|
|
|
import(
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/alouca/gosnmp"
|
|
)
|
|
|
|
type BatteryStatus int
|
|
const (
|
|
BatteryStatusUnknown BatteryStatus = 1
|
|
BatteryStatusNormal BatteryStatus = 2
|
|
BatteryStatusLow BatteryStatus = 3
|
|
BatteryStatusFault BatteryStatus = 4
|
|
)
|
|
|
|
func (st BatteryStatus) String() string {
|
|
str := "Invalid"
|
|
switch(st) {
|
|
case BatteryStatusUnknown:
|
|
str = "Unknown"
|
|
case BatteryStatusNormal:
|
|
str = "Normal"
|
|
case BatteryStatusLow:
|
|
str = "Low"
|
|
case BatteryStatusFault:
|
|
str = "Fault"
|
|
}
|
|
|
|
return str
|
|
}
|
|
|
|
type BatteryReplaceIndicator int
|
|
const (
|
|
BatteryReplaceIndicatorOK BatteryReplaceIndicator = 1
|
|
BatteryReplaceIndicatorReplace BatteryReplaceIndicator = 2
|
|
)
|
|
|
|
func (st BatteryReplaceIndicator) String() string {
|
|
str := "Invalid"
|
|
switch(st) {
|
|
case BatteryReplaceIndicatorOK:
|
|
str = "Ok"
|
|
case BatteryReplaceIndicatorReplace:
|
|
str = "Replace"
|
|
}
|
|
|
|
return str
|
|
}
|
|
|
|
type OutputStatus int
|
|
const (
|
|
OutputStatusUnknown OutputStatus = 1
|
|
OutputStatusOnLine OutputStatus = 2
|
|
OutputStatusOnBattery OutputStatus = 3
|
|
OutputStatusOnSmartBoost OutputStatus = 4
|
|
OutputStatusTimedSleeping OutputStatus = 5
|
|
OutputStatusSoftwareBypass OutputStatus = 6
|
|
OutputStatusOff OutputStatus = 7
|
|
OutputStatusRebooting OutputStatus = 8
|
|
OutputStatusSwitchedBypass OutputStatus = 9
|
|
OutputStatusHardwareFailureBypass OutputStatus = 10
|
|
OutputStatusSleepingUntilPowerReturn OutputStatus = 11
|
|
OutputStatusOnSmartTrim OutputStatus = 12
|
|
)
|
|
|
|
func (st OutputStatus) String() string {
|
|
str := "Invalid"
|
|
switch(st) {
|
|
case OutputStatusUnknown:
|
|
str = "Unknown"
|
|
case OutputStatusOnLine:
|
|
str = "On Line"
|
|
case OutputStatusOnBattery:
|
|
str = "On Battery"
|
|
case OutputStatusOnSmartBoost:
|
|
str = "On Smart Boost"
|
|
case OutputStatusTimedSleeping:
|
|
str = "Timed Sleeping"
|
|
case OutputStatusSoftwareBypass:
|
|
str = "Software Bypass"
|
|
case OutputStatusOff:
|
|
str = "Off"
|
|
case OutputStatusRebooting:
|
|
str = "Rebooting"
|
|
case OutputStatusSwitchedBypass:
|
|
str = "Switched Bypass"
|
|
case OutputStatusHardwareFailureBypass:
|
|
str = "Hardware Failure Bypass"
|
|
case OutputStatusSleepingUntilPowerReturn:
|
|
str = "Sleeping Until Power Return"
|
|
case OutputStatusOnSmartTrim:
|
|
str = "On Smart Trim"
|
|
}
|
|
|
|
return str
|
|
}
|
|
|
|
func getRuntime(s *gosnmp.GoSNMP) (* time.Duration, error) {
|
|
resp, err := s.Get("1.3.6.1.4.1.318.1.1.1.2.2.3.0")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(resp.Variables) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
time, _ := time.ParseDuration(fmt.Sprintf("%dm", resp.Variables[0].Value.(int) / 60/ 100))
|
|
return &time, nil
|
|
}
|
|
|
|
func getBatteryStatus(s *gosnmp.GoSNMP) (* BatteryStatus, error) {
|
|
resp, err := s.Get("1.3.6.1.4.1.318.1.1.1.2.1.1.0")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(resp.Variables) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
status := BatteryStatus(resp.Variables[0].Value.(int))
|
|
return &status, nil
|
|
}
|
|
|
|
func getBatteryReplaceIndicator(s *gosnmp.GoSNMP) (* BatteryReplaceIndicator, error) {
|
|
resp, err := s.Get("1.3.6.1.4.1.318.1.1.1.2.2.4.0")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(resp.Variables) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
status := BatteryReplaceIndicator(resp.Variables[0].Value.(int))
|
|
return &status, nil
|
|
}
|
|
|
|
func getOutputStatus(s *gosnmp.GoSNMP) (* OutputStatus, error) {
|
|
resp, err := s.Get("1.3.6.1.4.1.318.1.1.1.4.1.1.0")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(resp.Variables) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
status := OutputStatus(resp.Variables[0].Value.(int))
|
|
return &status, nil
|
|
}
|
|
|
|
type UPS struct {
|
|
Name string
|
|
EstimatedRuntime *time.Duration
|
|
BatteryStatus *BatteryStatus
|
|
BatteryReplaceIndicator *BatteryReplaceIndicator
|
|
OutputStatus *OutputStatus
|
|
}
|
|
|
|
func UPSStatus(name string, community string) *UPS {
|
|
ups := &UPS{
|
|
Name: name,
|
|
EstimatedRuntime: nil,
|
|
BatteryStatus: nil,
|
|
BatteryReplaceIndicator: nil,
|
|
OutputStatus: nil,
|
|
}
|
|
|
|
// Get UPS status
|
|
snmp, _ := gosnmp.NewGoSNMP(name, community, gosnmp.Version1, 2)
|
|
|
|
ups.EstimatedRuntime, _ = getRuntime(snmp)
|
|
ups.BatteryStatus, _ = getBatteryStatus(snmp)
|
|
ups.BatteryReplaceIndicator, _ = getBatteryReplaceIndicator(snmp)
|
|
ups.OutputStatus, _ = getOutputStatus(snmp)
|
|
|
|
return ups
|
|
}
|