11package config
22
33import (
4+ "errors"
45 "github.com/betterde/cdns/internal/journal"
56 "github.com/spf13/viper"
67 "os"
@@ -13,77 +14,76 @@ const TLSModeFile = "file"
1314var Conf * Config
1415
1516type Config struct {
16- NS NS `yaml:"ns"`
17- SOA SOA `yaml:"soa"`
18- DNS DNS `yaml:"dns"`
19- HTTP HTTP `yaml:"http"`
20- Ingress Ingress `yaml:"ingress"`
21- Logging Logging `yaml:"logging"`
22- Providers Providers `yaml:"providers"`
17+ NS NS `yaml:"ns" mapstructure:"NS" `
18+ SOA SOA `yaml:"soa" mapstructure:"SOA" `
19+ DNS DNS `yaml:"dns" mapstructure:"DNS" `
20+ HTTP HTTP `yaml:"http" mapstructure:"HTTP" `
21+ Ingress Ingress `yaml:"ingress" mapstructure:"INGRESS" `
22+ Logging Logging `yaml:"logging" mapstructure:"LOGGING" `
23+ Providers Providers `yaml:"providers" mapstructure:"PROVIDERS" `
2324}
2425
2526type NS struct {
26- IP string `yaml:"ip"`
27+ IP string `yaml:"ip" mapstructure:"IP" `
2728}
2829
2930type Logging struct {
30- Level string `yaml:"level"`
31+ Level string `yaml:"level" mapstructure:"LEVEL" `
3132}
3233
3334type DNS struct {
34- Admin string `yaml:"admin"`
35- Listen string `yaml:"listen"`
36- NSName string `yaml:"nsname"`
37- Records map [string ]Record `yaml:"records"`
38- Protocol string `yaml:"protocol"`
35+ Admin string `yaml:"admin" mapstructure:"ADMIN" `
36+ Listen string `yaml:"listen" mapstructure:"LISTEN" `
37+ NSName string `yaml:"nsname" mapstructure:"NSNAME" `
38+ Records map [string ]Record `yaml:"records" mapstructure:"RECORDS" `
39+ Protocol string `yaml:"protocol" mapstructure:"PROTOCOL" `
3940}
4041
4142type HTTP struct {
42- TLS TLS `yaml:"tls"`
43- Domain string `yaml:"domain"`
44- Listen string `yaml:"listen"`
45- Username string `yaml:"username"`
46- Password string `yaml:"password"`
43+ TLS TLS `yaml:"tls" mapstructure:"TLS"`
44+ Domain string `yaml:"domain" mapstructure:"DOMAIN"`
45+ Listen string `yaml:"listen" mapstructure:"LISTEN"`
4746}
4847
4948type Record struct {
50- Type string `yaml:"type"`
51- Value string `yaml:"value"`
49+ Type string `yaml:"type" mapstructure:"TYPE" `
50+ Value string `yaml:"value" mapstructure:"VALUE" `
5251}
5352
5453type Ingress struct {
55- IP string `yaml:"ip"`
54+ IP string `yaml:"ip" mapstructure:"IP" `
5655}
5756
5857type Providers struct {
59- ACME ACME `yaml:"acme"`
60- File File `yaml:"file"`
58+ ACME ACME `yaml:"acme" mapstructure:"ACME" `
59+ File File `yaml:"file" mapstructure:"FILE" `
6160}
6261
6362type TLS struct {
64- Mode string `yaml:"mode"`
63+ Mode string `yaml:"mode" mapstructure:"MODE" `
6564}
6665
6766type SOA struct {
68- Domain string `yaml:"domain"`
67+ Domain string `yaml:"domain" mapstructure:"DOMAIN" `
6968}
7069
7170type ACME struct {
72- Email string `yaml:"email"`
73- Server string `yaml:"server"`
74- Storage string `yaml:"storage"`
71+ Email string `yaml:"email" mapstructure:"EMAIL" `
72+ Server string `yaml:"server" mapstructure:"SERVER" `
73+ Storage string `yaml:"storage" mapstructure:"STORAGE" `
7574}
7675
7776type File struct {
78- TLSKey string `yaml:"tlsKey"`
79- TLSCert string `yaml:"tlsCert"`
77+ TLSKey string `yaml:"tlsKey" mapstructure:"TLSKEY" `
78+ TLSCert string `yaml:"tlsCert" mapstructure:"TLSCERT" `
8079}
8180
8281func Parse (file string ) {
8382 if file != "" {
8483 viper .SetConfigFile (file )
8584 } else {
8685 viper .AddConfigPath ("." )
86+ viper .SetConfigType ("yaml" )
8787 viper .SetConfigName (".cdns" )
8888 viper .AddConfigPath ("/etc/cdns" )
8989 }
@@ -92,10 +92,94 @@ func Parse(file string) {
9292 viper .SetEnvKeyReplacer (strings .NewReplacer ("." , "_" ))
9393 viper .SetEnvPrefix ("CDNS" )
9494
95+ var notFoundError viper.ConfigFileNotFoundError
96+
9597 // If a config file is found, read it in.
96- if err := viper .ReadInConfig (); err != nil {
97- journal .Logger .Sugar ().Errorf ("Failed to read configuration file: %s" , err )
98- os .Exit (1 )
98+ if err := viper .ReadInConfig (); err != nil && errors .As (err , & notFoundError ) {
99+ viper .SetDefault ("DNS.LISTEN" , "0.0.0.0:53" )
100+ viper .SetDefault ("DNS.PROTOCOL" , "both" )
101+ viper .SetDefault ("HTTP.LISTEN" , "0.0.0.0:443" )
102+ viper .SetDefault ("LOGGING.LEVEL" , "DEBUG" )
103+
104+ err = viper .BindEnv ("NS.IP" , "CDNS_NS_IP" )
105+ if err != nil {
106+ journal .Logger .Sugar ().Error (err )
107+ }
108+
109+ err = viper .BindEnv ("DNS.ADMIN" , "CDNS_DNS_ADMIN" )
110+ if err != nil {
111+ journal .Logger .Sugar ().Error (err )
112+ }
113+
114+ err = viper .BindEnv ("DNS.NSNAME" , "CDNS_DNS_NSNAME" )
115+ if err != nil {
116+ journal .Logger .Sugar ().Error (err )
117+ }
118+
119+ err = viper .BindEnv ("DNS.LISTEN" , "CDNS_DNS_LISTEN" )
120+ if err != nil {
121+ journal .Logger .Sugar ().Error (err )
122+ }
123+
124+ err = viper .BindEnv ("DNS.PROTOCOL" , "CDNS_DNS_PROTOCOL" )
125+ if err != nil {
126+ journal .Logger .Sugar ().Error (err )
127+ }
128+
129+ err = viper .BindEnv ("SOA.DOMAIN" , "CDNS_SOA_DOMAIN" )
130+ if err != nil {
131+ journal .Logger .Sugar ().Error (err )
132+ }
133+
134+ err = viper .BindEnv ("HTTP.TLS.MODE" , "CDNS_HTTP_TLS_MODE" )
135+ if err != nil {
136+ journal .Logger .Sugar ().Error (err )
137+ }
138+
139+ err = viper .BindEnv ("HTTP.DOMAIN" , "CDNS_HTTP_DOMAIN" )
140+ if err != nil {
141+ journal .Logger .Sugar ().Error (err )
142+ }
143+
144+ err = viper .BindEnv ("HTTP.LISTEN" , "CDNS_HTTP_LISTEN" )
145+ if err != nil {
146+ journal .Logger .Sugar ().Error (err )
147+ }
148+
149+ err = viper .BindEnv ("INGRESS.IP" , "CDNS_INGRESS_IP" )
150+ if err != nil {
151+ journal .Logger .Sugar ().Error (err )
152+ }
153+
154+ err = viper .BindEnv ("LOGGING.LEVEL" , "CDNS_LOGGING_LEVEL" )
155+ if err != nil {
156+ journal .Logger .Sugar ().Error (err )
157+ }
158+
159+ err = viper .BindEnv ("PROVIDERS.ACME.EMAIL" , "CDNS_PROVIDERS_ACME_EMAIL" )
160+ if err != nil {
161+ journal .Logger .Sugar ().Error (err )
162+ }
163+
164+ err = viper .BindEnv ("PROVIDERS.ACME.SERVER" , "CDNS_PROVIDERS_ACME_SERVER" )
165+ if err != nil {
166+ journal .Logger .Sugar ().Error (err )
167+ }
168+
169+ err = viper .BindEnv ("PROVIDERS.ACME.STORAGE" , "CDNS_PROVIDERS_ACME_STORAGE" )
170+ if err != nil {
171+ journal .Logger .Sugar ().Error (err )
172+ }
173+
174+ err = viper .BindEnv ("PROVIDERS.FILE.TLSKEY" , "CDNS_PROVIDERS_FILE_TLSKEY" )
175+ if err != nil {
176+ journal .Logger .Sugar ().Error (err )
177+ }
178+
179+ err = viper .BindEnv ("PROVIDERS.FILE.TLSCERT" , "CDNS_PROVIDERS_FILE_TLSCERT" )
180+ if err != nil {
181+ journal .Logger .Sugar ().Error (err )
182+ }
99183 }
100184
101185 // read in environment variables that match
0 commit comments