func discovery(addr string) *discover.Discoverer { _, portstr, err := net.SplitHostPort(addr) fatalErr(err) port, _ := strconv.Atoi(portstr) if !cfg.Options.LocalAnnEnabled { port = -1 } else if verbose { infoln("Sending local discovery announcements") } if !cfg.Options.GlobalAnnEnabled { cfg.Options.GlobalAnnServer = "" } else if verbose { infoln("Sending external discovery announcements") } disc, err := discover.NewDiscoverer(myID, port, cfg.Options.GlobalAnnServer) if err != nil { warnf("No discovery possible (%v)", err) } return disc }
func discovery(extPort int) *discover.Discoverer { disc, err := discover.NewDiscoverer(myID, cfg.Options.ListenAddress, cfg.Options.LocalAnnPort) if err != nil { l.Warnf("No discovery possible (%v)", err) return nil } if cfg.Options.LocalAnnEnabled { l.Infoln("Sending local discovery announcements") disc.StartLocal() } if cfg.Options.GlobalAnnEnabled { l.Infoln("Sending global discovery announcements") disc.StartGlobal(cfg.Options.GlobalAnnServer, uint16(extPort)) } return disc }
func connect(myID string, addr string, nodeAddrs map[string][]string, m *Model, cfg *tls.Config) { _, portstr, err := net.SplitHostPort(addr) fatalErr(err) port, _ := strconv.Atoi(portstr) if opts.Discovery.NoLocalDiscovery { port = -1 } else { infoln("Sending local discovery announcements") } if opts.Discovery.NoExternalDiscovery { opts.Discovery.ExternalPort = -1 } else { infoln("Sending external discovery announcements") } disc, err := discover.NewDiscoverer(myID, port, opts.Discovery.ExternalPort, opts.Discovery.ExternalServer) if err != nil { warnf("No discovery possible (%v)", err) } for { nextNode: for nodeID, addrs := range nodeAddrs { if nodeID == myID { continue } if m.ConnectedTo(nodeID) { continue } for _, addr := range addrs { if addr == "dynamic" { var ok bool if disc != nil { addr, ok = disc.Lookup(nodeID) } if !ok { continue } } if opts.Debug.TraceNet { debugln("NET: Dial", nodeID, addr) } conn, err := tls.Dial("tcp", addr, cfg) if err != nil { if opts.Debug.TraceNet { debugln("NET:", err) } continue } remoteID := certId(conn.ConnectionState().PeerCertificates[0].Raw) if remoteID != nodeID { warnln("Unexpected nodeID", remoteID, "!=", nodeID) conn.Close() continue } m.AddConnection(conn, remoteID) continue nextNode } } time.Sleep(opts.Advanced.ConnInterval) } }