master
go 73 lines 1.62 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 //go:build linux
4
5 package fail2ban
6
7 import (
8 "errors"
9 "os"
10 "strings"
11 "time"
12
13 "github.com/netdata/netdata/go/plugins/logger"
14 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/ndexec"
15 )
16
17 var errJailNotExist = errors.New("jail not exist")
18
19 const socketPathInDocker = "/host/var/run/fail2ban/fail2ban.sock"
20
21 type fail2banClientCli interface {
22 status() ([]byte, error)
23 jailStatus(s string) ([]byte, error)
24 }
25
26 func newFail2BanClientCliExec(timeout time.Duration, log *logger.Logger) *fail2banClientCliExec {
27 _, err := os.Stat("/host/var/run")
28
29 return &fail2banClientCliExec{
30 Logger: log,
31 timeout: timeout,
32 isInsideDocker: err == nil,
33 }
34 }
35
36 type fail2banClientCliExec struct {
37 *logger.Logger
38
39 timeout time.Duration
40 isInsideDocker bool
41 }
42
43 func (e *fail2banClientCliExec) status() ([]byte, error) {
44 if e.isInsideDocker {
45 return e.execute("fail2ban-client-status-socket",
46 "--socket_path", socketPathInDocker,
47 )
48 }
49 return e.execute("fail2ban-client-status")
50 }
51
52 func (e *fail2banClientCliExec) jailStatus(jail string) ([]byte, error) {
53 if e.isInsideDocker {
54 return e.execute("fail2ban-client-status-jail-socket",
55 "--jail", jail,
56 "--socket_path", socketPathInDocker,
57 )
58 }
59 return e.execute("fail2ban-client-status-jail",
60 "--jail", jail,
61 )
62 }
63
64 func (e *fail2banClientCliExec) execute(cmd string, args ...string) ([]byte, error) {
65 bs, err := ndexec.RunNDSudo(e.Logger, e.timeout, cmd, args...)
66 if err != nil {
67 if strings.HasPrefix(strings.TrimSpace(string(bs)), "Sorry but the jail") {
68 return nil, errJailNotExist
69 }
70 return nil, err
71 }
72 return bs, err
73 }