49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package updates
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
)
|
|
|
|
// winUpdate is one row of the Windows Update searcher's output, in the shape
|
|
// searchScript emits it.
|
|
type winUpdate struct {
|
|
Title string `json:"title"`
|
|
KB string `json:"kb"`
|
|
}
|
|
|
|
// parseUpdateSearch reads the searcher's JSON.
|
|
//
|
|
// It carries no build tag on purpose: this is the half of the Windows update
|
|
// path that can be tested on a development machine, and the agent module has no
|
|
// Windows CI.
|
|
func parseUpdateSearch(jsonText string) ([]PackageUpdate, error) {
|
|
s := strings.TrimSpace(jsonText)
|
|
if s == "" || s == "null" {
|
|
return nil, nil
|
|
}
|
|
|
|
var rows []winUpdate
|
|
if err := json.Unmarshal([]byte(s), &rows); err != nil {
|
|
// ConvertTo-Json renders a one-element array as a bare object.
|
|
var one winUpdate
|
|
if err2 := json.Unmarshal([]byte(s), &one); err2 != nil {
|
|
return nil, err
|
|
}
|
|
rows = []winUpdate{one}
|
|
}
|
|
|
|
out := make([]PackageUpdate, 0, len(rows))
|
|
for _, r := range rows {
|
|
u := PackageUpdate{Name: r.Title}
|
|
if kb := strings.TrimSpace(r.KB); kb != "" {
|
|
if !strings.HasPrefix(strings.ToUpper(kb), "KB") {
|
|
kb = "KB" + kb
|
|
}
|
|
u.NewVersion = kb
|
|
}
|
|
out = append(out, u)
|
|
}
|
|
return out, nil
|
|
}
|