package updates import ( "encoding/json" "fmt" "net/http" "time" "github.com/gorilla/websocket" "imuslab.com/arozos/mod/common" ) func HandleUpdateCheckSize(w http.ResponseWriter, r *http.Request) { webpack, err := common.Mv(r, "webpack", true) if err != nil { common.SendErrorResponse(w, "Invalid or empty webpack download URL") return } binary, err := common.Mv(r, "binary", true) if err != nil { common.SendErrorResponse(w, "Invalid or empty binary download URL") return } bsize, wsize, err := GetUpdateSizes(binary, webpack) if err != nil { common.SendErrorResponse(w, "Failed to get update size: "+err.Error()) return } js, _ := json.Marshal([]int{bsize, wsize}) common.SendJSONResponse(w, string(js)) } func HandleUpdateDownloadRequest(w http.ResponseWriter, r *http.Request) { webpack, err := common.Mv(r, "webpack", false) if err != nil { common.SendErrorResponse(w, "Invalid or empty webpack download URL") return } binary, err := common.Mv(r, "binary", false) if err != nil { common.SendErrorResponse(w, "Invalid or empty binary download URL") return } //Update the connection to websocket requireWebsocket, _ := common.Mv(r, "ws", false) if requireWebsocket == "true" { //Upgrade to websocket var upgrader = websocket.Upgrader{} upgrader.CheckOrigin = func(r *http.Request) bool { return true } c, err := upgrader.Upgrade(w, r, nil) if err != nil { common.SendErrorResponse(w, "Upgrade websocket failed: "+err.Error()) return } type Progress struct { Stage int Progress float64 StatusText string } err = DownloadUpdatesFromURL(binary, webpack, func(stage int, progress float64, statusText string) { thisProgress := Progress{ Stage: stage, Progress: progress, StatusText: statusText, } js, _ := json.Marshal(thisProgress) c.WriteMessage(1, js) }) if err != nil { //Finish with error c.WriteMessage(1, []byte("{\"error\":\""+err.Error()+"\"")) } else { //Done without error c.WriteMessage(1, []byte("OK")) } //Close WebSocket connection after finished c.WriteControl(8, []byte{}, time.Now().Add(time.Second)) c.Close() } else { //Just download and return ok after finish err = DownloadUpdatesFromURL(binary, webpack, func(stage int, progress float64, statusText string) { fmt.Println("Downloading Update, Stage: ", stage, " Progress: ", progress, " Status: ", statusText) }) if err != nil { common.SendErrorResponse(w, err.Error()) } else { common.SendOK(w) } } } /* func HandleLauncherRestart(w http.ResponseWriter, r *http.Request) { //Check if there is a launcher listening to port 25576 resp, err := http.Get("http://127.0.0.1:25576/chk") if err != nil { common.SendErrorResponse(w, "No launcher found. Unable to restart") return } content, err := ioutil.ReadAll(resp.Body) if err != nil { common.SendErrorResponse(w, "Read launcher response failed") return } execute, _ := common.Mv(r, "exec", true) if execute == "true" && r.Method == http.MethodPost { //Do the update log.Println("REQUESTING LAUNCHER FOR UPDATE RESTART") common.SendOK(w) } else if execute == "true" { w.WriteHeader(http.StatusMethodNotAllowed) w.Write([]byte("405 - Method Not Allowed")) } else { //Return the launcher message common.SendTextResponse(w, string(content)) } } */