From 6cafb97e311e5e91f6c9bbee690a2c452841de7d Mon Sep 17 00:00:00 2001 From: vx3r <vx3r@127-0-0-1.fr> Date: Mon, 17 Feb 2020 13:12:22 +0900 Subject: [PATCH] issue #8, find available IP on the fly, not from complete list --- ui/src/App.vue | 2 +- util/util.go | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/ui/src/App.vue b/ui/src/App.vue index e369289..40b83ac 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -2,7 +2,7 @@ <v-app id="inspire"> <v-app-bar app> - <img class="mr-3" :src="require('./assets/logo.png')" height="50"/> + <img class="mr-3" :src="require('./assets/logo.png')" height="50" alt="Wg Gen Web"/> <v-toolbar-title>Wg Gen Web</v-toolbar-title> </v-app-bar> diff --git a/util/util.go b/util/util.go index 403f82e..6fa8690 100644 --- a/util/util.go +++ b/util/util.go @@ -52,42 +52,32 @@ func DirectoryExists(name string) bool { // GetAvailableIp search for an available in cidr against a list of reserved ips func GetAvailableIp(cidr string, reserved []string) (string, error) { - addresses, err := GetAllAddressesFromCidr(cidr) + ip, ipnet, err := net.ParseCIDR(cidr) if err != nil { return "", err } - for _, addresse := range addresses { + // this two addresses are not usable + broadcastAddr := BroadcastAddr(ipnet).String() + networkAddr := ipnet.IP.String() + + for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) { ok := true + address := ip.String() for _, r := range reserved { - if addresse == r { + if address == r { ok = false break } } - if ok { - return addresse, nil + if ok && address != networkAddr && address != broadcastAddr { + return address, nil } } return "", errors.New("no more available address from cidr") } -// GetAllAddressesFromCidr get all ip addresses from cidr -func GetAllAddressesFromCidr(cidr string) ([]string, error) { - ip, ipnet, err := net.ParseCIDR(cidr) - if err != nil { - return nil, err - } - - var ips []string - for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) { - ips = append(ips, ip.String()) - } - // remove network address and broadcast address (and server ip .1) - return ips[2 : len(ips)-1], nil -} - // IsIPv6 check if given ip is IPv6 func IsIPv6(address string) bool { ip := net.ParseIP(address) @@ -126,3 +116,18 @@ func inc(ip net.IP) { } } } + +// BroadcastAddr returns the last address in the given network, or the broadcast address. +func BroadcastAddr(n *net.IPNet) net.IP { + // The golang net package doesn't make it easy to calculate the broadcast address. :( + var broadcast net.IP + if len(n.IP) == 4 { + broadcast = net.ParseIP("0.0.0.0").To4() + } else { + broadcast = net.ParseIP("::") + } + for i := 0; i < len(n.IP); i++ { + broadcast[i] = n.IP[i] | ^n.Mask[i] + } + return broadcast +} -- GitLab