mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
| package config
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| const LocalBackendName = "local"
 | |
| 
 | |
| type Backend struct {
 | |
| 	Default string `yaml:"default"` // The default backend to use (defaults to the internal backend)
 | |
| 
 | |
| 	Mikrotik []BackendMikrotik `yaml:"mikrotik"`
 | |
| }
 | |
| 
 | |
| // Validate checks the backend configuration for errors.
 | |
| func (b *Backend) Validate() error {
 | |
| 	if b.Default == "" {
 | |
| 		b.Default = LocalBackendName
 | |
| 	}
 | |
| 
 | |
| 	uniqueMap := make(map[string]struct{})
 | |
| 	for _, backend := range b.Mikrotik {
 | |
| 		if backend.Id == LocalBackendName {
 | |
| 			return fmt.Errorf("backend ID %q is a reserved keyword", LocalBackendName)
 | |
| 		}
 | |
| 		if _, exists := uniqueMap[backend.Id]; exists {
 | |
| 			return fmt.Errorf("backend ID %q is not unique", backend.Id)
 | |
| 		}
 | |
| 		uniqueMap[backend.Id] = struct{}{}
 | |
| 	}
 | |
| 
 | |
| 	if b.Default != LocalBackendName {
 | |
| 		if _, ok := uniqueMap[b.Default]; !ok {
 | |
| 			return fmt.Errorf("default backend %q is not defined in the configuration", b.Default)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| type BackendBase struct {
 | |
| 	Id          string `yaml:"id"`           // A unique id for the backend
 | |
| 	DisplayName string `yaml:"display_name"` // A display name for the backend
 | |
| }
 | |
| 
 | |
| // GetDisplayName returns the display name of the backend.
 | |
| // If no display name is set, it falls back to the ID.
 | |
| func (b BackendBase) GetDisplayName() string {
 | |
| 	if b.DisplayName == "" {
 | |
| 		return b.Id // Fallback to ID if no display name is set
 | |
| 	}
 | |
| 	return b.DisplayName
 | |
| }
 | |
| 
 | |
| type BackendMikrotik struct {
 | |
| 	BackendBase `yaml:",inline"` // Embed the base fields
 | |
| 
 | |
| 	ApiUrl       string        `yaml:"api_url"` // The base URL of the Mikrotik API (e.g., "https://10.10.10.10:8729/rest")
 | |
| 	ApiUser      string        `yaml:"api_user"`
 | |
| 	ApiPassword  string        `yaml:"api_password"`
 | |
| 	ApiVerifyTls bool          `yaml:"api_verify_tls"` // Whether to verify the TLS certificate of the Mikrotik API
 | |
| 	ApiTimeout   time.Duration `yaml:"api_timeout"`    // Timeout for API requests (default: 30 seconds)
 | |
| 
 | |
| 	// Concurrency controls the maximum number of concurrent API requests that this backend will issue
 | |
| 	// when enumerating interfaces and their details. If 0 or negative, a default of 5 is used.
 | |
| 	Concurrency int `yaml:"concurrency"`
 | |
| 
 | |
| 	Debug bool `yaml:"debug"` // Enable debug logging for the Mikrotik backend
 | |
| }
 | |
| 
 | |
| // GetConcurrency returns the configured concurrency for this backend or a sane default (5)
 | |
| // when the configured value is zero or negative.
 | |
| func (b *BackendMikrotik) GetConcurrency() int {
 | |
| 	if b == nil {
 | |
| 		return 5
 | |
| 	}
 | |
| 	if b.Concurrency <= 0 {
 | |
| 		return 5
 | |
| 	}
 | |
| 	return b.Concurrency
 | |
| }
 | |
| 
 | |
| // GetApiTimeout returns the configured API timeout or a sane default (30 seconds)
 | |
| // when the configured value is zero or negative.
 | |
| func (b *BackendMikrotik) GetApiTimeout() time.Duration {
 | |
| 	if b == nil {
 | |
| 		return 30 * time.Second
 | |
| 	}
 | |
| 	if b.ApiTimeout <= 0 {
 | |
| 		return 30 * time.Second
 | |
| 	}
 | |
| 	return b.ApiTimeout
 | |
| }
 |