func getPublicIPv6(addresses []net.Addr) (net.IP, error) { var candidates []net.IP // Find public IPv6 address for _, rawAddr := range addresses { 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 ip.IsLinkLocalUnicast() || isUniqueLocalAddress(ip) || ip.IsLoopback() { continue } candidates = append(candidates, ip) } numIps := len(candidates) switch numIps { case 0: return nil, fmt.Errorf("No public IPv6 address found") case 1: return candidates[0], nil default: return nil, fmt.Errorf("Multiple public IPv6 addresses found. Please configure one.") } }
func validateRemoteAddr(ip net.IP) bool { if ip == nil { return false } if ip.IsInterfaceLocalMulticast() { return false } if ip.IsLinkLocalMulticast() { return false } if ip.IsLinkLocalUnicast() { return false } if ip.IsLoopback() { return false } if ip.IsMulticast() { return false } if ip.IsUnspecified() { return false } if isBroadcasty(ip) { return false } return true }
func routableIP(network string, ip net.IP) net.IP { if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() { return nil } switch network { case "ip4": if ip := ip.To4(); ip != nil { return ip } case "ip6": if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation return nil } if ip := ip.To16(); ip != nil && ip.To4() == nil { return ip } default: if ip := ip.To4(); ip != nil { return ip } if ip := ip.To16(); ip != nil { return ip } } return nil }
func InterfaceIPs() ([]*net.IPAddr, error) { var ( addrs []*net.IPAddr ) ifaces, err := net.Interfaces() if err != nil { return nil, err } for _, iface := range ifaces { iaddrs, err := iface.Addrs() if err != nil { return nil, err } for _, iaddr := range iaddrs { var ( ip net.IP zone string ) switch x := iaddr.(type) { case *net.IPAddr: ip = x.IP zone = x.Zone case *net.IPNet: ip = x.IP zone = "" } if ip.IsMulticast() || ip.IsUnspecified() || ip.IsInterfaceLocalMulticast() || ip.IsLinkLocalMulticast() || ip.IsLinkLocalUnicast() { continue } if ipv4 := ip.To4(); ipv4 != nil { ip = ipv4 } addrs = append(addrs, &net.IPAddr{ IP: ip, Zone: zone, }) } } return addrs, nil }
func isLoopbackIP(ip net.IP) bool { // ignore loopback ips if ip.IsLoopback() { return true } // ignore local ips if ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() { return true } return false }
func printStartup(port uint16) { log.Print("") log.Printf("CRG Scoreboard and Game System Version %v", version) log.Print("") log.Print("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv") log.Print("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv") log.Print("Double-click/open the 'start.html' file, or") log.Print("Open a web browser (either Google Chrome or Mozilla Firefox recommended) to:") log.Printf("http://localhost:%d/", port) log.Print("or try one of these URLs:") ifaces, err := net.Interfaces() if err != nil { log.Print("Cannot get interfaces:", err) } else { for _, i := range ifaces { addrs, err := i.Addrs() if err != nil { log.Printf("Cannot get addresses on %v: %v", i, err) } else { for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } if ip.IsLoopback() || ip.IsLinkLocalUnicast() { continue } var url string if ip.To4() != nil { url = fmt.Sprintf("http://%v:%d/", ip, port) } else { url = fmt.Sprintf("http://[%v]:%d/", ip, port) } urls = append(urls, url) log.Print(url) } } } } log.Print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") log.Print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") }
// Per http://www.libtorrent.org/dht_sec.html#enforcement, the IP is // considered a local network address and should be exempted from node ID // verification. func isLocalNetwork(ip net.IP) bool { if classA.Contains(ip) { return true } if classB.Contains(ip) { return true } if classC.Contains(ip) { return true } if ip.IsLinkLocalUnicast() { return true } if ip.IsLoopback() { return true } return false }
func (b *Bridge) updateIP(mac string, ip net.IP) { if ip == nil || ip.IsLinkLocalUnicast() { return } log.Debug("got mac/ip pair:", mac, ip) bridgeLock.Lock() defer bridgeLock.Unlock() for _, tap := range b.taps { if tap.Defunct || tap.MAC != mac { continue } if ip := ip.To4(); ip != nil { tap.IP4 = ip.String() } else { tap.IP6 = ip.String() } } }
func routableIP(network string, ip net.IP) net.IP { if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() { return nil } switch network { case "ip4": if ip := ip.To4(); ip != nil { return ip } case "ip6": if ip := ip.To16(); ip != nil && ip.To4() == nil { return ip } default: if ip := ip.To4(); ip != nil { return ip } if ip := ip.To16(); ip != nil { return ip } } return nil }
func chooseHostInterfaceNativeGo() (net.IP, error) { intfs, err := net.Interfaces() if err != nil { return nil, err } i := 0 var ip net.IP for i = range intfs { if flagsSet(intfs[i].Flags, net.FlagUp) && flagsClear(intfs[i].Flags, net.FlagLoopback|net.FlagPointToPoint) { addrs, err := intfs[i].Addrs() if err != nil { return nil, err } if len(addrs) > 0 { for _, addr := range addrs { if addrIP, _, err := net.ParseCIDR(addr.String()); err == nil { if addrIP.To4() != nil { ip = addrIP.To4() if !ip.IsLinkLocalMulticast() && !ip.IsLinkLocalUnicast() { break } } } } if ip != nil { // This interface should suffice. break } } } } if ip == nil { return nil, fmt.Errorf("no acceptable interface from host") } glog.V(4).Infof("Choosing interface %s (IP %v) as default", intfs[i].Name, ip) return ip, nil }
// setupAgent is used to create the agent we use func (a *AgentCommand) setupSerf(config *Config) *serf.Serf { bindIP, bindPort, err := config.AddrParts(config.BindAddr) if err != nil { a.Ui.Error(fmt.Sprintf("Invalid bind address: %s", err)) return nil } // Check if we have an interface if iface, _ := config.NetworkInterface(); iface != nil { addrs, err := iface.Addrs() if err != nil { a.Ui.Error(fmt.Sprintf("Failed to get interface addresses: %s", err)) return nil } if len(addrs) == 0 { a.Ui.Error(fmt.Sprintf("Interface '%s' has no addresses", config.Interface)) return nil } // If there is no bind IP, pick an address if bindIP == "0.0.0.0" { found := false for _, ad := range addrs { var addrIP net.IP if runtime.GOOS == "windows" { // Waiting for https://github.com/golang/go/issues/5395 to use IPNet only addr, ok := ad.(*net.IPAddr) if !ok { continue } addrIP = addr.IP } else { addr, ok := ad.(*net.IPNet) if !ok { continue } addrIP = addr.IP } // Skip self-assigned IPs if addrIP.IsLinkLocalUnicast() { continue } // Found an IP found = true bindIP = addrIP.String() a.Ui.Output(fmt.Sprintf("Using interface '%s' address '%s'", config.Interface, bindIP)) // Update the configuration bindAddr := &net.TCPAddr{ IP: net.ParseIP(bindIP), Port: bindPort, } config.BindAddr = bindAddr.String() break } if !found { a.Ui.Error(fmt.Sprintf("Failed to find usable address for interface '%s'", config.Interface)) return nil } } else { // If there is a bind IP, ensure it is available found := false for _, a := range addrs { addr, ok := a.(*net.IPNet) if !ok { continue } if addr.IP.String() == bindIP { found = true break } } if !found { a.Ui.Error(fmt.Sprintf("Interface '%s' has no '%s' address", config.Interface, bindIP)) return nil } } } var advertiseIP string var advertisePort int if config.AdvertiseAddr != "" { advertiseIP, advertisePort, err = config.AddrParts(config.AdvertiseAddr) if err != nil { a.Ui.Error(fmt.Sprintf("Invalid advertise address: %s", err)) return nil } } encryptKey, err := config.EncryptBytes() if err != nil { a.Ui.Error(fmt.Sprintf("Invalid encryption key: %s", err)) return nil } serfConfig := serf.DefaultConfig() switch config.Profile { case "lan": serfConfig.MemberlistConfig = memberlist.DefaultLANConfig() case "wan": serfConfig.MemberlistConfig = memberlist.DefaultWANConfig() case "local": serfConfig.MemberlistConfig = memberlist.DefaultLocalConfig() default: a.Ui.Error(fmt.Sprintf("Unknown profile: %s", config.Profile)) return nil } serfConfig.MemberlistConfig.BindAddr = bindIP serfConfig.MemberlistConfig.BindPort = bindPort serfConfig.MemberlistConfig.AdvertiseAddr = advertiseIP serfConfig.MemberlistConfig.AdvertisePort = advertisePort serfConfig.MemberlistConfig.SecretKey = encryptKey serfConfig.NodeName = config.NodeName serfConfig.Tags = config.Tags serfConfig.SnapshotPath = config.SnapshotPath serfConfig.CoalescePeriod = 3 * time.Second serfConfig.QuiescentPeriod = time.Second serfConfig.UserCoalescePeriod = 3 * time.Second serfConfig.UserQuiescentPeriod = time.Second if config.ReconnectInterval != 0 { serfConfig.ReconnectInterval = config.ReconnectInterval } if config.ReconnectTimeout != 0 { serfConfig.ReconnectTimeout = config.ReconnectTimeout } if config.TombstoneTimeout != 0 { serfConfig.TombstoneTimeout = config.TombstoneTimeout } serfConfig.EnableNameConflictResolution = !config.DisableNameResolution if config.KeyringFile != "" { serfConfig.KeyringFile = config.KeyringFile } serfConfig.RejoinAfterLeave = config.RejoinAfterLeave // Create a channel to listen for events from Serf a.eventCh = make(chan serf.Event, 64) serfConfig.EventCh = a.eventCh // Start Serf a.Ui.Output("Starting Serf agent...") log.Info("agent: Serf agent starting") serfConfig.LogOutput = ioutil.Discard serfConfig.MemberlistConfig.LogOutput = ioutil.Discard // Create serf first serf, err := serf.Create(serfConfig) if err != nil { a.Ui.Error(err.Error()) log.Error(err) return nil } return serf }
func isLinkLocalUnicast(ip net.IP) bool { return ip.To4() == nil && ip.To16() != nil && ip.IsLinkLocalUnicast() }
func isUnicast(ip net.IP) bool { return ip.To4() != nil && (ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsGlobalUnicast()) }