/install/get_addresses -- don't send link-local addresses
This commit is contained in:
parent
ba161e9a6f
commit
3a94080491
35
control.go
35
control.go
|
@ -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
45
dhcp.go
|
@ -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)
|
||||||
|
|
37
helpers.go
37
helpers.go
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue