Исправил загрузку файлов (сравнение контрольных сумм)
This commit is contained in:
54
main.go
54
main.go
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user