Files
certmanager/internal/config/config.go
Олег Бородин e9d4d1ef07 import sources
2024-07-30 09:49:53 +02:00

163 lines
3.4 KiB
Go

package config
import (
"errors"
"flag"
"fmt"
"os"
"path/filepath"
"certmanager/pkg/client"
yaml "gopkg.in/yaml.v3"
)
const (
defaultUsername = "worker"
defaultPassword = "worker"
defaultHostname = "localhost"
configFilename = "certmanagerd.yaml"
logFilename = "certmanager.log"
pidFilename = "certmanager.pid"
)
var (
buildVersion = "NONE"
)
type WserviceConfig struct {
PortNum int `json:"port" yaml:"port"`
}
type GserviceConfig struct {
PortNum int `json:"port" yaml:"port"`
}
type AuthConfig struct {
Username string `json:"username" yaml:"username"`
Password string `json:"password" yaml:"password"`
}
type Config struct {
Wservice WserviceConfig `json:"wservice" yaml:"wservice"`
Gservice GserviceConfig `json:"gservice" yaml:"gservice"`
Auths []AuthConfig `json:"auths" yaml:"auths"`
Hostname string `json:"hostname" yaml:"hostname"`
Debug bool `json:"debug" yaml:"debug"`
Build string `json:"build" yaml:"build"`
LogPath string `json:"logfile" yaml:"logfile"`
RunPath string `json:"runfile" yaml:"runfile"`
DataDir string `json:"datadir" yaml:"datadir"`
Daemon bool `json:"daemon" yaml:"daemon"`
}
func NewConfig() *Config {
conf := &Config{
Gservice: GserviceConfig{
PortNum: client.DefaultGrpcPort,
},
Wservice: WserviceConfig{
PortNum: client.DefaultWrpcPort,
},
Auths: make([]AuthConfig, 0),
DataDir: datadirPath,
Debug: false,
Hostname: defaultHostname,
Build: buildVersion,
Daemon: true,
}
conf.LogPath = filepath.Join(logdirPath, logFilename)
conf.RunPath = filepath.Join(rundirPath, pidFilename)
return conf
}
func (conf *Config) ReadFile() error {
var err error
configPath := filepath.Join(confdirPath, configFilename)
confBytes, err := os.ReadFile(configPath)
if err != nil {
return err
}
err = yaml.Unmarshal(confBytes, conf)
if err != nil {
return err
}
conf.Normalize()
err = conf.Validate()
if err != nil {
return err
}
return nil
}
func (conf *Config) ReadEnv() error {
var err error
return err
}
func (conf *Config) ReadOpts() error {
var err error
exeName := filepath.Base(os.Args[0])
flag.IntVar(&conf.Wservice.PortNum, "wport", conf.Wservice.PortNum, "wrpc listen port")
flag.IntVar(&conf.Gservice.PortNum, "gport", conf.Gservice.PortNum, "grpc listen port")
flag.BoolVar(&conf.Daemon, "daemon", conf.Daemon, "run as daemon")
flag.BoolVar(&conf.Debug, "debug", conf.Debug, "on debug mode")
help := func() {
fmt.Println("")
fmt.Printf("Usage: %s [option]\n", exeName)
fmt.Println("")
fmt.Println("Options:")
flag.PrintDefaults()
fmt.Println("")
}
flag.Usage = help
flag.Parse()
return err
}
func (conf *Config) Yaml() (string, error) {
var err error
var res string
yamlBytes, err := yaml.Marshal(conf)
if err != nil {
return res, err
}
res = string(yamlBytes)
return res, err
}
func (conf *Config) Normalize() {
if conf.Gservice.PortNum == 0 {
conf.Gservice.PortNum = client.DefaultGrpcPort
}
if conf.Wservice.PortNum == 0 {
conf.Wservice.PortNum = client.DefaultWrpcPort
}
}
func (conf *Config) Validate() error {
var err []error
for i := range conf.Auths {
if conf.Auths[i].Username == "" {
err = append(err, errors.New("Username must be set"))
}
if conf.Auths[i].Password == "" {
err = append(err, errors.New("Password must be set"))
}
}
return errors.Join(err...)
}