mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2025-01-12 17:07:23 +03:00
aa872dfe98
Updates #4923.
Squashed commit of the following:
commit 14ae8dc3680eae7d3ecb9e37a44c2e68221c5085
Merge: 280a4dbc7 713901c2a
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Jan 31 13:52:52 2024 +0300
Merge branch 'master' into 4923-gopacket-dhcp-vol.6
commit 280a4dbc728ff67c7659f91734a74c87bf0bda43
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Jan 30 20:20:04 2024 +0300
dhcpsvc: imp docs
commit 310ed67b9bf22f88c4414095bfbfc1a29c6db6d5
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Jan 30 18:51:49 2024 +0300
dhcpsvc: generalize
commit e4c2cae73a729be4db244d3042d93fcc9742bb34
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Tue Jan 30 12:37:38 2024 +0300
dhcpsvc: imp code
commit 9a60d3529293ce1f0e8da70da05958f81e1d0092
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Fri Jan 26 16:28:04 2024 +0300
dhcpsvc: imp code
commit 120c0472f3a3df2ebc0495a40936c8f94156db4b
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Jan 25 20:44:09 2024 +0300
dhcpsvc: imp code, names, docs
commit a92f44c75279868d8e07fe7d468278025a245d13
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Wed Jan 24 16:01:35 2024 +0300
dhcpsvc: imp code, docs
commit 18b3f237b7523f649b49563e852c298fe02fa8ae
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date: Thu Jan 18 15:29:36 2024 +0300
dhcpsvc: add some lease-related methods
109 lines
3.7 KiB
Go
109 lines
3.7 KiB
Go
// Package dhcpsvc contains the AdGuard Home DHCP service.
|
|
//
|
|
// TODO(e.burkov): Add tests.
|
|
package dhcpsvc
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"net/netip"
|
|
|
|
"github.com/AdguardTeam/AdGuardHome/internal/next/agh"
|
|
)
|
|
|
|
// Interface is a DHCP service.
|
|
//
|
|
// TODO(e.burkov): Separate HostByIP, MACByIP, IPByHost into a separate
|
|
// interface. This is also valid for Enabled method.
|
|
type Interface interface {
|
|
agh.ServiceWithConfig[*Config]
|
|
|
|
// Enabled returns true if DHCP provides information about clients.
|
|
Enabled() (ok bool)
|
|
|
|
// HostByIP returns the hostname of the DHCP client with the given IP
|
|
// address. The address will be netip.Addr{} if there is no such client,
|
|
// due to an assumption that a DHCP client must always have an IP address.
|
|
HostByIP(ip netip.Addr) (host string)
|
|
|
|
// MACByIP returns the MAC address for the given IP address leased. It
|
|
// returns nil if there is no such client, due to an assumption that a DHCP
|
|
// client must always have a MAC address.
|
|
MACByIP(ip netip.Addr) (mac net.HardwareAddr)
|
|
|
|
// IPByHost returns the IP address of the DHCP client with the given
|
|
// hostname. The hostname will be an empty string if there is no such
|
|
// client, due to an assumption that a DHCP client must always have a
|
|
// hostname, either set or generated.
|
|
IPByHost(host string) (ip netip.Addr)
|
|
|
|
// Leases returns all the active DHCP leases. The returned slice should be
|
|
// a clone.
|
|
//
|
|
// TODO(e.burkov): Consider implementing iterating methods with appropriate
|
|
// signatures instead of cloning the whole list.
|
|
Leases() (ls []*Lease)
|
|
|
|
// AddLease adds a new DHCP lease. It returns an error if the lease is
|
|
// invalid or already exists.
|
|
AddLease(l *Lease) (err error)
|
|
|
|
// UpdateStaticLease changes an existing DHCP lease. It returns an error if
|
|
// there is no lease with such hardware addressor if new values are invalid
|
|
// or already exist.
|
|
UpdateStaticLease(l *Lease) (err error)
|
|
|
|
// RemoveLease removes an existing DHCP lease. It returns an error if there
|
|
// is no lease equal to l.
|
|
RemoveLease(l *Lease) (err error)
|
|
|
|
// Reset removes all the DHCP leases.
|
|
//
|
|
// TODO(e.burkov): If it's really needed?
|
|
Reset() (err error)
|
|
}
|
|
|
|
// Empty is an [Interface] implementation that does nothing.
|
|
type Empty struct{}
|
|
|
|
// type check
|
|
var _ agh.ServiceWithConfig[*Config] = Empty{}
|
|
|
|
// Start implements the [Service] interface for Empty.
|
|
func (Empty) Start() (err error) { return nil }
|
|
|
|
// Shutdown implements the [Service] interface for Empty.
|
|
func (Empty) Shutdown(_ context.Context) (err error) { return nil }
|
|
|
|
// Config implements the [ServiceWithConfig] interface for Empty.
|
|
func (Empty) Config() (conf *Config) { return nil }
|
|
|
|
// type check
|
|
var _ Interface = Empty{}
|
|
|
|
// Enabled implements the [Interface] interface for Empty.
|
|
func (Empty) Enabled() (ok bool) { return false }
|
|
|
|
// HostByIP implements the [Interface] interface for Empty.
|
|
func (Empty) HostByIP(_ netip.Addr) (host string) { return "" }
|
|
|
|
// MACByIP implements the [Interface] interface for Empty.
|
|
func (Empty) MACByIP(_ netip.Addr) (mac net.HardwareAddr) { return nil }
|
|
|
|
// IPByHost implements the [Interface] interface for Empty.
|
|
func (Empty) IPByHost(_ string) (ip netip.Addr) { return netip.Addr{} }
|
|
|
|
// Leases implements the [Interface] interface for Empty.
|
|
func (Empty) Leases() (leases []*Lease) { return nil }
|
|
|
|
// AddLease implements the [Interface] interface for Empty.
|
|
func (Empty) AddLease(_ *Lease) (err error) { return nil }
|
|
|
|
// UpdateStaticLease implements the [Interface] interface for Empty.
|
|
func (Empty) UpdateStaticLease(_ *Lease) (err error) { return nil }
|
|
|
|
// RemoveLease implements the [Interface] interface for Empty.
|
|
func (Empty) RemoveLease(_ *Lease) (err error) { return nil }
|
|
|
|
// Reset implements the [Interface] interface for Empty.
|
|
func (Empty) Reset() (err error) { return nil }
|