mirror of
https://github.com/ngoduykhanh/wireguard-ui.git
synced 2025-06-06 00:37:24 +03:00
Subnet range selector, interface fixes (#481)
This commit is contained in:
parent
e73047b14f
commit
a9be53899c
12 changed files with 473 additions and 44 deletions
|
@ -366,6 +366,10 @@ func GetClients(db store.IStore) echo.HandlerFunc {
|
|||
})
|
||||
}
|
||||
|
||||
for i, clientData := range clientDataList {
|
||||
clientDataList[i] = util.FillClientSubnetRange(clientData)
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, clientDataList)
|
||||
}
|
||||
}
|
||||
|
@ -391,7 +395,7 @@ func GetClient(db store.IStore) echo.HandlerFunc {
|
|||
return c.JSON(http.StatusNotFound, jsonHTTPResponse{false, "Client not found"})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, clientData)
|
||||
return c.JSON(http.StatusOK, util.FillClientSubnetRange(clientData))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -988,6 +992,13 @@ func MachineIPAddresses() echo.HandlerFunc {
|
|||
}
|
||||
}
|
||||
|
||||
// GetOrderedSubnetRanges handler to get the ordered list of subnet ranges
|
||||
func GetOrderedSubnetRanges() echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
return c.JSON(http.StatusOK, util.SubnetRangesOrder)
|
||||
}
|
||||
}
|
||||
|
||||
// SuggestIPAllocation handler to get the list of ip address for client
|
||||
func SuggestIPAllocation(db store.IStore) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
|
@ -1009,22 +1020,48 @@ func SuggestIPAllocation(db store.IStore) echo.HandlerFunc {
|
|||
false, "Cannot suggest ip allocation: failed to get list of allocated ip addresses",
|
||||
})
|
||||
}
|
||||
for _, cidr := range server.Interface.Addresses {
|
||||
ip, err := util.GetAvailableIP(cidr, allocatedIPs)
|
||||
|
||||
sr := c.QueryParam("sr")
|
||||
searchCIDRList := make([]string, 0)
|
||||
found := false
|
||||
|
||||
// Use subnet range or default to interface addresses
|
||||
if util.SubnetRanges[sr] != nil {
|
||||
for _, cidr := range util.SubnetRanges[sr] {
|
||||
searchCIDRList = append(searchCIDRList, cidr.String())
|
||||
}
|
||||
} else {
|
||||
searchCIDRList = append(searchCIDRList, server.Interface.Addresses...)
|
||||
}
|
||||
|
||||
// Save only unique IPs
|
||||
ipSet := make(map[string]struct{})
|
||||
|
||||
for _, cidr := range searchCIDRList {
|
||||
ip, err := util.GetAvailableIP(cidr, allocatedIPs, server.Interface.Addresses)
|
||||
if err != nil {
|
||||
log.Error("Failed to get available ip from a CIDR: ", err)
|
||||
return c.JSON(http.StatusInternalServerError, jsonHTTPResponse{
|
||||
false,
|
||||
fmt.Sprintf("Cannot suggest ip allocation: failed to get available ip from network %s", cidr),
|
||||
})
|
||||
continue
|
||||
}
|
||||
found = true
|
||||
if strings.Contains(ip, ":") {
|
||||
suggestedIPs = append(suggestedIPs, fmt.Sprintf("%s/128", ip))
|
||||
ipSet[fmt.Sprintf("%s/128", ip)] = struct{}{}
|
||||
} else {
|
||||
suggestedIPs = append(suggestedIPs, fmt.Sprintf("%s/32", ip))
|
||||
ipSet[fmt.Sprintf("%s/32", ip)] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return c.JSON(http.StatusInternalServerError, jsonHTTPResponse{
|
||||
false,
|
||||
"Cannot suggest ip allocation: failed to get available ip. Try a different subnet or deallocate some ips.",
|
||||
})
|
||||
}
|
||||
|
||||
for ip := range ipSet {
|
||||
suggestedIPs = append(suggestedIPs, ip)
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, suggestedIPs)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue