Улучшение фронта
This commit is contained in:
@@ -39,7 +39,6 @@ func StartHTTPS() {
|
||||
serverName := chi.ServerName
|
||||
|
||||
if serverName == "" {
|
||||
tools.Logs_file(1, "HTTPS", "⚠️ Подключение без SNI (возможно по IP)", "logs_https.log", false)
|
||||
|
||||
} else if cert, ok := certMap[serverName]; ok {
|
||||
// Найден точный сертификат для домена
|
||||
@@ -59,7 +58,6 @@ func StartHTTPS() {
|
||||
}
|
||||
|
||||
if fallbackCert != nil {
|
||||
tools.Logs_file(1, "HTTPS", "⚠️ Используем fallback-сертификат", "logs_https.log", false)
|
||||
return fallbackCert, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -377,7 +377,6 @@ func PHPHandler(w http.ResponseWriter, r *http.Request, host string, originalURI
|
||||
return
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "PHP", fmt.Sprintf("✅ FastCGI обработал: %s (порт %d)", phpPath, port), "logs_php.log", false)
|
||||
}
|
||||
|
||||
// Streaming чтение FastCGI ответа с поддержкой SSE и chunked transfer
|
||||
|
||||
@@ -28,16 +28,9 @@ func isWebSocketRequest(r *http.Request) bool {
|
||||
|
||||
// Проксирует WebSocket соединение
|
||||
func handleWebSocketProxy(w http.ResponseWriter, r *http.Request, proxyConfig config.Proxy_Service) bool {
|
||||
// Определяем протокол для локального соединения
|
||||
protocol := "ws"
|
||||
networkProtocol := "tcp"
|
||||
if proxyConfig.ServiceHTTPSuse {
|
||||
protocol = "wss"
|
||||
}
|
||||
|
||||
targetAddr := proxyConfig.LocalAddress + ":" + proxyConfig.LocalPort
|
||||
|
||||
tools.Logs_file(0, "WS-PROXY", "🔌 WebSocket: "+r.RemoteAddr+" → "+protocol+"://"+targetAddr+r.URL.Path, "logs_proxy.log", false)
|
||||
|
||||
// Захватываем клиентское соединение через Hijacker
|
||||
hijacker, ok := w.(http.Hijacker)
|
||||
@@ -135,7 +128,6 @@ func handleWebSocketProxy(w http.ResponseWriter, r *http.Request, proxyConfig co
|
||||
return true
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "WS-PROXY", "✅ WebSocket установлен: "+r.Host+r.URL.Path, "logs_proxy.log", false)
|
||||
|
||||
// Двунаправленное проксирование данных
|
||||
done := make(chan struct{}, 2)
|
||||
@@ -171,7 +163,6 @@ func handleWebSocketProxy(w http.ResponseWriter, r *http.Request, proxyConfig co
|
||||
// Ждём завершения одного из направлений
|
||||
<-done
|
||||
|
||||
tools.Logs_file(0, "WS-PROXY", "🔌 WebSocket закрыт: "+r.Host+r.URL.Path, "logs_proxy.log", false)
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -388,32 +388,32 @@ func checkRules(rules []VAccessRule, requestPath string, r *http.Request, checkF
|
||||
if errorPage == "" {
|
||||
errorPage = "404"
|
||||
}
|
||||
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+requestPath, logFile, false)
|
||||
return false, errorPage
|
||||
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+r.Host+requestPath, logFile, false)
|
||||
return false, errorPage
|
||||
}
|
||||
// Все условия Allow выполнены - разрешаем доступ
|
||||
return true, ""
|
||||
|
||||
case "Disable":
|
||||
// Disable правило: запрещаем если ЛЮБОЕ условие выполнено
|
||||
shouldBlock := true
|
||||
|
||||
// Для расширений файлов (только если проверка включена)
|
||||
if checkFileExtensions && len(rule.TypeFile) > 0 && !fileMatches {
|
||||
shouldBlock = false
|
||||
}
|
||||
|
||||
// Для IP адресов
|
||||
if len(rule.IPList) > 0 && !ipMatches {
|
||||
shouldBlock = false
|
||||
}
|
||||
|
||||
if shouldBlock {
|
||||
errorPage := rule.UrlError
|
||||
if errorPage == "" {
|
||||
errorPage = "404"
|
||||
}
|
||||
// Все условия Allow выполнены - разрешаем доступ
|
||||
return true, ""
|
||||
|
||||
case "Disable":
|
||||
// Disable правило: запрещаем если ЛЮБОЕ условие выполнено
|
||||
shouldBlock := true
|
||||
|
||||
// Для расширений файлов (только если проверка включена)
|
||||
if checkFileExtensions && len(rule.TypeFile) > 0 && !fileMatches {
|
||||
shouldBlock = false
|
||||
}
|
||||
|
||||
// Для IP адресов
|
||||
if len(rule.IPList) > 0 && !ipMatches {
|
||||
shouldBlock = false
|
||||
}
|
||||
|
||||
if shouldBlock {
|
||||
errorPage := rule.UrlError
|
||||
if errorPage == "" {
|
||||
errorPage = "404"
|
||||
}
|
||||
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+requestPath, logFile, false)
|
||||
tools.Logs_file(1, logPrefix, "🚫 Доступ запрещён для "+getClientIP(r)+" к "+r.Host+requestPath, logFile, false)
|
||||
return false, errorPage
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ func CreateNewSite(siteData SiteInfo) error {
|
||||
return fmt.Errorf("ошибка добавления в конфиг: %w", err)
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Новый сайт создан: %s (%s)", siteData.Name, siteData.Host), "logs_config.log", true)
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Новый сайт создан: %s (%s)", siteData.Name, siteData.Host), "logs_error.log", true)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ func CreateSiteFolder(host string) error {
|
||||
return fmt.Errorf("не удалось создать папку: %w", err)
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("📁 Создана папка: %s", folderPath), "logs_config.log", false)
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("📁 Создана папка: %s", folderPath), "logs_error.log", false)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ func CreateStarterFile(host, rootFile string) error {
|
||||
return fmt.Errorf("не удалось создать файл: %w", err)
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("📄 Создан стартовый файл: %s", rootFile), "logs_config.log", false)
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("📄 Создан стартовый файл: %s", rootFile), "logs_error.log", false)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ func CreateVAccessFile(host string) error {
|
||||
return fmt.Errorf("не удалось создать vAccess.conf: %w", err)
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", "🔒 Создан vAccess.conf", "logs_config.log", false)
|
||||
tools.Logs_file(0, "SITES", "🔒 Создан vAccess.conf", "logs_error.log", false)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ func AddSiteToConfig(siteData SiteInfo) error {
|
||||
return err
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", "💾 Конфигурация обновлена", "logs_config.log", false)
|
||||
tools.Logs_file(0, "SITES", "💾 Конфигурация обновлена", "logs_error.log", false)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ func UploadSiteCertificate(host, certType string, certData []byte) error {
|
||||
return fmt.Errorf("не удалось сохранить сертификат: %w", err)
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("🔒 Загружен сертификат: %s для %s", fileName, host), "logs_config.log", true)
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("🔒 Загружен сертификат: %s для %s", fileName, host), "logs_error.log", true)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -251,7 +251,7 @@ func DeleteSiteCertificates(host string) error {
|
||||
return fmt.Errorf("не удалось удалить папку сертификатов: %w", err)
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалены сертификаты для: %s", host), "logs_config.log", true)
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалены сертификаты для: %s", host), "logs_error.log", true)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -281,13 +281,13 @@ func DeleteSite(host string) error {
|
||||
if err := os.RemoveAll(absSiteDir); err != nil {
|
||||
return fmt.Errorf("не удалось удалить папку сайта: %w", err)
|
||||
}
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалена папка сайта: %s", siteDir), "logs_config.log", false)
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("🗑️ Удалена папка сайта: %s", siteDir), "logs_error.log", false)
|
||||
}
|
||||
|
||||
// 3. Удаляем сертификаты
|
||||
if err := DeleteSiteCertificates(host); err != nil {
|
||||
// Логируем ошибку, но продолжаем удаление
|
||||
tools.Logs_file(1, "SITES", fmt.Sprintf("Ошибка удаления сертификатов: %v", err), "logs_config.log", false)
|
||||
tools.Logs_file(1, "SITES", fmt.Sprintf("Ошибка удаления сертификатов: %v", err), "logs_error.log", false)
|
||||
}
|
||||
|
||||
// 4. Удаляем из конфига
|
||||
@@ -301,7 +301,7 @@ func DeleteSite(host string) error {
|
||||
return fmt.Errorf("ошибка сохранения конфигурации: %w", err)
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Сайт '%s' полностью удалён", host), "logs_config.log", true)
|
||||
tools.Logs_file(0, "SITES", fmt.Sprintf("✅ Сайт '%s' полностью удалён", host), "logs_error.log", true)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -49,16 +49,13 @@ 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)
|
||||
tools.Logs_file(1, "JSON", "Ошибка загрузки конфигурационного файла", "logs_error.log", true)
|
||||
return
|
||||
}
|
||||
|
||||
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)
|
||||
tools.Logs_file(1, "JSON", "Ошибка парсинга конфигурационного файла", "logs_error.log", true)
|
||||
}
|
||||
|
||||
// Миграция: добавляем новые поля если их нет
|
||||
@@ -116,7 +113,7 @@ func migrateConfig(originalData []byte) {
|
||||
|
||||
// Если нужно обновить - сохраняем конфиг с новыми полями
|
||||
if needsSave {
|
||||
tools.Logs_file(0, "JSON", "🔄 Миграция конфига: добавляем новые поля", "logs_config.log", true)
|
||||
tools.Logs_file(0, "JSON", "🔄 Миграция конфига: добавляем новые поля", "logs_error.log", true)
|
||||
saveConfig()
|
||||
}
|
||||
}
|
||||
@@ -125,15 +122,15 @@ func migrateConfig(originalData []byte) {
|
||||
func saveConfig() {
|
||||
formattedJSON, err := json.MarshalIndent(ConfigData, "", " ")
|
||||
if err != nil {
|
||||
tools.Logs_file(1, "JSON", "Ошибка форматирования конфига: "+err.Error(), "logs_config.log", true)
|
||||
tools.Logs_file(1, "JSON", "Ошибка форматирования конфига: "+err.Error(), "logs_error.log", true)
|
||||
return
|
||||
}
|
||||
|
||||
err = os.WriteFile(ConfigPath, formattedJSON, 0644)
|
||||
if err != nil {
|
||||
tools.Logs_file(1, "JSON", "Ошибка сохранения конфига: "+err.Error(), "logs_config.log", true)
|
||||
tools.Logs_file(1, "JSON", "Ошибка сохранения конфига: "+err.Error(), "logs_error.log", true)
|
||||
return
|
||||
}
|
||||
|
||||
tools.Logs_file(0, "JSON", "✅ Конфиг обновлён с новыми полями", "logs_config.log", true)
|
||||
tools.Logs_file(0, "JSON", "✅ Конфиг обновлён с новыми полями", "logs_error.log", true)
|
||||
}
|
||||
|
||||
@@ -82,12 +82,23 @@ func Logs_file(type_log int, service string, message string, log_file string, co
|
||||
}
|
||||
|
||||
// Открываем файл для дозаписи, создаём если нет, права на запись.
|
||||
file, err := os.OpenFile(logsDir+"/"+log_files, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
filePath := logsDir + "/" + log_files
|
||||
isNew := false
|
||||
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
||||
isNew = true
|
||||
}
|
||||
|
||||
file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// UTF-8 BOM для новых файлов (чтобы Windows корректно читал)
|
||||
if isNew {
|
||||
file.Write([]byte{0xEF, 0xBB, 0xBF})
|
||||
}
|
||||
|
||||
// Пишем строку в файл
|
||||
if _, err := file.WriteString(text); err != nil {
|
||||
log.Fatal(err)
|
||||
|
||||
Reference in New Issue
Block a user