From 61969ae92ca0a8682097f297f2587e60ea807ae7 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 6 Oct 2014 07:35:21 +0100 Subject: [PATCH] Wait for interface --- dns/main.go | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/dns/main.go b/dns/main.go index a1ee520c..3343f8e0 100644 --- a/dns/main.go +++ b/dns/main.go @@ -7,6 +7,7 @@ import ( "github.com/zettio/weavedns" "log" "net" + "time" ) var zone = new(weavedns.ZoneDb) @@ -24,6 +25,7 @@ func makeDNSReply(r *dns.Msg, name string, addr net.IP) *dns.Msg { var mdnsClient *weavedns.MDNSClient func handleMDNS(w dns.ResponseWriter, r *dns.Msg) { + log.Println("MDNS received:", r) // Here we have to handle both requests incoming, responses to queries // we sent out, and responses to queries that other nodes sent if len(r.Answer) > 0 { @@ -50,7 +52,7 @@ func handleLocal(w dns.ResponseWriter, r *dns.Msg) { m := makeDNSReply(r, q.Name, net.ParseIP(ip)) w.WriteMsg(m) } else { - log.Printf("Failed lookup for %s", q.Name) + log.Printf("Failed lookup for %s; sending mDNS query", q.Name) // We don't know the answer; see if someone else does channel := make(chan *weavedns.ResponseA, 4) go func() { @@ -66,14 +68,49 @@ func handleLocal(w dns.ResponseWriter, r *dns.Msg) { return } +func ensureInterface(ifaceName string, wait int) (iface *net.Interface, err error) { + iface, err = findInterface(ifaceName) + if err == nil || wait == 0 { + return + } + log.Println("Waiting for interface", ifaceName, "to come up") + for ; err != nil && wait > 0; wait -= 1 { + time.Sleep(1 * time.Second) + iface, err = findInterface(ifaceName) + } + if err == nil { + log.Println("Interface", ifaceName, "is up") + } + return +} + +func findInterface(ifaceName string) (iface *net.Interface, err error) { + iface, err = net.InterfaceByName(ifaceName) + if err != nil { + return iface, fmt.Errorf("Unable to find interface %s", ifaceName) + } + if 0 == (net.FlagUp & iface.Flags) { + return iface, fmt.Errorf("Interface %s is not up", ifaceName) + } + return +} + func main() { var ( dnsPort int + wait int ) + flag.IntVar(&wait, "wait", 5, "number of seconds to wait for interface to be created and come up (defaults to 5)") flag.IntVar(&dnsPort, "dnsport", 53, "port to listen to dns requests (defaults to 53)") flag.Parse() + ifaceName := "ethwe" + _, err := ensureInterface(ifaceName, wait) + if err != nil { + log.Fatal(err) + } + LocalServeMux := dns.NewServeMux() LocalServeMux.HandleFunc("local", handleLocal) go weavedns.ListenHttp(zone)