github.com/netdata/go.d.plugin@v0.58.1/modules/isc_dhcpd/isc_dhcpd.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package isc_dhcpd
     4  
     5  import (
     6  	_ "embed"
     7  	"time"
     8  
     9  	"github.com/netdata/go.d.plugin/agent/module"
    10  )
    11  
    12  //go:embed "config_schema.json"
    13  var configSchema string
    14  
    15  func init() {
    16  	module.Register("isc_dhcpd", module.Creator{
    17  		JobConfigSchema: configSchema,
    18  		Defaults: module.Defaults{
    19  			UpdateEvery: 1,
    20  		},
    21  		Create: func() module.Module { return New() },
    22  	})
    23  }
    24  
    25  type (
    26  	Config struct {
    27  		LeasesPath string       `yaml:"leases_path"`
    28  		Pools      []PoolConfig `yaml:"pools"`
    29  	}
    30  	PoolConfig struct {
    31  		Name     string `yaml:"name"`
    32  		Networks string `yaml:"networks"`
    33  	}
    34  )
    35  
    36  type DHCPd struct {
    37  	module.Base
    38  	Config `yaml:",inline"`
    39  
    40  	charts        *module.Charts
    41  	pools         []ipPool
    42  	leasesModTime time.Time
    43  	collected     map[string]int64
    44  }
    45  
    46  func New() *DHCPd {
    47  	return &DHCPd{
    48  		Config: Config{
    49  			LeasesPath: "/var/lib/dhcp/dhcpd.leases",
    50  		},
    51  
    52  		collected: make(map[string]int64),
    53  	}
    54  }
    55  
    56  func (DHCPd) Cleanup() {}
    57  
    58  func (d *DHCPd) Init() bool {
    59  	err := d.validateConfig()
    60  	if err != nil {
    61  		d.Errorf("config validation: %v", err)
    62  		return false
    63  	}
    64  
    65  	pools, err := d.initPools()
    66  	if err != nil {
    67  		d.Errorf("ip pools init: %v", err)
    68  		return false
    69  	}
    70  	d.pools = pools
    71  
    72  	charts, err := d.initCharts(pools)
    73  	if err != nil {
    74  		d.Errorf("charts init: %v", err)
    75  		return false
    76  	}
    77  	d.charts = charts
    78  
    79  	d.Debugf("monitoring leases file: %v", d.Config.LeasesPath)
    80  	d.Debugf("monitoring ip pools: %v", d.Config.Pools)
    81  	return true
    82  }
    83  
    84  func (d *DHCPd) Check() bool {
    85  	return len(d.Collect()) > 0
    86  }
    87  
    88  func (d *DHCPd) Charts() *module.Charts {
    89  	return d.charts
    90  }
    91  
    92  func (d *DHCPd) Collect() map[string]int64 {
    93  	mx, err := d.collect()
    94  	if err != nil {
    95  		d.Error(err)
    96  	}
    97  
    98  	if len(mx) == 0 {
    99  		return nil
   100  	}
   101  
   102  	return mx
   103  }