-
Notifications
You must be signed in to change notification settings - Fork 0
/
address.go
112 lines (105 loc) · 3.36 KB
/
address.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package base
import (
"github.com/gcrahay/riprovision/address"
"github.com/gcrahay/riprovision/network"
log "github.com/sirupsen/logrus"
"net"
"time"
)
func (server *Server) GetDHCPNetwork() (*net.IPNet, error) {
var networks []net.IPNet
for _, deviceMAC := range server.Cache.Keys() {
device, found := server.GetDevice(deviceMAC.(string))
if found && device.DHCP.ServerIP != nil {
deviceNetwork := net.IPNet{
IP: device.DHCP.ServerIP.Mask(*device.DHCP.NetworkMask),
Mask: *device.DHCP.NetworkMask,
}
networks = append(networks, deviceNetwork)
}
}
server.Log.WithField("component", "network_finder").Debugf("Used networks computed (%d)", len(networks))
return network.GetFreeNetworkBlacklist(server.DHCP.baseNetwork, server.DHCP.NetworkPrefix, networks)
}
func LocalAddressManager(addressChan chan address.InterfaceAddress, exit chan int) {
log.Debugf("interface IP address manager started")
for {
select {
case <-exit:
log.Info("interface IP address manager exit requested")
return
case ipNetwork := <-addressChan:
log.Debugf("Handler address to add: %s", ipNetwork.Network.String())
_, targetNetwork, err := net.ParseCIDR(ipNetwork.Network.String())
if err != nil {
log.Errorf("Cannot get server IP: %+v", err)
continue
}
serverIP := network.NextIP(targetNetwork.IP, 1)
if ipNetwork.Remove {
err = address.RemoveInterfaceIP(serverIP, ipNetwork.Network.Mask, ipNetwork.Interface)
if err != nil {
log.Errorf("Cannot remove server IP: %v", err)
}
continue
} else {
err = address.AddInterfaceIP(serverIP, ipNetwork.Network.Mask, ipNetwork.Interface)
if err != nil {
log.Errorf("Cannot add server IP: %v", err)
}
continue
}
}
}
}
func (server *Server) LocalAddressCLeaner() {
logger := server.Log.WithFields(log.Fields{
"component": "address_cleaner",
})
logger.Debugf("interface IP address cleaner started")
for {
select {
case <-server.StopClean:
logger.Info("Interface IP address cleaner exit requested")
return
case <- server.CleanTicker.C:
now := time.Now()
logger.Debugf("Cleaner started at %s", now.String())
for _, deviceKeyInt := range server.Cache.Keys() {
device, found := server.GetDevice(deviceKeyInt.(string))
if found {
if device.DHCP != nil && device.DHCP.ServerIP != nil && now.After(device.DHCP.Expiry) {
logger.Debugf("Removing expired network for server: %s", device.DHCP.ServerIP.String())
server.ManageNet <- address.InterfaceAddress{
Network: net.IPNet{IP: *device.DHCP.ServerIP, Mask: *device.DHCP.NetworkMask},
Interface: server.Interface,
Remove: true,
}
device.DHCP = nil
server.AddDevice(device)
}
}
}
}
}
}
func (server *Server) RemoteAddressManager(address chan address.InterfaceAddress, exit chan int) {
logger := server.Log.WithField("component", "address_manager")
logger.Debugf("interface IP address manager started")
for {
select {
case <-exit:
logger.Info("interface IP address manager exit requested")
return
case ipNetwork := <-address:
logger.Debugf("Received address to add: %s", ipNetwork.Network.String())
msg, err := server.NetManager.Manage(&ipNetwork)
if err != nil {
logger.Errorf("Cannot manager server IP: %v (%s)", err, msg)
} else {
logger.Debugf("Interface address set/unset: %s", msg)
}
continue
}
}
}