Files
wgServer/internal/database/validation.go
2025-10-16 16:27:36 +07:00

87 lines
2.3 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 database
import (
"fmt"
"strings"
)
// GetNextAvailableNetwork возвращает следующую доступную подсеть
func GetNextAvailableNetwork(db *Database) string {
// Начинаем с 10.0.0.1/24
for i := 10; i < 255; i++ {
network := fmt.Sprintf("%d.0.0.1/24", i)
if IsNetworkAvailable(db, network) {
return network
}
}
return "10.0.0.1/24" // fallback
}
// GetNextAvailablePort возвращает следующий доступный порт
func GetNextAvailablePort(db *Database) int {
// Начинаем с 50000
for port := 50000; port < 65535; port++ {
if IsPortAvailableForServer(db, port) {
return port
}
}
return 50000 // fallback
}
// IsNetworkAvailable проверяет свободна ли подсеть
func IsNetworkAvailable(db *Database, network string) bool {
// Извлекаем второй октет для сравнения
// 10.0.0.1/24 -> 10
// 11.0.0.1/24 -> 11
parts := strings.Split(network, ".")
if len(parts) < 2 {
return false
}
networkPrefix := parts[0] + "." + parts[1]
for _, server := range db.Servers {
serverParts := strings.Split(server.Address, ".")
if len(serverParts) < 2 {
continue
}
serverPrefix := serverParts[0] + "." + serverParts[1]
if networkPrefix == serverPrefix {
return false
}
}
return true
}
// IsPortAvailableForServer проверяет свободен ли порт для сервера
func IsPortAvailableForServer(db *Database, port int) bool {
for _, server := range db.Servers {
if server.ListenPort == port {
return false
}
}
return true
}
// ValidateServerConfig проверяет корректность конфигурации сервера
func ValidateServerConfig(db *Database, address string, port int) error {
// Проверяем формат подсети
if !strings.HasSuffix(address, "/24") {
return fmt.Errorf("подсеть должна быть /24")
}
// Проверяем что подсеть свободна
if !IsNetworkAvailable(db, address) {
return fmt.Errorf("подсеть уже используется")
}
// Проверяем что порт свободен
if !IsPortAvailableForServer(db, port) {
return fmt.Errorf("порт %d уже используется", port)
}
return nil
}