Fix powerdns_recursor socket_mode option (#6572)

This commit is contained in:
Daniel Nelson 2019-10-23 12:50:54 -07:00 committed by GitHub
parent 44ab9b44f8
commit 504ccc25a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 9 deletions

View File

@ -14,6 +14,16 @@ The powerdns plugin gathers metrics about PowerDNS using unix socket.
unix_sockets = ["/var/run/pdns.controlsocket"] unix_sockets = ["/var/run/pdns.controlsocket"]
``` ```
#### Permissions
Telegraf will need read access to the powerdns control socket.
On many systems this can be accomplished by adding the `telegraf` user to the
`pdns` group:
```
usermod telegraf -a -G pdns
```
### Measurements & Fields: ### Measurements & Fields:
- powerdns - powerdns

View File

@ -18,10 +18,11 @@ import (
) )
type PowerdnsRecursor struct { type PowerdnsRecursor struct {
UnixSockets []string UnixSockets []string `toml:"unix_sockets"`
SocketDir string `toml:"socket_dir"`
SocketMode string `toml:"socket_mode"`
SocketDir string `toml:"socket_dir"` mode uint32
SocketMode uint32 `toml:"socket_mode"`
} }
var defaultTimeout = 5 * time.Second var defaultTimeout = 5 * time.Second
@ -45,6 +46,18 @@ func (p *PowerdnsRecursor) Description() string {
return "Read metrics from one or many PowerDNS Recursor servers" return "Read metrics from one or many PowerDNS Recursor servers"
} }
func (p *PowerdnsRecursor) Init() error {
if p.SocketMode != "" {
mode, err := strconv.ParseUint(p.SocketMode, 8, 32)
if err != nil {
return fmt.Errorf("could not parse socket_mode: %v", err)
}
p.mode = uint32(mode)
}
return nil
}
func (p *PowerdnsRecursor) Gather(acc telegraf.Accumulator) error { func (p *PowerdnsRecursor) Gather(acc telegraf.Accumulator) error {
if len(p.UnixSockets) == 0 { if len(p.UnixSockets) == 0 {
return p.gatherServer("/var/run/pdns_recursor.controlsocket", acc) return p.gatherServer("/var/run/pdns_recursor.controlsocket", acc)
@ -79,11 +92,7 @@ func (p *PowerdnsRecursor) gatherServer(address string, acc telegraf.Accumulator
if err != nil { if err != nil {
return err return err
} }
perm := uint32(0666) if err := os.Chmod(recvSocket, os.FileMode(p.mode)); err != nil {
if p.SocketMode > 0 {
perm = p.SocketMode
}
if err := os.Chmod(recvSocket, os.FileMode(perm)); err != nil {
return err return err
} }
defer conn.Close() defer conn.Close()
@ -151,6 +160,8 @@ func parseResponse(metrics string) map[string]interface{} {
func init() { func init() {
inputs.Add("powerdns_recursor", func() telegraf.Input { inputs.Add("powerdns_recursor", func() telegraf.Input {
return &PowerdnsRecursor{} return &PowerdnsRecursor{
mode: uint32(0666),
}
}) })
} }

View File

@ -139,7 +139,10 @@ func TestPowerdnsRecursorGeneratesMetrics(t *testing.T) {
p := &PowerdnsRecursor{ p := &PowerdnsRecursor{
UnixSockets: []string{controlSocket}, UnixSockets: []string{controlSocket},
SocketDir: "/tmp", SocketDir: "/tmp",
SocketMode: "0666",
} }
err = p.Init()
require.NoError(t, err)
var acc testutil.Accumulator var acc testutil.Accumulator