cosmos-sdk/cosmovisor/scanner.go

43 lines
1.4 KiB
Go

package cosmovisor
import (
"bufio"
"regexp"
)
// Trim off whitespace around the info - match least greedy, grab as much space on both sides
// Defined here: https://github.com/cosmos/cosmos-sdk/blob/release/v0.38.2/x/upgrade/abci.go#L38
// fmt.Sprintf("UPGRADE \"%s\" NEEDED at %s: %s", plan.Name, plan.DueAt(), plan.Info)
// DueAt defined here: https://github.com/cosmos/cosmos-sdk/blob/release/v0.38.2/x/upgrade/internal/types/plan.go#L73-L78
//
// if !p.Time.IsZero() {
// return fmt.Sprintf("time: %s", p.Time.UTC().Format(time.RFC3339))
// }
// return fmt.Sprintf("height: %d", p.Height)
var upgradeRegex = regexp.MustCompile(`UPGRADE "(.*)" NEEDED at ((height): (\d+)|(time): (\S+)):\s+(\S*)`)
// UpgradeInfo is the details from the regexp
type UpgradeInfo struct {
Name string
Info string
}
// WaitForUpdate will listen to the scanner until a line matches upgradeRegexp.
// It returns (info, nil) on a matching line
// It returns (nil, err) if the input stream errored
// It returns (nil, nil) if the input closed without ever matching the regexp
func WaitForUpdate(scanner *bufio.Scanner) (*UpgradeInfo, error) {
for scanner.Scan() {
line := scanner.Text()
if upgradeRegex.MatchString(line) {
subs := upgradeRegex.FindStringSubmatch(line)
info := UpgradeInfo{
Name: subs[1],
Info: subs[7],
}
return &info, nil
}
}
return nil, scanner.Err()
}