64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package docker
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"net"
|
|
)
|
|
|
|
const (
|
|
networkBridgeIface = "lxcbr0"
|
|
)
|
|
|
|
type NetworkInterface struct {
|
|
IpAddress string
|
|
IpPrefixLen int
|
|
Gateway net.IP
|
|
}
|
|
|
|
func allocateIPAddress(network *net.IPNet) net.IP {
|
|
ip := network.IP.Mask(network.Mask)
|
|
ip[3] = byte(rand.Intn(254))
|
|
return ip
|
|
}
|
|
|
|
func getBridgeAddr(name string) (net.Addr, error) {
|
|
iface, err := net.InterfaceByName(name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
addrs, err := iface.Addrs()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var addrs4 []net.Addr
|
|
for _, addr := range addrs {
|
|
ip := (addr.(*net.IPNet)).IP
|
|
if ip4 := ip.To4(); len(ip4) == net.IPv4len {
|
|
addrs4 = append(addrs4, addr)
|
|
}
|
|
}
|
|
switch {
|
|
case len(addrs4) == 0:
|
|
return nil, fmt.Errorf("Bridge %v has no IP addresses", name)
|
|
case len(addrs4) > 1:
|
|
return nil, fmt.Errorf("Bridge %v has more than 1 IPv4 address", name)
|
|
}
|
|
return addrs4[0], nil
|
|
}
|
|
|
|
func allocateNetwork() (*NetworkInterface, error) {
|
|
bridgeAddr, err := getBridgeAddr(networkBridgeIface)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
bridge := bridgeAddr.(*net.IPNet)
|
|
ipPrefixLen, _ := bridge.Mask.Size()
|
|
iface := &NetworkInterface{
|
|
IpAddress: allocateIPAddress(bridge).String(),
|
|
IpPrefixLen: ipPrefixLen,
|
|
Gateway: bridge.IP,
|
|
}
|
|
return iface, nil
|
|
}
|