polemos/state/config.go
2023-04-18 15:03:34 +02:00

96 lines
2.4 KiB
Go

package state
import (
"fmt"
"io/ioutil"
"net/netip"
"os"
"github.com/google/uuid"
"gopkg.in/yaml.v3"
)
// Config contains all MTD services and cloud provider configs
type Config struct {
MTD mtdconf `yaml:"mtd"`
AWS aws `yaml:"aws"`
}
type mtdconf struct {
Services map[CustomUUID]Service `yaml:"services"`
}
// Service contains all necessary information about a service to identify it in the cloud as well as configuring a proxy for it
type Service struct {
CloudID string `yaml:"cloud_id"`
AdminEnabled bool `yaml:"admin_enabled"`
Active bool `yaml:"active"`
EntryIP netip.Addr `yaml:"entry_ip"`
EntryPort uint16 `yaml:"entry_port"`
ServiceIP netip.Addr `yaml:"service_ip"`
ServicePort uint16 `yaml:"service_port"`
}
// CustomUUID is an alias for uuid.UUID to enable custom unmarshal function
type CustomUUID uuid.UUID
type aws struct {
Regions []string `yaml:"regions"`
CredentialsPath string `yaml:"credentials_path"`
}
// UnmarshalYAML parses uuid in yaml to CustomUUID type
func (u *CustomUUID) UnmarshalYAML(value *yaml.Node) error {
id, err := uuid.Parse(value.Value)
if err != nil {
return err
}
*u = CustomUUID(id)
return nil
}
// MarshalYAML parses CustomUUID type to uuid string for yaml
func (u CustomUUID) MarshalYAML() (interface{}, error) {
return uuid.UUID(u).String(), nil
}
// LoadConf loads config from a yaml file
func LoadConf(filename string) (Config) {
var config Config
data, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Println("Error reading file:", err)
fmt.Println("Attempting to load default config")
data, err = ioutil.ReadFile("config.default.yaml")
if err != nil {
fmt.Println("Error reading file:", err)
os.Exit(1)
}
}
err = yaml.Unmarshal([]byte(data), &config)
if err != nil {
fmt.Println("Error importing config:", err)
os.Exit(1)
}
fmt.Println("Imported config succesfully!")
return config
}
// SaveConf saves config to yaml file
func SaveConf(filename string, config Config) (error) {
yamlBytes, err := yaml.Marshal(&config)
if err != nil {
return err
}
err = ioutil.WriteFile(filename, yamlBytes, 0644)
if err != nil {
return err
}
return nil
}