mirror of
https://github.com/gregtwallace/apc-p15-tool.git
synced 2025-05-14 19:08:57 +00:00
UPS failes to use the required `+` when in the GMT timezone. Account for that. --------- Co-authored-by: Greg T. Wallace <greg@gregtwallace.com>
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
package apcssh
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// GetTime sends the APC `system` command and then attempts to parse the
|
|
// response to determine the UPS current date/time.
|
|
func (cli *Client) GetTime() (time.Time, error) {
|
|
result, err := cli.cmd("date")
|
|
if err != nil {
|
|
return time.Time{}, fmt.Errorf("apcssh: failed to get time (%s)", err)
|
|
} else if !strings.EqualFold(result.code, "e000") {
|
|
return time.Time{}, fmt.Errorf("apcssh: failed to get time (%s: %s)", result.code, result.codeText)
|
|
}
|
|
|
|
// capture each portion of the date information
|
|
regex := regexp.MustCompile(`Date:\s*(\S*)\s*[\r\n]Time:\s*(\S*)\s*[\r\n]Format:\s*(\S*)\s*[\r\n]Time Zone:\s*(\S*)\s*[\r\n]?`)
|
|
datePieces := regex.FindStringSubmatch(result.resultText)
|
|
if len(datePieces) != 5 {
|
|
return time.Time{}, fmt.Errorf("apcssh: failed to get time (length of datetime value pieces was %d (expected: 5))", len(datePieces))
|
|
}
|
|
dateVal := datePieces[1]
|
|
timeVal := datePieces[2]
|
|
formatUPSVal := datePieces[3]
|
|
timeZoneVal := datePieces[4]
|
|
|
|
// GMT time requires + prefix
|
|
// APC UPS fails to use the required +, so add it
|
|
if timeZoneVal == "00:00" {
|
|
timeZoneVal = "+" + timeZoneVal
|
|
}
|
|
|
|
// known APC UPS format strings
|
|
dateFormatVal := ""
|
|
switch formatUPSVal {
|
|
case "mm/dd/yyyy":
|
|
dateFormatVal = "01/02/2006"
|
|
case "dd.mm.yyyy":
|
|
dateFormatVal = "02.01.2006"
|
|
case "mmm-dd-yy":
|
|
dateFormatVal = "Jan-02-06"
|
|
case "dd-mmm-yy":
|
|
dateFormatVal = "02-Jan-06"
|
|
case "yyyy-mm-dd":
|
|
dateFormatVal = "2006-01-02"
|
|
|
|
default:
|
|
return time.Time{}, fmt.Errorf("apcssh: failed to get time (ups returned unknown format string (%s)", formatUPSVal)
|
|
}
|
|
|
|
// convert to time.Time
|
|
t, err := time.Parse(dateFormatVal+" 15:04:05 -07:00", dateVal+" "+timeVal+" "+timeZoneVal)
|
|
if err != nil {
|
|
return time.Time{}, fmt.Errorf("apcssh: failed to get time (time parse failed: %s)", err)
|
|
}
|
|
|
|
return t, nil
|
|
}
|