all: sync with master; upd chlog
This commit is contained in:
@@ -148,6 +148,9 @@ func (s *v4Server) ResetLeases(leases []*Lease) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
s.leasesLock.Lock()
|
||||
defer s.leasesLock.Unlock()
|
||||
|
||||
s.leasedOffsets = newBitSet()
|
||||
s.hostsIndex = make(map[string]*Lease, len(leases))
|
||||
s.ipIndex = make(map[netip.Addr]*Lease, len(leases))
|
||||
@@ -182,16 +185,13 @@ func (s *v4Server) isBlocklisted(l *Lease) (ok bool) {
|
||||
return false
|
||||
}
|
||||
|
||||
ok = true
|
||||
for _, b := range l.HWAddr {
|
||||
if b != 0 {
|
||||
ok = false
|
||||
|
||||
break
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return ok
|
||||
return true
|
||||
}
|
||||
|
||||
// GetLeases returns the list of current DHCP leases. It is safe for concurrent
|
||||
@@ -309,9 +309,15 @@ func (s *v4Server) rmDynamicLease(lease *Lease) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// ErrDupHostname is returned by addLease when the added lease has a not empty
|
||||
// non-unique hostname.
|
||||
const ErrDupHostname = errors.Error("hostname is not unique")
|
||||
const (
|
||||
// ErrDupHostname is returned by addLease, validateStaticLease when the
|
||||
// modified lease has a not empty non-unique hostname.
|
||||
ErrDupHostname = errors.Error("hostname is not unique")
|
||||
|
||||
// ErrDupIP is returned by addLease, validateStaticLease when the modified
|
||||
// lease has a non-unique IP address.
|
||||
ErrDupIP = errors.Error("ip address is not unique")
|
||||
)
|
||||
|
||||
// addLease adds a dynamic or static lease.
|
||||
func (s *v4Server) addLease(l *Lease) (err error) {
|
||||
@@ -428,6 +434,81 @@ func (s *v4Server) AddStaticLease(l *Lease) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateStaticLease updates IP, hostname of the static lease.
|
||||
func (s *v4Server) UpdateStaticLease(l *Lease) (err error) {
|
||||
defer func() {
|
||||
if err != nil {
|
||||
err = errors.Annotate(err, "dhcpv4: updating static lease: %w")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
s.conf.notify(LeaseChangedDBStore)
|
||||
s.conf.notify(LeaseChangedRemovedStatic)
|
||||
}()
|
||||
|
||||
s.leasesLock.Lock()
|
||||
defer s.leasesLock.Unlock()
|
||||
|
||||
found := s.findLease(l.HWAddr)
|
||||
if found == nil {
|
||||
return fmt.Errorf("can't find lease %s", l.HWAddr)
|
||||
}
|
||||
|
||||
err = s.validateStaticLease(l)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.rmLease(found)
|
||||
if err != nil {
|
||||
return fmt.Errorf("removing previous lease for %s (%s): %w", l.IP, l.HWAddr, err)
|
||||
}
|
||||
|
||||
err = s.addLease(l)
|
||||
if err != nil {
|
||||
return fmt.Errorf("adding updated static lease for %s (%s): %w", l.IP, l.HWAddr, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateStaticLease returns an error if the static lease is invalid.
|
||||
func (s *v4Server) validateStaticLease(l *Lease) (err error) {
|
||||
hostname, err := normalizeHostname(l.Hostname)
|
||||
if err != nil {
|
||||
// Don't wrap the error, because it's informative enough as is.
|
||||
return err
|
||||
}
|
||||
|
||||
err = netutil.ValidateHostname(hostname)
|
||||
if err != nil {
|
||||
return fmt.Errorf("validating hostname: %w", err)
|
||||
}
|
||||
|
||||
dup, ok := s.hostsIndex[hostname]
|
||||
if ok && !bytes.Equal(dup.HWAddr, l.HWAddr) {
|
||||
return ErrDupHostname
|
||||
}
|
||||
|
||||
dup, ok = s.ipIndex[l.IP]
|
||||
if ok && !bytes.Equal(dup.HWAddr, l.HWAddr) {
|
||||
return ErrDupIP
|
||||
}
|
||||
|
||||
l.Hostname = hostname
|
||||
|
||||
if gwIP := s.conf.GatewayIP; gwIP == l.IP {
|
||||
return fmt.Errorf("can't assign the gateway IP %q to the lease", gwIP)
|
||||
}
|
||||
|
||||
if sn := s.conf.subnet; !sn.Contains(l.IP) {
|
||||
return fmt.Errorf("subnet %s does not contain the ip %q", sn, l.IP)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// updateStaticLease safe removes dynamic lease with the same properties and
|
||||
// then adds a static lease l.
|
||||
func (s *v4Server) updateStaticLease(l *Lease) (err error) {
|
||||
|
||||
Reference in New Issue
Block a user