working on DHCP pools
This commit is contained in:
parent
ac41c7a480
commit
77c21c9747
|
@ -0,0 +1,69 @@
|
|||
package iptools
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Pool struct {
|
||||
Name string `yaml:"name"`
|
||||
Range *Range `yaml:"range"`
|
||||
Expiry time.Duration `yaml:"expiry"`
|
||||
Available []LeaseInfo `yaml:"available"`
|
||||
Active map[netip.Addr]LeaseInfo `yaml:"active"`
|
||||
Limbo map[netip.Addr]LeaseInfo `yaml:"limbo"` // leases that are currently being offered
|
||||
}
|
||||
|
||||
func NewPool(name string, exp time.Duration, r *Range) (*Pool, error) {
|
||||
p := &Pool{
|
||||
Name: name,
|
||||
Expiry: exp,
|
||||
Available: enumerateRange(name, r, true),
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (p *Pool) Sort() {
|
||||
p.Available = SortLeases(p.Available)
|
||||
}
|
||||
|
||||
func (p *Pool) IsAddressAvailable() bool {
|
||||
return len(p.Available) > 0
|
||||
}
|
||||
|
||||
func (p *Pool) Peek(t time.Time, waitFor time.Duration) netip.Addr {
|
||||
lease := p.Available[0]
|
||||
p.Available = p.Available[1:]
|
||||
lease.ResetExpiry(t, waitFor)
|
||||
|
||||
p.Limbo[lease.Addr] = lease
|
||||
|
||||
return lease.Addr
|
||||
}
|
||||
|
||||
// Update checks expirations on leases, moving any expired leases back
|
||||
// to the available pool and removing any limbo leases that are expired.
|
||||
func (p *Pool) Update(t time.Time) {
|
||||
for k, v := range p.Active {
|
||||
if v.IsExpired(t) {
|
||||
delete(p.Active, k)
|
||||
v = v.Reset()
|
||||
p.Available = append(p.Available, v)
|
||||
}
|
||||
}
|
||||
|
||||
for k, v := range p.Limbo {
|
||||
if v.IsExpired(t) {
|
||||
delete(p.Limbo, k)
|
||||
v = v.Reset()
|
||||
p.Available = append(p.Available, v)
|
||||
}
|
||||
}
|
||||
|
||||
p.Sort()
|
||||
}
|
||||
|
||||
func (p *Pool) Renew(lease LeaseInfo, t time.Time) {
|
||||
|
||||
}
|
Loading…
Reference in New Issue