- DHCP: normalize leases on startup (prioritize static leases over dynamic)
This commit is contained in:
42
dhcpd/db.go
42
dhcpd/db.go
@@ -36,6 +36,8 @@ func ipInRange(start, stop, ip net.IP) bool {
|
||||
func (s *Server) dbLoad() {
|
||||
s.leases = nil
|
||||
s.IPpool = make(map[[4]byte]net.HardwareAddr)
|
||||
dynLeases := []*Lease{}
|
||||
staticLeases := []*Lease{}
|
||||
|
||||
data, err := ioutil.ReadFile(s.conf.DBFilePath)
|
||||
if err != nil {
|
||||
@@ -69,11 +71,47 @@ func (s *Server) dbLoad() {
|
||||
Expiry: time.Unix(obj[i].Expiry, 0),
|
||||
}
|
||||
|
||||
s.leases = append(s.leases, &lease)
|
||||
if obj[i].Expiry == leaseExpireStatic {
|
||||
staticLeases = append(staticLeases, &lease)
|
||||
} else {
|
||||
dynLeases = append(dynLeases, &lease)
|
||||
}
|
||||
}
|
||||
|
||||
s.leases = normalizeLeases(staticLeases, dynLeases)
|
||||
|
||||
for _, lease := range s.leases {
|
||||
s.reserveIP(lease.IP, lease.HWAddr)
|
||||
}
|
||||
log.Info("DHCP: loaded %d leases from DB", numLeases)
|
||||
|
||||
log.Info("DHCP: loaded %d (%d) leases from DB", len(s.leases), numLeases)
|
||||
}
|
||||
|
||||
// Skip duplicate leases
|
||||
// Static leases have a priority over dynamic leases
|
||||
func normalizeLeases(staticLeases, dynLeases []*Lease) []*Lease {
|
||||
leases := []*Lease{}
|
||||
index := map[string]int{}
|
||||
|
||||
for i, lease := range staticLeases {
|
||||
_, ok := index[lease.HWAddr.String()]
|
||||
if ok {
|
||||
continue // skip the lease with the same HW address
|
||||
}
|
||||
index[lease.HWAddr.String()] = i
|
||||
leases = append(leases, lease)
|
||||
}
|
||||
|
||||
for i, lease := range dynLeases {
|
||||
_, ok := index[lease.HWAddr.String()]
|
||||
if ok {
|
||||
continue // skip the lease with the same HW address
|
||||
}
|
||||
index[lease.HWAddr.String()] = i
|
||||
leases = append(leases, lease)
|
||||
}
|
||||
|
||||
return leases
|
||||
}
|
||||
|
||||
// Store lease table in DB
|
||||
|
||||
Reference in New Issue
Block a user