diff --git a/ui/src/App.vue b/ui/src/App.vue index e36928987b7c31b592ee07aeb10e309af1d7abdf..40b83ac1c1678566042cca3ab3dd0c35a8d32164 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 403f82e4bb436173aec13b5bb6f39a9e8342ddbd..6fa8690dfb433205dc633d1c12ccc4e00f7340f6 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 +}