2020-02-23 14:35:07 -07:00
|
|
|
package plugins
|
|
|
|
|
|
|
|
import (
|
2024-02-01 10:51:04 -07:00
|
|
|
"io"
|
2020-02-23 14:35:07 -07:00
|
|
|
"net/http"
|
|
|
|
"regexp"
|
2024-02-01 10:51:04 -07:00
|
|
|
"strings"
|
|
|
|
"time"
|
2020-02-23 14:35:07 -07:00
|
|
|
|
|
|
|
"github.com/matrix-org/gomatrix"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Snap responds to OpenBSD snapshot checks
|
|
|
|
type Snap struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
// Descr describes this plugin
|
|
|
|
func (p *Snap) Descr() string {
|
|
|
|
return "checks the current build date of OpenBSD snapshots."
|
|
|
|
}
|
|
|
|
|
|
|
|
// Re returns the federation check matching string
|
|
|
|
func (p *Snap) Re() string {
|
|
|
|
return `(?i)^snap:$`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Match determines if we should call the response for Snap
|
2020-05-13 16:53:31 -06:00
|
|
|
func (p *Snap) Match(_, msg string) bool {
|
2020-02-23 14:35:07 -07:00
|
|
|
re := regexp.MustCompile(p.Re())
|
|
|
|
return re.MatchString(msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetStore we don't need a store here.
|
2020-05-13 16:53:31 -06:00
|
|
|
func (p *Snap) SetStore(_ PluginStore) {}
|
2020-02-23 14:35:07 -07:00
|
|
|
|
2021-04-01 16:15:25 -06:00
|
|
|
// Process does the heavy lifting
|
|
|
|
func (p *Snap) Process(from, post string) string {
|
2024-02-01 10:51:04 -07:00
|
|
|
snapResp, err := http.Get("https://ftp.usa.openbsd.org/pub/OpenBSD/snapshots/amd64/BUILDINFO")
|
2020-02-23 14:35:07 -07:00
|
|
|
if err != nil {
|
2024-02-01 10:51:04 -07:00
|
|
|
return err.Error()
|
2020-02-23 14:35:07 -07:00
|
|
|
}
|
2024-02-01 10:51:04 -07:00
|
|
|
defer snapResp.Body.Close()
|
2020-02-23 14:35:07 -07:00
|
|
|
|
2024-02-01 10:51:04 -07:00
|
|
|
buildBody, err := io.ReadAll(snapResp.Body)
|
2020-02-23 14:35:07 -07:00
|
|
|
if err != nil {
|
2024-02-01 10:51:04 -07:00
|
|
|
return err.Error()
|
2020-02-23 14:35:07 -07:00
|
|
|
}
|
|
|
|
|
2024-02-01 10:51:04 -07:00
|
|
|
str := string(buildBody)
|
|
|
|
parts := strings.Split(str, " - ")
|
|
|
|
if len(parts) != 2 {
|
|
|
|
return "Can't parse BUILDINFO"
|
|
|
|
}
|
|
|
|
|
|
|
|
snapDate, err := time.Parse(time.UnixDate, strings.TrimSpace(parts[1]))
|
|
|
|
if err != nil {
|
|
|
|
return err.Error()
|
|
|
|
}
|
|
|
|
|
|
|
|
pkgResp, err := http.Get("https://ftp3.usa.openbsd.org/pub/OpenBSD/snapshots/packages/amd64/SHA256")
|
|
|
|
if err != nil {
|
|
|
|
return err.Error()
|
|
|
|
}
|
|
|
|
defer pkgResp.Body.Close()
|
|
|
|
|
|
|
|
lm := strings.TrimSpace(pkgResp.Header.Get("last-modified"))
|
|
|
|
if lm == "" {
|
|
|
|
return "Missing last-modified for SHA256"
|
|
|
|
}
|
|
|
|
|
|
|
|
pkgDate, err := time.Parse(time.RFC1123, lm)
|
|
|
|
if lm == "" {
|
|
|
|
return err.Error()
|
|
|
|
}
|
|
|
|
|
|
|
|
if pkgDate.Before(snapDate) {
|
|
|
|
return "🔴: packages are behind snapshots. It is likely not safe to update currently!"
|
|
|
|
}
|
|
|
|
|
|
|
|
return "🟢:' It is safe to update your snapshot and packages!"
|
2021-04-01 16:15:25 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// RespondText to looking up of federation check requests
|
|
|
|
func (p *Snap) RespondText(c *gomatrix.Client, ev *gomatrix.Event, _, _ string) error {
|
|
|
|
return SendText(c, ev.RoomID, p.Process("", ""))
|
2020-02-23 14:35:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Name Snap!
|
|
|
|
func (p *Snap) Name() string {
|
|
|
|
return "Snap"
|
|
|
|
}
|