master
go 121 lines 2.33 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 //go:build linux || freebsd || openbsd || netbsd || dragonfly
4
5 package isc_dhcpd
6
7 import (
8 "context"
9 _ "embed"
10 "errors"
11 "fmt"
12 "time"
13
14 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
15 )
16
17 //go:embed "config_schema.json"
18 var configSchema string
19
20 func init() {
21 collectorapi.Register("isc_dhcpd", collectorapi.Creator{
22 JobConfigSchema: configSchema,
23 Defaults: collectorapi.Defaults{
24 UpdateEvery: 1,
25 },
26 Create: func() collectorapi.CollectorV1 { return New() },
27 Config: func() any { return &Config{} },
28 })
29 }
30
31 func New() *Collector {
32 return &Collector{
33 Config: Config{
34 LeasesPath: "/var/lib/dhcp/dhcpd.leases",
35 },
36
37 collected: make(map[string]int64),
38 }
39 }
40
41 type (
42 Config struct {
43 UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
44 LeasesPath string `yaml:"leases_path" json:"leases_path"`
45 // TODO: parse config file to extract configured pool
46 Pools []PoolConfig `yaml:"pools" json:"pools"`
47 }
48 PoolConfig struct {
49 Name string `yaml:"name" json:"name"`
50 Networks string `yaml:"networks" json:"networks"`
51 }
52 )
53
54 type Collector struct {
55 collectorapi.Base
56 Config `yaml:",inline" json:""`
57
58 charts *collectorapi.Charts
59
60 pools []ipPool
61 leasesModTime time.Time
62 collected map[string]int64
63 }
64
65 func (c *Collector) Configuration() any {
66 return c.Config
67 }
68
69 func (c *Collector) Init(context.Context) error {
70 err := c.validateConfig()
71 if err != nil {
72 return fmt.Errorf("config validation: %v", err)
73 }
74
75 pools, err := c.initPools()
76 if err != nil {
77 return fmt.Errorf("ip pools init: %v", err)
78 }
79 c.pools = pools
80
81 charts, err := c.initCharts(pools)
82 if err != nil {
83 return fmt.Errorf("charts init: %v", err)
84 }
85 c.charts = charts
86
87 c.Debugf("monitoring leases file: %v", c.Config.LeasesPath)
88 c.Debugf("monitoring ip pools: %v", c.Config.Pools)
89
90 return nil
91 }
92
93 func (c *Collector) Check(context.Context) error {
94 mx, err := c.collect()
95 if err != nil {
96 return err
97 }
98 if len(mx) == 0 {
99 return errors.New("no metrics collected")
100 }
101 return nil
102 }
103
104 func (c *Collector) Charts() *collectorapi.Charts {
105 return c.charts
106 }
107
108 func (c *Collector) Collect(context.Context) map[string]int64 {
109 mx, err := c.collect()
110 if err != nil {
111 c.Error(err)
112 }
113
114 if len(mx) == 0 {
115 return nil
116 }
117
118 return mx
119 }
120
121 func (c *Collector) Cleanup(context.Context) {}