func watch(args []string, service *update.Service, out *tabwriter.Writer) int { tick := time.NewTicker(time.Second * time.Duration(watchFlags.interval)) server := globalFlags.Server debug := globalFlags.Debug version := watchFlags.version if watchFlags.appId.Get() == nil || watchFlags.groupId.Get() == nil { return ERROR_USAGE } if len(args) == 0 { return ERROR_USAGE } appId := watchFlags.appId.String() groupId := watchFlags.groupId.String() clientId := watchFlags.clientId if clientId == "" { clientId = uuid.New() } // initial check updateCheck, err := fetchUpdateCheck(server, appId, groupId, clientId, version, debug) if err != nil { fmt.Fprintf(os.Stderr, err.Error()) os.Exit(1) } runCmd(args[0], args[1:], appId, version, "", updateCheck) for { select { case <-tick.C: updateCheck, err := fetchUpdateCheck(server, appId, groupId, clientId, version, debug) if err != nil { log.Printf("warning: update check failed (%v)\n", err) continue } if updateCheck.Status == "noupdate" { continue } else if updateCheck.Status == "error-version" { continue } newVersion := updateCheck.Manifest.Version if newVersion != version { runCmd(args[0], args[1:], appId, newVersion, version, updateCheck) } version = newVersion } } tick.Stop() return OK }
func fetchUpdateCheck(server string, appID string, groupID string, clientID string, version string, debug bool) (*omaha.UpdateCheck, error) { client := &http.Client{} // TODO: Fill out the OS field correctly based on /etc/os-release request := omaha.NewRequest("lsb", "CoreOS", "", "") app := request.AddApp(fmt.Sprintf("{%s}", appID), version) app.AddUpdateCheck() app.MachineID = clientID app.BootId = uuid.New() app.Track = groupID event := app.AddEvent() event.Type = "1" event.Result = "0" raw, err := xml.MarshalIndent(request, "", " ") if err != nil { fmt.Fprintln(os.Stderr, err) return nil, err } if debug { fmt.Fprintf(os.Stderr, "Request: %s%s\n", xml.Header, raw) } resp, err := client.Post(server+"/v1/update/", "text/xml", bytes.NewReader(raw)) if err != nil { fmt.Fprintln(os.Stderr, err) return nil, err } body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Fprintln(os.Stderr, err) return nil, err } if debug { fmt.Fprintf(os.Stderr, "Response: %s%s\n", xml.Header, string(body)) } oresp := &omaha.Response{} err = xml.Unmarshal(body, oresp) if err != nil { fmt.Fprintln(os.Stderr, err) return nil, err } return oresp.Apps[0].UpdateCheck, nil }
func appCreate(args []string, service *update.Service, out *tabwriter.Writer) int { if appFlags.appId.Get() == nil { appFlags.appId.Set(uuid.New()) } return updateAppHelper(service, out) }