Files
rcond/pkg/config/config.go

114 lines
3.3 KiB
Go

package config
import (
"os"
"github.com/kelseyhightower/envconfig"
"gopkg.in/yaml.v3"
)
type Config struct {
RunMode RunMode `yaml:"runmode"`
Hostname string `yaml:"hostname" envconfig:"HOSTNAME"`
Rcond RcondConfig `yaml:"rcond"`
Network NetworkConfig `yaml:"network"`
Wifi WifiConfig `yaml:"wifi"`
Cluster ClusterConfig `yaml:"cluster"`
UI UIConfig `yaml:"ui"`
}
type RunMode string
const (
RunModeNode RunMode = "node"
RunModeUI RunMode = "ui"
)
type RcondConfig struct {
Addr string `yaml:"addr" envconfig:"RCOND_ADDR"`
ApiToken string `yaml:"api_token" envconfig:"RCOND_API_TOKEN"`
}
type WifiConfig struct {
AP APConfig `yaml:"ap"`
STA STAConfig `yaml:"sta"`
}
type APConfig struct {
SSID string `yaml:"ssid" envconfig:"WIFI_AP_SSID"`
Password string `yaml:"password" envconfig:"WIFI_AP_PASSWORD"`
Encryption string `yaml:"encryption" envconfig:"WIFI_AP_ENCRYPTION"`
Interface string `yaml:"interface" envconfig:"WIFI_AP_INTERFACE"`
}
type STAConfig struct {
SSID string `yaml:"ssid" envconfig:"WIFI_STA_SSID"`
Password string `yaml:"password" envconfig:"WIFI_STA_PASSWORD"`
Encryption string `yaml:"encryption" envconfig:"WIFI_STA_ENCRYPTION"`
Interface string `yaml:"interface" envconfig:"WIFI_STA_INTERFACE"`
}
type NetworkConfig struct {
Connections []ConnectionConfig `yaml:"connections"`
}
type ConnectionConfig struct {
Type string `yaml:"type,omitempty"`
UUID string `yaml:"uuid,omitempty"`
ID string `yaml:"id,omitempty"`
AutoConnect bool `yaml:"autoconnect,omitempty"`
SSID string `yaml:"ssid,omitempty"`
Mode string `yaml:"mode,omitempty"`
Band string `yaml:"band,omitempty"`
Channel uint32 `yaml:"channel,omitempty"`
KeyMgmt string `yaml:"keymgmt,omitempty"`
PSK string `yaml:"psk,omitempty"`
IPv4Method string `yaml:"ipv4method,omitempty"`
IPv6Method string `yaml:"ipv6method,omitempty"`
}
type ClusterConfig struct {
Enabled bool `yaml:"enabled" envconfig:"CLUSTER_ENABLED"`
NodeName string `yaml:"node_name" envconfig:"CLUSTER_NODE_NAME"`
SecretKey string `yaml:"secret_key" envconfig:"CLUSTER_SECRET_KEY"`
Join []string `yaml:"join" envconfig:"CLUSTER_JOIN"`
AdvertiseAddr string `yaml:"advertise_addr" envconfig:"CLUSTER_ADVERTISE_ADDR"`
AdvertisePort int `yaml:"advertise_port" envconfig:"CLUSTER_ADVERTISE_PORT"`
BindAddr string `yaml:"bind_addr" envconfig:"CLUSTER_BIND_ADDR"`
BindPort int `yaml:"bind_port" envconfig:"CLUSTER_BIND_PORT"`
LogLevel string `yaml:"log_level" envconfig:"CLUSTER_LOG_LEVEL"`
}
type UIConfig struct {
Enabled bool `yaml:"enabled" envconfig:"UI_ENABLED"`
}
// LoadConfig reads the configuration from a YAML file and environment variables.
func LoadConfig(filename string) (*Config, error) {
var config Config
data, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
err = yaml.Unmarshal(data, &config)
if err != nil {
return nil, err
}
err = envconfig.Process("", &config)
if err != nil {
return nil, err
}
return &config, nil
}
func SaveConfig(path string, config *Config) error {
yamlFile, err := yaml.Marshal(config)
if err != nil {
return err
}
return os.WriteFile(path, yamlFile, 0644)
}