Исправил загрузку файлов (сравнение контрольных сумм)

This commit is contained in:
Sergey Kalinin
2025-12-11 18:32:48 +03:00
parent 88e5119dec
commit cee3178af5

54
main.go
View File

@@ -1,32 +1,32 @@
//----------------------------- //-----------------------------
//Distributed under GPL // Distributed under GPL
//Author Sergey Kalinin // Author Sergey Kalinin
//svk@nuk-svk.ru // svk@nuk-svk.ru
//------------------------------ //------------------------------
package main package main
import ( import (
"crypto/sha256"
"encoding/hex"
"encoding/json" "encoding/json"
"fmt"
"html/template" "html/template"
"io"
"log" "log"
"net" "net"
"net/http" "net/http"
"os"
"path/filepath"
"strings" "strings"
"sync" "os"
"io"
"path/filepath"
"fmt"
"time" "time"
"sync"
"encoding/hex"
"crypto/sha256"
"github.com/go-co-op/gocron"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/likexian/whois"
"github.com/oschwald/geoip2-golang" "github.com/oschwald/geoip2-golang"
"golang.org/x/text/language" "golang.org/x/text/language"
"github.com/likexian/whois"
"github.com/go-co-op/gocron"
) )
type GeoData struct { type GeoData struct {
@@ -93,6 +93,8 @@ var (
dbFilesVersion string dbFilesVersion string
) )
func main() { func main() {
var err error var err error
// Загрузка конфигурации // Загрузка конфигурации
@@ -116,7 +118,7 @@ func main() {
} }
defer cityDB.Close() defer cityDB.Close()
pathGeoLite2Country := filepath.Join(cfg.MMDBLocalPath, "GeoLite2-Country.mmdb") pathGeoLite2Country := filepath.Join(cfg.MMDBLocalPath,"GeoLite2-Country.mmdb")
countryDB, err = geoip2.Open(pathGeoLite2Country) countryDB, err = geoip2.Open(pathGeoLite2Country)
if err != nil { if err != nil {
log.Fatal("Failed to open Country database:", err) log.Fatal("Failed to open Country database:", err)
@@ -133,7 +135,7 @@ func main() {
dbFilesVersion = getFileModTime(pathGeoLite2City) dbFilesVersion = getFileModTime(pathGeoLite2City)
// Загружаем шаблон // Загружаем шаблон
templates = template.Must(template.ParseFiles(filepath.Join(cfg.HTMLTemplatePath, "index.html"))) templates = template.Must(template.ParseFiles(filepath.Join(cfg.HTMLTemplatePath,"index.html")))
// Обработка ссылок // Обработка ссылок
r := mux.NewRouter() r := mux.NewRouter()
@@ -143,8 +145,8 @@ func main() {
r.HandleFunc("/lookup/{ip}", lookupHandler) r.HandleFunc("/lookup/{ip}", lookupHandler)
r.HandleFunc("/{ip}", lookupHandler) r.HandleFunc("/{ip}", lookupHandler)
log.Println("Server starting on:", cfg.ListenPort) log.Println("Server starting on:",cfg.ListenPort)
log.Fatal(http.ListenAndServe(":"+cfg.ListenPort, r)) log.Fatal(http.ListenAndServe(":" + cfg.ListenPort, r))
} }
func getFileModTime(filePath string) string { func getFileModTime(filePath string) string {
@@ -163,7 +165,6 @@ func getFileModTime(filePath string) string {
// fmt.Printf("Форматированное время: %s\n", modTime.Format("02/01/2006 15:04:05")) // fmt.Printf("Форматированное время: %s\n", modTime.Format("02/01/2006 15:04:05"))
return modTime.Format("02/01/2006 15:04:05") return modTime.Format("02/01/2006 15:04:05")
} }
// reopenDBs закрывает и заново открывает нужную БД // reopenDBs закрывает и заново открывает нужную БД
func reopenDBs(fileName string) { func reopenDBs(fileName string) {
dbMutex.Lock() dbMutex.Lock()
@@ -362,6 +363,7 @@ func getPreferredLocale(r *http.Request) string {
return "en" return "en"
} }
func sendJSONResponse(w http.ResponseWriter, data interface{}) { func sendJSONResponse(w http.ResponseWriter, data interface{}) {
w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Origin", "*")
@@ -569,6 +571,7 @@ func getWhoIsInfo(address string) string {
return "WhoIs request error" return "WhoIs request error"
} }
return result return result
} }
@@ -590,6 +593,7 @@ func getEnv(key, defaultValue string) string {
return defaultValue return defaultValue
} }
// Запуск задания скачивания файлов // Запуск задания скачивания файлов
func sheduler() { func sheduler() {
// инициализируем объект планировщика // инициализируем объект планировщика
@@ -667,9 +671,12 @@ func getRemoteChecksum(url string) string {
if err != nil { if err != nil {
return "" return ""
} }
// Так как запрос возвращает сумму и путь к файлу то
// разбиваем строку на массив и берем первый элемент
words := strings.Fields(string(body))
checkSum := words[0]
// Предполагаем, что файл содержит только хеш return strings.TrimSpace(checkSum)
return strings.TrimSpace(string(body))
} }
func shouldDownload(fileName string) bool { func shouldDownload(fileName string) bool {
@@ -683,14 +690,14 @@ func shouldDownload(fileName string) bool {
} }
// Проверяем возраст файла (скачиваем если старше 7 дней) // Проверяем возраст файла (скачиваем если старше 7 дней)
/* /*
if info, err := os.Stat(filePath); err == nil { if info, err := os.Stat(filePath); err == nil {
if time.Since(info.ModTime()) > 7*24*time.Hour { if time.Since(info.ModTime()) > 7*24*time.Hour {
return true return true
} }
} }
*/ */
// Проверка по контрольной сумме // Проверка по контрольной сумме
if checksumURL := fileURL + ".sha256"; checksumURL != "" { if checksumURL := fileURL + ".sha256"; checksumURL != "" {
remoteFileChecksum := getRemoteChecksum(checksumURL) remoteFileChecksum := getRemoteChecksum(checksumURL)
@@ -704,7 +711,7 @@ func shouldDownload(fileName string) bool {
fmt.Println(remoteFileChecksum) fmt.Println(remoteFileChecksum)
fmt.Println(localFileChecksum) fmt.Println(localFileChecksum)
if localFileChecksum != remoteFileChecksum { if localFileChecksum != remoteFileChecksum {
return false return true
} }
} }
} else { } else {
@@ -716,7 +723,6 @@ func shouldDownload(fileName string) bool {
return false return false
} }
// Загрузка файлов БД с ВЭБ-сервера // Загрузка файлов БД с ВЭБ-сервера
func mmdbDownload(fileName string) { func mmdbDownload(fileName string) {
fileURL := cfg.MMDBURL + fileName fileURL := cfg.MMDBURL + fileName
@@ -730,7 +736,7 @@ func mmdbDownload(fileName string) {
// Скачиваем во временный файл // Скачиваем во временный файл
tempPath := filePath + ".tmp" tempPath := filePath + ".tmp"
log.Println("Загружается файл:", fileURL) log.Println("Загружается файл:",fileURL)
// Создаём файл // Создаём файл
file, err := os.Create(tempPath) file, err := os.Create(tempPath)
if err != nil { if err != nil {