diff --git a/prog/weavedns/main.go b/prog/weavedns/main.go index 8702719a..422ee5ac 100644 --- a/prog/weavedns/main.go +++ b/prog/weavedns/main.go @@ -11,6 +11,7 @@ import ( "github.com/weaveworks/weave/common/updater" weavedns "github.com/weaveworks/weave/nameserver" weavenet "github.com/weaveworks/weave/net" + "strconv" ) var version = "(unreleased version)" @@ -22,6 +23,7 @@ func main() { apiPath string domain string dnsPort int + httpIfaceName string httpPort int wait int ttl int @@ -46,6 +48,7 @@ func main() { flag.StringVar(&domain, "domain", weavedns.DefaultLocalDomain, "local domain (ie, 'weave.local.')") flag.IntVar(&wait, "wait", 0, "number of seconds to wait for interface to be created and come up") flag.IntVar(&dnsPort, "dnsport", weavedns.DefaultServerPort, "port to listen to DNS requests") + flag.StringVar(&httpIfaceName, "httpiface", "", "interface on which to listen for HTTP requests (defaults to empty string which listens on all interfaces)") flag.IntVar(&httpPort, "httpport", weavedns.DefaultHTTPPort, "port to listen to HTTP requests") flag.IntVar(&cacheLen, "cache", weavedns.DefaultCacheLen, "cache length") flag.IntVar(&ttl, "ttl", weavedns.DefaultLocalTTL, "TTL (in secs) for responses for local names") @@ -74,15 +77,45 @@ func main() { var iface *net.Interface if ifaceName != "" { var err error - Info.Println("Waiting for interface", ifaceName, "to come up") + Info.Println("[main] Waiting for mDNS interface", ifaceName, "to come up") iface, err = weavenet.EnsureInterface(ifaceName, wait) if err != nil { Error.Fatal(err) } else { - Info.Println("Interface", ifaceName, "is up") + Info.Println("[main] Interface", ifaceName, "is up") } } + var httpIP string + if httpIfaceName == "" { + httpIP = "0.0.0.0" + } else { + Info.Println("[main] Waiting for HTTP interface", httpIfaceName, "to come up") + httpIface, err := weavenet.EnsureInterface(httpIfaceName, wait) + if err != nil { + Error.Fatal(err) + } + Info.Println("[main] Interface", httpIfaceName, "is up") + + addrs, err := httpIface.Addrs() + if err != nil { + Error.Fatal(err) + } + + if len(addrs) == 0 { + Error.Fatal("[main] No addresses on HTTP interface") + } + + ip, _, err := net.ParseCIDR(addrs[0].String()) + if err != nil { + Error.Fatal(err) + } + + httpIP = ip.String() + + } + httpAddr := net.JoinHostPort(httpIP, strconv.Itoa(httpPort)) + zoneConfig := weavedns.ZoneConfig{ Domain: domain, Iface: iface, @@ -134,10 +167,11 @@ func main() { Error.Fatal("[main] Failed to initialize the WeaveDNS server", err) } - httpListener, err := net.Listen("tcp", fmt.Sprintf(":%d", httpPort)) + httpListener, err := net.Listen("tcp", httpAddr) if err != nil { Error.Fatal("[main] Unable to create http listener: ", err) } + Info.Println("[main] HTTP API listening on", httpAddr) go SignalHandlerLoop(srv) go weavedns.ServeHTTP(httpListener, version, srv, domain, zone) diff --git a/weave b/weave index de3e4a89..c884f5b5 100755 --- a/weave +++ b/weave @@ -177,6 +177,7 @@ MTU=65535 PORT=${WEAVE_PORT:-6783} HTTP_PORT=6784 DNS_HTTP_PORT=6785 +DNS_HTTP_IFNAME=eth0 PROXY_PORT=12375 PROXY_CONTAINER_NAME=weaveproxy @@ -1021,7 +1022,7 @@ case "$COMMAND" in DNS_CONTAINER=$(docker run --privileged -d --name=$DNS_CONTAINER_NAME \ -p $DOCKER_BRIDGE_IP:53:53/udp \ -v /var/run/docker.sock:/var/run/docker.sock \ - $WEAVEDNS_DOCKER_ARGS $DNS_IMAGE -iface $CONTAINER_IFNAME "$@") + $WEAVEDNS_DOCKER_ARGS $DNS_IMAGE -iface $CONTAINER_IFNAME -httpiface "$DNS_HTTP_IFNAME" "$@") ipam_cidrs $DNS_CONTAINER $CIDR_ARGS with_container_netns_or_die $DNS_CONTAINER attach $ALL_CIDRS populate_dns