139 lines
4.2 KiB
Go
139 lines
4.2 KiB
Go
package config
|
||
|
||
import (
|
||
"encoding/json"
|
||
"os"
|
||
tools "vServer/Backend/tools"
|
||
)
|
||
|
||
var ConfigPath = "WebServer/config.json"
|
||
|
||
var ConfigData struct {
|
||
Site_www []Site_www `json:"Site_www"`
|
||
Soft_Settings Soft_Settings `json:"Soft_Settings"`
|
||
Proxy_Service []Proxy_Service `json:"Proxy_Service"`
|
||
}
|
||
|
||
type Site_www struct {
|
||
Name string `json:"name"`
|
||
Host string `json:"host"`
|
||
Alias []string `json:"alias"`
|
||
Status string `json:"status"`
|
||
Root_file string `json:"root_file"`
|
||
Root_file_routing bool `json:"root_file_routing"`
|
||
AutoCreateSSL bool `json:"AutoCreateSSL"`
|
||
}
|
||
|
||
type Soft_Settings struct {
|
||
Php_port int `json:"php_port"`
|
||
Php_host string `json:"php_host"`
|
||
Mysql_port int `json:"mysql_port"`
|
||
Mysql_host string `json:"mysql_host"`
|
||
Proxy_enabled bool `json:"proxy_enabled"`
|
||
ACME_enabled bool `json:"ACME_enabled"`
|
||
}
|
||
|
||
type Proxy_Service struct {
|
||
Enable bool `json:"Enable"`
|
||
ExternalDomain string `json:"ExternalDomain"`
|
||
LocalAddress string `json:"LocalAddress"`
|
||
LocalPort string `json:"LocalPort"`
|
||
ServiceHTTPSuse bool `json:"ServiceHTTPSuse"`
|
||
AutoHTTPS bool `json:"AutoHTTPS"`
|
||
AutoCreateSSL bool `json:"AutoCreateSSL"`
|
||
}
|
||
|
||
func LoadConfig() {
|
||
|
||
data, err := os.ReadFile(ConfigPath)
|
||
|
||
if err != nil {
|
||
tools.Logs_file(0, "JSON", "Ошибка загрузки конфигурационного файла", "logs_config.log", true)
|
||
} else {
|
||
tools.Logs_file(0, "JSON", "config.json успешно загружен", "logs_config.log", true)
|
||
}
|
||
|
||
err = json.Unmarshal(data, &ConfigData)
|
||
if err != nil {
|
||
tools.Logs_file(0, "JSON", "Ошибка парсинга конфигурационного файла", "logs_config.log", true)
|
||
} else {
|
||
tools.Logs_file(0, "JSON", "config.json успешно прочитан", "logs_config.log", true)
|
||
}
|
||
|
||
// Миграция: добавляем новые поля если их нет
|
||
migrateConfig(data)
|
||
|
||
println()
|
||
|
||
}
|
||
|
||
// migrateConfig проверяет и добавляет новые поля в конфиг
|
||
func migrateConfig(originalData []byte) {
|
||
needsSave := false
|
||
|
||
// Парсим оригинальный JSON как map для проверки наличия полей
|
||
var rawConfig map[string]json.RawMessage
|
||
if err := json.Unmarshal(originalData, &rawConfig); err != nil {
|
||
return
|
||
}
|
||
|
||
// Проверяем Site_www
|
||
if rawSites, ok := rawConfig["Site_www"]; ok {
|
||
var sites []map[string]interface{}
|
||
if err := json.Unmarshal(rawSites, &sites); err == nil {
|
||
for _, site := range sites {
|
||
if _, exists := site["AutoCreateSSL"]; !exists {
|
||
needsSave = true
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// Проверяем Proxy_Service
|
||
if rawProxies, ok := rawConfig["Proxy_Service"]; ok {
|
||
var proxies []map[string]interface{}
|
||
if err := json.Unmarshal(rawProxies, &proxies); err == nil {
|
||
for _, proxy := range proxies {
|
||
if _, exists := proxy["AutoCreateSSL"]; !exists {
|
||
needsSave = true
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// Проверяем Soft_Settings на наличие ACME_enabled
|
||
if rawSettings, ok := rawConfig["Soft_Settings"]; ok {
|
||
var settings map[string]interface{}
|
||
if err := json.Unmarshal(rawSettings, &settings); err == nil {
|
||
if _, exists := settings["ACME_enabled"]; !exists {
|
||
needsSave = true
|
||
}
|
||
}
|
||
}
|
||
|
||
// Если нужно обновить - сохраняем конфиг с новыми полями
|
||
if needsSave {
|
||
tools.Logs_file(0, "JSON", "🔄 Миграция конфига: добавляем новые поля", "logs_config.log", true)
|
||
saveConfig()
|
||
}
|
||
}
|
||
|
||
// saveConfig сохраняет текущий конфиг в файл
|
||
func saveConfig() {
|
||
formattedJSON, err := json.MarshalIndent(ConfigData, "", " ")
|
||
if err != nil {
|
||
tools.Logs_file(1, "JSON", "Ошибка форматирования конфига: "+err.Error(), "logs_config.log", true)
|
||
return
|
||
}
|
||
|
||
err = os.WriteFile(ConfigPath, formattedJSON, 0644)
|
||
if err != nil {
|
||
tools.Logs_file(1, "JSON", "Ошибка сохранения конфига: "+err.Error(), "logs_config.log", true)
|
||
return
|
||
}
|
||
|
||
tools.Logs_file(0, "JSON", "✅ Конфиг обновлён с новыми полями", "logs_config.log", true)
|
||
}
|