/install/get_addresses -- don't send link-local addresses

This commit is contained in:
Eugene Bujak 2019-02-07 18:07:38 +03:00
parent ba161e9a6f
commit 3a94080491
3 changed files with 80 additions and 37 deletions

View File

@ -737,14 +737,39 @@ func handleInstallGetAddresses(w http.ResponseWriter, r *http.Request) {
data.Interfaces = make(map[string]interface{}) data.Interfaces = make(map[string]interface{})
for _, iface := range ifaces { for _, iface := range ifaces {
for i := range iface.Addresses { addrs, err := iface.Addrs()
ip, _, e := net.ParseCIDR(iface.Addresses[i]) if err != nil {
if e != nil { httpError(w, http.StatusInternalServerError, "Failed to get addresses for interface %s: %s", iface.Name, err)
return
}
jsonIface := netInterface{
Name: iface.Name,
MTU: iface.MTU,
HardwareAddr: iface.HardwareAddr.String(),
}
if iface.Flags != 0 {
jsonIface.Flags = iface.Flags.String()
}
// we don't want link-local addresses in json, so skip them
for _, addr := range addrs {
ipnet, ok := addr.(*net.IPNet)
if !ok {
// not an IPNet, should not happen
httpError(w, http.StatusInternalServerError, "SHOULD NOT HAPPEN: got iface.Addrs() element %s that is not net.IPNet, it is %T", addr, addr)
return
}
// ignore link-local
if ipnet.IP.IsLinkLocalUnicast() {
continue continue
} }
iface.Addresses[i] = ip.String() jsonIface.Addresses = append(jsonIface.Addresses, ipnet.IP.String())
}
if len(jsonIface.Addresses) != 0 {
data.Interfaces[iface.Name] = jsonIface
} }
data.Interfaces[iface.Name] = iface
} }
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")

45
dhcp.go
View File

@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net"
"net/http" "net/http"
"strings" "strings"
"time" "time"
@ -75,8 +76,48 @@ func handleDHCPInterfaces(w http.ResponseWriter, r *http.Request) {
return return
} }
for i := range ifaces { for _, iface := range ifaces {
response[ifaces[i].Name] = ifaces[i] if iface.Flags&net.FlagLoopback != 0 {
// it's a loopback, skip it
continue
}
if iface.Flags&net.FlagBroadcast == 0 {
// this interface doesn't support broadcast, skip it
continue
}
addrs, err := iface.Addrs()
if err != nil {
httpError(w, http.StatusInternalServerError, "Failed to get addresses for interface %s: %s", iface.Name, err)
return
}
jsonIface := netInterface{
Name: iface.Name,
MTU: iface.MTU,
HardwareAddr: iface.HardwareAddr.String(),
}
if iface.Flags != 0 {
jsonIface.Flags = iface.Flags.String()
}
// we don't want link-local addresses in json, so skip them
for _, addr := range addrs {
ipnet, ok := addr.(*net.IPNet)
if !ok {
// not an IPNet, should not happen
httpError(w, http.StatusInternalServerError, "SHOULD NOT HAPPEN: got iface.Addrs() element %s that is not net.IPNet, it is %T", addr, addr)
return
}
// ignore link-local
if ipnet.IP.IsLinkLocalUnicast() {
continue
}
jsonIface.Addresses = append(jsonIface.Addresses, ipnet.IP.String())
}
if len(jsonIface.Addresses) != 0 {
response[iface.Name] = jsonIface
}
} }
err = json.NewEncoder(w).Encode(response) err = json.NewEncoder(w).Encode(response)

View File

@ -190,49 +190,26 @@ type netInterface struct {
MTU int `json:"mtu"` MTU int `json:"mtu"`
HardwareAddr string `json:"hardware_address"` HardwareAddr string `json:"hardware_address"`
Addresses []string `json:"ip_addresses"` Addresses []string `json:"ip_addresses"`
Flags string `json:"flags"`
} }
// getValidNetInterfaces() returns interfaces that are eligible for DNS and/or DHCP // getValidNetInterfaces returns interfaces that are eligible for DNS and/or DHCP
// invalid interface is either a loopback, ppp interface, or the one that doesn't allow broadcasts // invalid interface is a ppp interface or the one that doesn't allow broadcasts
func getValidNetInterfaces() ([]netInterface, error) { func getValidNetInterfaces() ([]net.Interface, error) {
ifaces, err := net.Interfaces() ifaces, err := net.Interfaces()
if err != nil { if err != nil {
return nil, fmt.Errorf("Couldn't get list of interfaces: %s", err) return nil, fmt.Errorf("Couldn't get list of interfaces: %s", err)
} }
netIfaces := []netInterface{} netIfaces := []net.Interface{}
for i := range ifaces { for i := range ifaces {
if ifaces[i].Flags&net.FlagLoopback != 0 {
// it's a loopback, skip it
continue
}
if ifaces[i].Flags&net.FlagBroadcast == 0 {
// this interface doesn't support broadcast, skip it
continue
}
if ifaces[i].Flags&net.FlagPointToPoint != 0 { if ifaces[i].Flags&net.FlagPointToPoint != 0 {
// this interface is ppp, don't do dhcp over it // this interface is ppp, we're not interested in this one
continue continue
} }
iface := netInterface{ iface := ifaces[i]
Name: ifaces[i].Name,
MTU: ifaces[i].MTU,
HardwareAddr: ifaces[i].HardwareAddr.String(),
}
addrs, err := ifaces[i].Addrs()
if err != nil {
return nil, fmt.Errorf("Failed to get addresses for interface %v: %s", ifaces[i].Name, err)
}
for _, addr := range addrs {
iface.Addresses = append(iface.Addresses, addr.String())
}
if len(iface.Addresses) == 0 {
// this interface has no addresses, skip it
continue
}
netIfaces = append(netIfaces, iface) netIfaces = append(netIfaces, iface)
} }