@@ -12,6 +12,7 @@ import (
1212 "github.com/Luzilla/dnsbl_exporter/internal/index"
1313 "github.com/Luzilla/dnsbl_exporter/internal/metrics"
1414 "github.com/Luzilla/dnsbl_exporter/internal/prober"
15+ "github.com/Luzilla/dnsbl_exporter/internal/resolvconf"
1516 "github.com/Luzilla/dnsbl_exporter/internal/setup"
1617 "github.com/Luzilla/dnsbl_exporter/pkg/dns"
1718 "github.com/prometheus/client_golang/prometheus/collectors"
3031 resolver string
3132)
3233
34+ const resolvConfFile = "/etc/resolv.conf"
35+
3336// NewApp ...
3437func NewApp (name string , version string ) DNSBLApp {
3538 appName = name
@@ -42,7 +45,7 @@ func NewApp(name string, version string) DNSBLApp {
4245 & cli.StringFlag {
4346 Name : "config.dns-resolver" ,
4447 Value : "127.0.0.1:53" ,
45- Usage : "IP address[:port] of the resolver to use." ,
48+ Usage : "IP address[:port] of the resolver to use, use `system` to use a resolve from " + resolvConfFile ,
4649 EnvVars : []string {"DNSBL_EXP_RESOLVER" },
4750 Destination : & resolver ,
4851 },
@@ -102,6 +105,17 @@ func NewApp(name string, version string) DNSBLApp {
102105 return nil
103106 },
104107 },
108+ & cli.StringFlag {
109+ Name : "log.format" ,
110+ Value : "text" ,
111+ Usage : "format, text is logfmt or use json" ,
112+ Action : func (cCtx * cli.Context , v string ) error {
113+ if v != "text" && v != "json" {
114+ return cli .Exit ("We currently support only text and json: --log.format" , 2 )
115+ }
116+ return nil
117+ },
118+ },
105119 }
106120
107121 return DNSBLApp {
@@ -110,29 +124,36 @@ func NewApp(name string, version string) DNSBLApp {
110124}
111125
112126func (a * DNSBLApp ) Bootstrap () {
113- a .App .Action = func (ctx * cli.Context ) error {
127+ a .App .Action = func (cCtx * cli.Context ) error {
114128 // setup logging
115129 handler := & slog.HandlerOptions {}
116130 var writer io.Writer
117131
118- if ctx .Bool ("log.debug" ) {
132+ if cCtx .Bool ("log.debug" ) {
119133 handler .Level = slog .LevelDebug
120134 }
121135
122- switch ctx .String ("log.output" ) {
136+ switch cCtx .String ("log.output" ) {
123137 case "stdout" :
124138 writer = os .Stdout
125139 case "stderr" :
126140 writer = os .Stderr
127141 }
128142
129- log := slog .New (handler .NewTextHandler (writer ))
143+ var logHandler slog.Handler
144+ if cCtx .String ("log.format" ) == "text" {
145+ logHandler = handler .NewTextHandler (writer )
146+ } else {
147+ logHandler = handler .NewJSONHandler (writer )
148+ }
149+
150+ log := slog .New (logHandler )
130151
131152 c := config.Config {
132153 Logger : log .With ("area" , "config" ),
133154 }
134155
135- cfgRbls , err := c .LoadFile (ctx .String ("config.rbls" ))
156+ cfgRbls , err := c .LoadFile (cCtx .String ("config.rbls" ))
136157 if err != nil {
137158 return err
138159 }
@@ -142,7 +163,7 @@ func (a *DNSBLApp) Bootstrap() {
142163 return fmt .Errorf ("unable to load the rbls from the config: %w" , err )
143164 }
144165
145- cfgTargets , err := c .LoadFile (ctx .String ("config.targets" ))
166+ cfgTargets , err := c .LoadFile (cCtx .String ("config.targets" ))
146167 if err != nil {
147168 return err
148169 }
@@ -155,6 +176,22 @@ func (a *DNSBLApp) Bootstrap() {
155176 log .Info ("starting exporter without targets — check the /prober endpoint or correct the .ini file" )
156177 }
157178
179+ // use the system's resolver
180+ if resolver == "system" {
181+ log .Info ("fetching resolver from " + resolvConfFile )
182+ servers , err := resolvconf .GetServers (resolvConfFile )
183+ if err != nil {
184+ return err
185+ }
186+ if len (servers ) == 0 {
187+ return fmt .Errorf ("unable to return a server from %s" , resolvConfFile )
188+ }
189+
190+ // pick the first
191+ resolver = servers [0 ]
192+ log .Info ("using resolver: " + resolver )
193+ }
194+
158195 iHandler := index.IndexHandler {
159196 Name : appName ,
160197 Version : appVersion ,
@@ -174,12 +211,12 @@ func (a *DNSBLApp) Bootstrap() {
174211 return err
175212 }
176213
177- rblCollector := setup .CreateCollector (rbls , targets , ctx .Bool ("config.domain-based" ), dnsUtil , log .With ("area" , "metrics" ))
214+ rblCollector := setup .CreateCollector (rbls , targets , cCtx .Bool ("config.domain-based" ), dnsUtil , log .With ("area" , "metrics" ))
178215 registry .MustRegister (rblCollector )
179216
180217 registryExporter := setup .CreateRegistry ()
181218
182- if ctx .Bool ("web.include-exporter-metrics" ) {
219+ if cCtx .Bool ("web.include-exporter-metrics" ) {
183220 log .Info ("Exposing exporter metrics" )
184221
185222 registryExporter .MustRegister (
@@ -193,21 +230,21 @@ func (a *DNSBLApp) Bootstrap() {
193230 RegistryExporter : registryExporter ,
194231 }
195232
196- http .Handle (ctx .String ("web.telemetry-path" ), mHandler .Handler ())
233+ http .Handle (cCtx .String ("web.telemetry-path" ), mHandler .Handler ())
197234
198235 pHandler := prober.ProberHandler {
199236 DNS : dnsUtil ,
200237 Rbls : rbls ,
201- DomainBased : ctx .Bool ("config.domain-based" ),
238+ DomainBased : cCtx .Bool ("config.domain-based" ),
202239 Logger : log .With ("area" , "prober" ),
203240 }
204241 http .Handle ("/prober" , pHandler )
205242
206243 log .Info ("starting exporter" ,
207- slog .String ("web.listen-address" , ctx .String ("web.listen-address" )),
244+ slog .String ("web.listen-address" , cCtx .String ("web.listen-address" )),
208245 slog .String ("resolver" , resolver ),
209246 )
210- err = http .ListenAndServe (ctx .String ("web.listen-address" ), nil )
247+ err = http .ListenAndServe (cCtx .String ("web.listen-address" ), nil )
211248 if err != nil {
212249 return err
213250 }
0 commit comments