Files
vServer/Backend/config/config.go
Falknat 9a788800b5 Автоматическое создание сертификатов
Добавил возможность создания автоматических сертификатов.
2026-01-17 10:36:00 +07:00

139 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}