diff --git a/update.go b/update.go new file mode 100644 index 0000000..137d3b7 --- /dev/null +++ b/update.go @@ -0,0 +1,60 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "path" + "runtime" +) + +func autoUpdate() { + defer func() { + if err := recover(); err != nil { + log.Println("Download error.", err) + } + }() + + var api = "https://api.github.com/repos/webp-sh/webp_server_go/releases/latest" + type Result struct { + TagName string `json:"tag_name"` + } + var res Result + resp1, _ := http.Get(api) + data1, _ := ioutil.ReadAll(resp1.Body) + _ = json.Unmarshal(data1, &res) + + var gitVersion = res.TagName + + if gitVersion > version { + log.Printf("Time to update! New version %s found!", gitVersion) + } else { + log.Println("No new version found.") + return + } + + var filename = fmt.Sprintf("webp-server-%s-%s", runtime.GOOS, runtime.GOARCH) + if runtime.GOARCH == "windows" { + filename += ".exe" + } + var releaseUrl = "https://github.com/webp-sh/webp_server_go/releases/latest/download/" + filename + log.Println("Downloading binary...") + resp, _ := http.Get(releaseUrl) + if resp.StatusCode != 200 { + log.Printf("%s-%s not found on release. "+ + "Contact developers to supply your version", runtime.GOOS, runtime.GOARCH) + return + } + data, _ := ioutil.ReadAll(resp.Body) + _ = os.Mkdir("update", 0755) + // TODO: checksum + err := ioutil.WriteFile(path.Join("update", filename), data, 0755) + + if err == nil { + log.Println("Update complete. Please find your binary from update directory.") + } + _ = resp.Body.Close() +} diff --git a/webp-server.go b/webp-server.go index 75e4a12..f7f3d79 100644 --- a/webp-server.go +++ b/webp-server.go @@ -79,6 +79,7 @@ func init() { } func main() { + go autoUpdate() config := loadConfig(configPath) HOST := config.HOST