@@ -55,6 +55,16 @@ type ServerConfig struct {
55
55
HTTPRegister func (string , string , func (http.ResponseWriter , * http.Request )) `json:"-" yaml:"-"`
56
56
}
57
57
58
+ type onLeaseChangedT func (flags int )
59
+
60
+ // flags for onLeaseChanged()
61
+ const (
62
+ LeaseChangedAdded = iota
63
+ LeaseChangedAddedStatic
64
+ LeaseChangedRemovedStatic
65
+ LeaseChangedBlacklisted
66
+ )
67
+
58
68
// Server - the current state of the DHCP server
59
69
type Server struct {
60
70
conn * filterConn // listening UDP socket
@@ -78,6 +88,9 @@ type Server struct {
78
88
IPpool map [[4 ]byte ]net.HardwareAddr
79
89
80
90
conf ServerConfig
91
+
92
+ // Called when the leases DB is modified
93
+ onLeaseChanged onLeaseChangedT
81
94
}
82
95
83
96
// Print information about the available network interfaces
@@ -101,6 +114,13 @@ func Create(config ServerConfig) *Server {
101
114
s := Server {}
102
115
s .conf = config
103
116
s .conf .DBFilePath = filepath .Join (config .WorkDir , dbFilename )
117
+ if s .conf .Enabled {
118
+ err := s .setConfig (config )
119
+ if err != nil {
120
+ log .Error ("DHCP: %s" , err )
121
+ return nil
122
+ }
123
+ }
104
124
if s .conf .HTTPRegister != nil {
105
125
s .registerHandlers ()
106
126
}
@@ -120,6 +140,18 @@ func (s *Server) Init(config ServerConfig) error {
120
140
return nil
121
141
}
122
142
143
+ // SetOnLeaseChanged - set callback
144
+ func (s * Server ) SetOnLeaseChanged (onLeaseChanged onLeaseChangedT ) {
145
+ s .onLeaseChanged = onLeaseChanged
146
+ }
147
+
148
+ func (s * Server ) notify (flags int ) {
149
+ if s .onLeaseChanged == nil {
150
+ return
151
+ }
152
+ s .onLeaseChanged (flags )
153
+ }
154
+
123
155
// WriteDiskConfig - write configuration
124
156
func (s * Server ) WriteDiskConfig (c * ServerConfig ) {
125
157
* c = s .conf
@@ -285,7 +317,6 @@ func (s *Server) reserveLease(p dhcp4.Packet) (*Lease, error) {
285
317
s .leases [i ].IP , hwaddr , s .leases [i ].HWAddr , s .leases [i ].Expiry )
286
318
lease .IP = s .leases [i ].IP
287
319
s .leases [i ] = lease
288
- s .dbStore ()
289
320
290
321
s .reserveIP (lease .IP , hwaddr )
291
322
return lease , nil
@@ -294,7 +325,6 @@ func (s *Server) reserveLease(p dhcp4.Packet) (*Lease, error) {
294
325
log .Tracef ("Assigning to %s IP address %s" , hwaddr , ip .String ())
295
326
lease .IP = ip
296
327
s .leases = append (s .leases , lease )
297
- s .dbStore ()
298
328
return lease , nil
299
329
}
300
330
@@ -449,6 +479,7 @@ func (s *Server) blacklistLease(lease *Lease) {
449
479
lease .Expiry = time .Now ().Add (s .leaseTime )
450
480
s .dbStore ()
451
481
s .leasesLock .Unlock ()
482
+ s .notify (LeaseChangedBlacklisted )
452
483
}
453
484
454
485
// Return TRUE if DHCP packet is correct
@@ -538,6 +569,10 @@ func (s *Server) handleDHCP4Request(p dhcp4.Packet, options dhcp4.Options) dhcp4
538
569
539
570
if lease .Expiry .Unix () != leaseExpireStatic {
540
571
lease .Expiry = time .Now ().Add (s .leaseTime )
572
+ s .leasesLock .Lock ()
573
+ s .dbStore ()
574
+ s .leasesLock .Unlock ()
575
+ s .notify (LeaseChangedAdded ) // Note: maybe we shouldn't call this function if only expiration time is updated
541
576
}
542
577
log .Tracef ("Replying with ACK. IP: %s HW: %s Expire: %s" ,
543
578
lease .IP , lease .HWAddr , lease .Expiry )
@@ -578,17 +613,19 @@ func (s *Server) AddStaticLease(l Lease) error {
578
613
l .Expiry = time .Unix (leaseExpireStatic , 0 )
579
614
580
615
s .leasesLock .Lock ()
581
- defer s .leasesLock .Unlock ()
582
616
583
617
if s .findReservedHWaddr (l .IP ) != nil {
584
618
err := s .rmDynamicLeaseWithIP (l .IP )
585
619
if err != nil {
620
+ s .leasesLock .Unlock ()
586
621
return err
587
622
}
588
623
}
589
624
s .leases = append (s .leases , & l )
590
625
s .reserveIP (l .IP , l .HWAddr )
591
626
s .dbStore ()
627
+ s .leasesLock .Unlock ()
628
+ s .notify (LeaseChangedAddedStatic )
592
629
return nil
593
630
}
594
631
@@ -637,27 +674,38 @@ func (s *Server) RemoveStaticLease(l Lease) error {
637
674
}
638
675
639
676
s .leasesLock .Lock ()
640
- defer s .leasesLock .Unlock ()
641
677
642
678
if s .findReservedHWaddr (l .IP ) == nil {
679
+ s .leasesLock .Unlock ()
643
680
return fmt .Errorf ("Lease not found" )
644
681
}
645
682
646
683
err := s .rmLease (l )
647
684
if err != nil {
685
+ s .leasesLock .Unlock ()
648
686
return err
649
687
}
650
688
s .dbStore ()
689
+ s .leasesLock .Unlock ()
690
+ s .notify (LeaseChangedRemovedStatic )
651
691
return nil
652
692
}
653
693
694
+ // flags for Leases() function
695
+ const (
696
+ LeasesDynamic = 1
697
+ LeasesStatic = 2
698
+ LeasesAll = LeasesDynamic | LeasesStatic
699
+ )
700
+
654
701
// Leases returns the list of current DHCP leases (thread-safe)
655
- func (s * Server ) Leases () []Lease {
702
+ func (s * Server ) Leases (flags int ) []Lease {
656
703
var result []Lease
657
704
now := time .Now ().Unix ()
658
705
s .leasesLock .RLock ()
659
706
for _ , lease := range s .leases {
660
- if lease .Expiry .Unix () > now {
707
+ if ((flags & LeasesDynamic ) != 0 && lease .Expiry .Unix () > now ) ||
708
+ ((flags & LeasesStatic ) != 0 && lease .Expiry .Unix () == leaseExpireStatic ) {
661
709
result = append (result , * lease )
662
710
}
663
711
}
@@ -666,20 +714,6 @@ func (s *Server) Leases() []Lease {
666
714
return result
667
715
}
668
716
669
- // StaticLeases returns the list of statically-configured DHCP leases (thread-safe)
670
- func (s * Server ) StaticLeases () []Lease {
671
- s .leasesLock .Lock ()
672
- defer s .leasesLock .Unlock ()
673
-
674
- var result []Lease
675
- for _ , lease := range s .leases {
676
- if lease .Expiry .Unix () == 1 {
677
- result = append (result , * lease )
678
- }
679
- }
680
- return result
681
- }
682
-
683
717
// Print information about the current leases
684
718
func (s * Server ) printLeases () {
685
719
log .Tracef ("Leases:" )
0 commit comments