58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package db_updater
|
|
|
|
import (
|
|
"github.com/go-resty/resty/v2"
|
|
"github.com/rs/zerolog/log"
|
|
"net/http"
|
|
"os"
|
|
"path"
|
|
"thuanle.me/ip-info/configs"
|
|
)
|
|
|
|
func download(url string) bool {
|
|
log.Info().Str("url", url).Msg("Downloading DB")
|
|
filename := configs.GeoDbFolder + path.Base(url)
|
|
|
|
client := resty.New()
|
|
resp, err := client.R().
|
|
SetOutput(filename).
|
|
SetHeader("If-None-Match", readETag(filename)).
|
|
Get(url)
|
|
|
|
if err != nil {
|
|
log.Err(err).
|
|
Str("url", url).
|
|
Msg("Failed to fetch DB")
|
|
return false
|
|
}
|
|
|
|
if resp.StatusCode() == http.StatusOK {
|
|
writeETag(filename, resp.Header().Get("Etag"))
|
|
} else {
|
|
//log.Printf("No update needed: %v", resp.Status())
|
|
return false
|
|
}
|
|
|
|
log.Info().
|
|
Str("filename", filename).
|
|
Msg("Downloaded DB")
|
|
return true
|
|
}
|
|
|
|
// readETag reads the ETag from the file
|
|
func readETag(baseFile string) string {
|
|
data, err := os.ReadFile(baseFile + ".etag")
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return string(data)
|
|
}
|
|
|
|
// writeETag writes the ETag to the file
|
|
func writeETag(baseFile, etag string) {
|
|
err := os.WriteFile(baseFile+".etag", []byte(etag), 0644)
|
|
if err != nil {
|
|
log.Err(err).Msg("Failed to write ETag")
|
|
}
|
|
}
|