acme-dns/main.go
2022-12-22 12:52:38 +02:00

110 lines
2.7 KiB
Go

package main
import (
"encoding/json"
"flag"
"fmt"
"github.com/acme-dns/acme-dns/pkg/api"
"github.com/acme-dns/acme-dns/pkg/nameserver"
"os"
"syscall"
"github.com/acme-dns/acme-dns/pkg/acmedns"
"github.com/acme-dns/acme-dns/pkg/database"
"go.uber.org/zap"
)
func setupLogging(config acmedns.AcmeDnsConfig) (*zap.Logger, error) {
var logger *zap.Logger
logformat := "console"
if config.Logconfig.Format == "json" {
logformat = "json"
}
outputPath := "stdout"
if config.Logconfig.Logtype == "file" {
outputPath = config.Logconfig.File
}
errorPath := "stderr"
if config.Logconfig.Logtype == "file" {
errorPath = config.Logconfig.File
}
zapConfigJson := fmt.Sprintf(`{
"level": "%s",
"encoding": "%s",
"outputPaths": ["%s"],
"errorOutputPaths": ["%s"],
"encoderConfig": {
"timeKey": "time",
"messageKey": "msg",
"levelKey": "level",
"levelEncoder": "lowercase",
"timeEncoder": "iso8601"
}
}`, config.Logconfig.Level, logformat, outputPath, errorPath)
var zapCfg zap.Config
if err := json.Unmarshal([]byte(zapConfigJson), &zapCfg); err != nil {
return logger, err
}
logger, err := zapCfg.Build()
return logger, err
}
func readConfig(configFile string) (acmedns.AcmeDnsConfig, string, error) {
var usedConfigFile string
var config acmedns.AcmeDnsConfig
var err error
if acmedns.FileIsAccessible(configFile) {
usedConfigFile = configFile
config, err = acmedns.ReadConfig(configFile)
} else if acmedns.FileIsAccessible("./config.cfg") {
usedConfigFile = "./config.cfg"
config, err = acmedns.ReadConfig("./config.cfg")
} else {
err = fmt.Errorf("configuration file not found")
}
if err != nil {
err = fmt.Errorf("encountered an error while trying to read configuration file: %s\n", err)
}
return config, usedConfigFile, err
}
func main() {
syscall.Umask(0077)
configPtr := flag.String("c", "/etc/acme-dns/config.cfg", "config file location")
flag.Parse()
// Read global config
var err error
var logger *zap.Logger
config, usedConfigFile, err := readConfig(*configPtr)
if err != nil {
fmt.Printf("Error: %s\n", err)
os.Exit(1)
}
logger, err = setupLogging(config)
if err != nil {
fmt.Printf("Could not set up logging: %s\n", err)
os.Exit(1)
}
defer logger.Sync()
sugar := logger.Sugar()
sugar.Infow("Using config file",
"file", usedConfigFile)
sugar.Info("Starting up")
db, err := database.Init(&config, sugar)
// Error channel for servers
errChan := make(chan error, 1)
api := api.Init(&config, db, sugar, errChan)
dnsservers := nameserver.InitAndStart(&config, db, sugar, errChan)
go api.Start(dnsservers)
if err != nil {
sugar.Error(err)
}
for {
err = <-errChan
if err != nil {
sugar.Fatal(err)
}
}
}