Skip to content

Commit

Permalink
all: rm old leases type
Browse files Browse the repository at this point in the history
  • Loading branch information
EugeneOne1 committed Nov 13, 2023
1 parent b1b7b1c commit 8d218b7
Show file tree
Hide file tree
Showing 15 changed files with 232 additions and 230 deletions.
13 changes: 7 additions & 6 deletions internal/dhcpd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
"github.com/AdguardTeam/AdGuardHome/internal/aghnet"
"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
"github.com/AdguardTeam/golibs/errors"
)

Expand Down Expand Up @@ -49,16 +50,16 @@ type ServerConfig struct {
// DHCPServer - DHCP server interface
type DHCPServer interface {
// ResetLeases resets leases.
ResetLeases(leases []*Lease) (err error)
ResetLeases(leases []*dhcpsvc.Lease) (err error)
// GetLeases returns deep clones of the current leases.
GetLeases(flags GetLeasesFlags) (leases []*Lease)
GetLeases(flags GetLeasesFlags) (leases []*dhcpsvc.Lease)
// AddStaticLease - add a static lease
AddStaticLease(l *Lease) (err error)
AddStaticLease(l *dhcpsvc.Lease) (err error)
// RemoveStaticLease - remove a static lease
RemoveStaticLease(l *Lease) (err error)
RemoveStaticLease(l *dhcpsvc.Lease) (err error)

// UpdateStaticLease updates IP, hostname of the lease.
UpdateStaticLease(l *Lease) (err error)
UpdateStaticLease(l *dhcpsvc.Lease) (err error)

// FindMACbyIP returns a MAC address by the IP address of its lease, if
// there is one.
Expand All @@ -81,7 +82,7 @@ type DHCPServer interface {
Start() (err error)
// Stop - stop server
Stop() (err error)
getLeasesRef() []*Lease
getLeasesRef() []*dhcpsvc.Lease
}

// V4ServerConf - server configuration
Expand Down
13 changes: 7 additions & 6 deletions internal/dhcpd/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"os"
"strings"

"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
"github.com/AdguardTeam/golibs/errors"
"github.com/AdguardTeam/golibs/log"
"github.com/google/renameio/v2/maybe"
Expand All @@ -28,7 +29,7 @@ type dataLeases struct {
Version int `json:"version"`

// Leases is the list containing stored DHCP leases.
Leases []*Lease `json:"leases"`
Leases []*dhcpsvc.Lease `json:"leases"`
}

// dbLoad loads stored leases.
Expand All @@ -50,8 +51,8 @@ func (s *server) dbLoad() (err error) {

leases := dl.Leases

leases4 := []*Lease{}
leases6 := []*Lease{}
leases4 := []*dhcpsvc.Lease{}
leases6 := []*dhcpsvc.Lease{}

for _, l := range leases {
if l.IP.Is4() {
Expand Down Expand Up @@ -83,7 +84,7 @@ func (s *server) dbLoad() (err error) {
func (s *server) dbStore() (err error) {
// Use an empty slice here as opposed to nil so that it doesn't write
// "null" into the database file if leases are empty.
leases := []*Lease{}
leases := []*dhcpsvc.Lease{}

leases4 := s.srv4.getLeasesRef()
leases = append(leases, leases4...)
Expand All @@ -97,10 +98,10 @@ func (s *server) dbStore() (err error) {
}

// writeDB writes leases to file at path.
func writeDB(path string, leases []*Lease) (err error) {
func writeDB(path string, leases []*dhcpsvc.Lease) (err error) {
defer func() { err = errors.Annotate(err, "writing db: %w") }()

slices.SortFunc(leases, func(a, b *Lease) (res int) {
slices.SortFunc(leases, func(a, b *dhcpsvc.Lease) (res int) {
return strings.Compare(a.Hostname, b.Hostname)
})

Expand Down
103 changes: 1 addition & 102 deletions internal/dhcpd/dhcpd.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
package dhcpd

import (
"encoding/json"
"fmt"
"net"
"net/netip"
Expand All @@ -12,7 +11,6 @@ import (
"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
"github.com/AdguardTeam/golibs/log"
"github.com/AdguardTeam/golibs/timeutil"
"golang.org/x/exp/slices"
)

const (
Expand All @@ -29,105 +27,6 @@ const (
defaultBackoff time.Duration = 500 * time.Millisecond
)

// Lease contains the necessary information about a DHCP lease. It's used as is
// in the database, so don't change it until it's absolutely necessary, see
// [dataVersion].
//
// TODO(e.burkov): Unexport it and use [dhcpsvc.Lease].
type Lease struct {
// Expiry is the expiration time of the lease.
Expiry time.Time `json:"expires"`

// Hostname of the client.
Hostname string `json:"hostname"`

// HWAddr is the physical hardware address (MAC address).
HWAddr net.HardwareAddr `json:"mac"`

// IP is the IP address leased to the client.
IP netip.Addr `json:"ip"`

// IsStatic defines if the lease is static.
IsStatic bool `json:"static"`
}

// Clone returns a deep copy of l.
func (l *Lease) Clone() (clone *Lease) {
if l == nil {
return nil
}

return &Lease{
Expiry: l.Expiry,
Hostname: l.Hostname,
HWAddr: slices.Clone(l.HWAddr),
IP: l.IP,
IsStatic: l.IsStatic,
}
}

// IsBlocklisted returns true if the lease is blocklisted.
//
// TODO(a.garipov): Just make it a boolean field.
func (l *Lease) IsBlocklisted() (ok bool) {
if len(l.HWAddr) == 0 {
return false
}

for _, b := range l.HWAddr {
if b != 0 {
return false
}
}

return true
}

// MarshalJSON implements the json.Marshaler interface for Lease.
func (l Lease) MarshalJSON() ([]byte, error) {
var expiryStr string
if !l.IsStatic {
// The front-end is waiting for RFC 3999 format of the time
// value. It also shouldn't got an Expiry field for static
// leases.
//
// See https://github.com/AdguardTeam/AdGuardHome/issues/2692.
expiryStr = l.Expiry.Format(time.RFC3339)
}

type lease Lease
return json.Marshal(&struct {
HWAddr string `json:"mac"`
Expiry string `json:"expires,omitempty"`
lease
}{
HWAddr: l.HWAddr.String(),
Expiry: expiryStr,
lease: lease(l),
})
}

// UnmarshalJSON implements the json.Unmarshaler interface for *Lease.
func (l *Lease) UnmarshalJSON(data []byte) (err error) {
type lease Lease
aux := struct {
*lease
HWAddr string `json:"mac"`
}{
lease: (*lease)(l),
}
if err = json.Unmarshal(data, &aux); err != nil {
return err
}

l.HWAddr, err = net.ParseMAC(aux.HWAddr)
if err != nil {
return fmt.Errorf("couldn't parse MAC address: %w", err)
}

return nil
}

// OnLeaseChangedT is a callback for lease changes.
type OnLeaseChangedT func(flags int)

Expand Down Expand Up @@ -414,6 +313,6 @@ func (s *server) IPByHost(host string) (ip netip.Addr) {
}

// AddStaticLease - add static v4 lease
func (s *server) AddStaticLease(l *Lease) error {
func (s *server) AddStaticLease(l *dhcpsvc.Lease) error {
return s.srv4.AddStaticLease(l)
}
3 changes: 2 additions & 1 deletion internal/dhcpd/dhcpd_unix_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"testing"
"time"

"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
"github.com/AdguardTeam/golibs/testutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -44,7 +45,7 @@ func TestDB(t *testing.T) {
s.srv6, err = v6Create(V6ServerConf{})
require.NoError(t, err)

leases := []*Lease{{
leases := []*dhcpsvc.Lease{{
Expiry: time.Now().Add(time.Hour),
Hostname: "static-1.local",
HWAddr: net.HardwareAddr{0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA},
Expand Down
6 changes: 3 additions & 3 deletions internal/dhcpd/http_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,13 @@ func leasesToStatic(leases []*dhcpsvc.Lease) (static []*leaseStatic) {
}

// toLease converts leaseStatic to Lease or returns error.
func (l *leaseStatic) toLease() (lease *Lease, err error) {
func (l *leaseStatic) toLease() (lease *dhcpsvc.Lease, err error) {
addr, err := net.ParseMAC(l.HWAddr)
if err != nil {
return nil, fmt.Errorf("couldn't parse MAC address: %w", err)
}

return &Lease{
return &dhcpsvc.Lease{
HWAddr: addr,
IP: l.IP,
Hostname: l.Hostname,
Expand Down Expand Up @@ -593,7 +593,7 @@ func setOtherDHCPResult(ifaceName string, result *dhcpSearchResult) {

// parseLease parses a lease from r. If there is no error returns DHCPServer
// and *Lease. r must be non-nil.
func (s *server) parseLease(r io.Reader) (srv DHCPServer, lease *Lease, err error) {
func (s *server) parseLease(r io.Reader) (srv DHCPServer, lease *dhcpsvc.Lease, err error) {
l := &leaseStatic{}
err = json.NewDecoder(r).Decode(l)
if err != nil {
Expand Down
5 changes: 3 additions & 2 deletions internal/dhcpd/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"path/filepath"
"time"

"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
"github.com/AdguardTeam/golibs/errors"
"github.com/AdguardTeam/golibs/log"
)
Expand Down Expand Up @@ -76,7 +77,7 @@ func migrateDB(conf *ServerConfig) (err error) {
return err
}

leases := []*Lease{}
leases := []*dhcpsvc.Lease{}

for _, lj := range ljs {
lj.IP = normalizeIP(lj.IP)
Expand All @@ -88,7 +89,7 @@ func migrateDB(conf *ServerConfig) (err error) {
continue
}

lease := &Lease{
lease := &dhcpsvc.Lease{
Expiry: time.Unix(lj.Expiry, 0),
Hostname: lj.Hostname,
HWAddr: lj.HWAddr,
Expand Down
3 changes: 2 additions & 1 deletion internal/dhcpd/migrate_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"testing"
"time"

"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
Expand All @@ -27,7 +28,7 @@ func TestMigrateDB(t *testing.T) {
err := os.WriteFile(oldLeasesPath, []byte(testData), 0o644)
require.NoError(t, err)

wantLeases := []*Lease{{
wantLeases := []*dhcpsvc.Lease{{
Expiry: time.Time{},
Hostname: "test1",
HWAddr: net.HardwareAddr{0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
Expand Down
28 changes: 15 additions & 13 deletions internal/dhcpd/v46_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,28 @@ package dhcpd
import (
"net"
"net/netip"

"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
)

type winServer struct{}

// type check
var _ DHCPServer = winServer{}

func (winServer) ResetLeases(_ []*Lease) (err error) { return nil }
func (winServer) GetLeases(_ GetLeasesFlags) (leases []*Lease) { return nil }
func (winServer) getLeasesRef() []*Lease { return nil }
func (winServer) AddStaticLease(_ *Lease) (err error) { return nil }
func (winServer) RemoveStaticLease(_ *Lease) (err error) { return nil }
func (winServer) UpdateStaticLease(_ *Lease) (err error) { return nil }
func (winServer) FindMACbyIP(_ netip.Addr) (mac net.HardwareAddr) { return nil }
func (winServer) WriteDiskConfig4(_ *V4ServerConf) {}
func (winServer) WriteDiskConfig6(_ *V6ServerConf) {}
func (winServer) Start() (err error) { return nil }
func (winServer) Stop() (err error) { return nil }
func (winServer) HostByIP(_ netip.Addr) (host string) { return "" }
func (winServer) IPByHost(_ string) (ip netip.Addr) { return netip.Addr{} }
func (winServer) ResetLeases(_ []*dhcpsvc.Lease) (err error) { return nil }
func (winServer) GetLeases(_ GetLeasesFlags) (leases []*dhcpsvc.Lease) { return nil }
func (winServer) getLeasesRef() []*dhcpsvc.Lease { return nil }
func (winServer) AddStaticLease(_ *dhcpsvc.Lease) (err error) { return nil }
func (winServer) RemoveStaticLease(_ *dhcpsvc.Lease) (err error) { return nil }
func (winServer) UpdateStaticLease(_ *dhcpsvc.Lease) (err error) { return nil }
func (winServer) FindMACbyIP(_ netip.Addr) (mac net.HardwareAddr) { return nil }
func (winServer) WriteDiskConfig4(_ *V4ServerConf) {}
func (winServer) WriteDiskConfig6(_ *V6ServerConf) {}
func (winServer) Start() (err error) { return nil }
func (winServer) Stop() (err error) { return nil }
func (winServer) HostByIP(_ netip.Addr) (host string) { return "" }
func (winServer) IPByHost(_ string) (ip netip.Addr) { return netip.Addr{} }

func v4Create(_ *V4ServerConf) (s DHCPServer, err error) { return winServer{}, nil }
func v6Create(_ V6ServerConf) (s DHCPServer, err error) { return winServer{}, nil }
Loading

0 comments on commit 8d218b7

Please sign in to comment.