From f4bd7f707c213e716983ec8081ea4864e885e3e1 Mon Sep 17 00:00:00 2001 From: Asim Date: Mon, 15 Feb 2016 21:57:17 +0000 Subject: [PATCH] Extract address for broker --- broker/extractor.go | 70 +++++++++++++++++++++++++++++++++++++++++++ broker/http_broker.go | 7 ++++- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 broker/extractor.go diff --git a/broker/extractor.go b/broker/extractor.go new file mode 100644 index 00000000..4ba9fdc3 --- /dev/null +++ b/broker/extractor.go @@ -0,0 +1,70 @@ +package broker + +import ( + "fmt" + "net" +) + +var ( + privateBlocks []*net.IPNet +) + +func init() { + for _, b := range []string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"} { + if _, block, err := net.ParseCIDR(b); err == nil { + privateBlocks = append(privateBlocks, block) + } + } +} + +func extractAddress(addr string) (string, error) { + if len(addr) > 0 && (addr != "0.0.0.0" && addr != "[::]") { + return addr, nil + } + + addrs, err := net.InterfaceAddrs() + if err != nil { + return "", fmt.Errorf("Failed to get interface addresses! Err: %v", err) + } + + var ipAddr []byte + + for _, rawAddr := range addrs { + var ip net.IP + switch addr := rawAddr.(type) { + case *net.IPAddr: + ip = addr.IP + case *net.IPNet: + ip = addr.IP + default: + continue + } + + if ip.To4() == nil { + continue + } + + if !isPrivateIP(ip.String()) { + continue + } + + ipAddr = ip + break + } + + if ipAddr == nil { + return "", fmt.Errorf("No private IP address found, and explicit IP not provided") + } + + return net.IP(ipAddr).String(), nil +} + +func isPrivateIP(ipAddr string) bool { + ip := net.ParseIP(ipAddr) + for _, priv := range privateBlocks { + if priv.Contains(ip) { + return true + } + } + return false +} diff --git a/broker/http_broker.go b/broker/http_broker.go index 9daab6ad..75dd1df0 100644 --- a/broker/http_broker.go +++ b/broker/http_broker.go @@ -389,6 +389,11 @@ func (h *httpBroker) Subscribe(topic string, handler Handler, opts ...SubscribeO host := strings.Join(parts[:len(parts)-1], ":") port, _ := strconv.Atoi(parts[len(parts)-1]) + addr, err := extractAddress(host) + if err != nil { + return nil, err + } + id := uuid.NewUUID().String() var secure bool @@ -400,7 +405,7 @@ func (h *httpBroker) Subscribe(topic string, handler Handler, opts ...SubscribeO // register service node := ®istry.Node{ Id: h.id + "." + id, - Address: host, + Address: addr, Port: port, Metadata: map[string]string{ "secure": fmt.Sprintf("%t", secure),