--- /dev/null
+package main
+
+import (
+ "fmt"
+ "os"
+ "bufio"
+ "strings"
+)
+
+func MainGlobalUpdate(xsanum int, args []string) (int) {
+ err := OpenRepos()
+ if err != nil {
+ fmt.Printf("Error opening repos: %v\n", err)
+ return 1
+ }
+
+ var limit XenVersion
+ init := false
+
+ var sm SecurityMeta
+
+ err = sm.Load()
+ if err != nil {
+ if !os.IsNotExist(err) {
+ fmt.Printf("Error: %v\n", err)
+ return 1
+ }
+
+ fmt.Printf("Creating new global metadata\nOldest security-supported xen release: ")
+ input := bufio.NewScanner(os.Stdin)
+ if !input.Scan() {
+ fmt.Printf("Input error\n")
+ return 1
+ }
+ s := input.Text()
+ // Get rid of newline at the end
+ s = strings.NewReplacer("\n", "").Replace(s)
+
+ limit = XenVersion(s)
+ if !limit.Check() {
+ fmt.Printf("Invalid Xen version: %s\n", limit)
+ return 1
+ }
+
+ sm.Versions = make(map[XenVersion]*VersionMeta)
+ init = true
+ }
+
+ fmt.Printf("Getting Xen releases from treee...\n")
+ versions, err := repos.XenRepos[TreeXen].GetVersions()
+ if err != nil {
+ fmt.Printf("Error getting Xen releases: %v\n", err)
+ return 1
+ }
+
+ for _, fv := range versions {
+ vm, prs := sm.Versions[fv.XenVersion()]
+ if prs {
+ if fv.Point() > vm.Latest.Point() {
+ fmt.Printf("New version %v supercedes %v, discarding XSAs\n",
+ fv, vm.Latest)
+ vm.Latest = fv
+ vm.XSAs = []int{}
+ }
+ } else if init && fv.XenVersion().IsGreaterEqualThan(limit) {
+ sm.Versions[fv.XenVersion()] = &VersionMeta{ Latest: fv, XSAs: []int{} }
+ } else {
+ fmt.Printf("Skipping version %v\n", fv)
+ }
+ }
+
+ if init {
+ fmt.Printf("New global.meta created. You probably need to"+
+ "manually enter outstanding XSAs for each version.")
+ }
+
+ err = sm.Save()
+ if err != nil {
+ fmt.Printf("Error saving global metadata: %v\n", err)
+ return 1
+ }
+
+ return 0
+}
+
+func MainGlobalInfo(xsanum int, args []string) (int) {
+ return 0
+}
"io/ioutil"
"os"
"fmt"
- "time"
)
type Tree string
return
}
-// FIXME: Need to figure out a good way to serialize time in a
-// human-readable way
type VersionMeta struct {
- XenVersion
- ReleaseDate time.Time
- SecurityEndDate time.Time
+ Latest XenVersionFull
+ XSAs []int
}
type SecurityMeta struct {
- Versions []VersionMeta
+ Versions map[XenVersion]*VersionMeta
}
const GlobalMetaFilename = "global.meta"