Skip to content

Commit

Permalink
Network utilities
Browse files Browse the repository at this point in the history
  • Loading branch information
tliron committed May 21, 2022
1 parent 703a2c2 commit 165092c
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 12 deletions.
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ require (
k8s.io/apiextensions-apiserver v0.24.0
k8s.io/apimachinery v0.24.0
k8s.io/client-go v0.24.0
k8s.io/klog v1.0.0
k8s.io/klog/v2 v2.60.1
)

Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1616,8 +1616,6 @@ k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
Expand Down
2 changes: 1 addition & 1 deletion logging/journal/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func (self *Backend) NewMessage(name []string, level logging.Level, depth int) l

var prefix string
if name := strings.Join(name, "."); len(name) > 0 {
prefix = name + ": "
prefix = "[" + name + "] "
}

return NewMessage(priority, prefix)
Expand Down
99 changes: 99 additions & 0 deletions util/network.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package util

import (
"fmt"
"net"
"net/netip"
"strings"
)

func JoinIPAddressPort(address string, port int) string {
if IsIPv6(address) {
return fmt.Sprintf("[%s]:%d", address, port)
} else {
return fmt.Sprintf("%s:%d", address, port)
}
}

func IsIPv6(address string) bool {
// See: https://stackoverflow.com/questions/22751035/golang-distinguish-ipv4-ipv6
return strings.Contains(address, ":")
}

func IsUDPAddrEqual(a *net.UDPAddr, b *net.UDPAddr) bool {
return a.IP.Equal(b.IP) && (a.Port == b.Port) && (a.Zone == b.Zone)
}

func ToReachableIPAddress(address string) (string, error) {
if net.ParseIP(address).IsUnspecified() {
v6 := IsIPv6(address)
if interfaces, err := net.Interfaces(); err == nil {
for _, interface_ := range interfaces {
if (interface_.Flags&net.FlagLoopback == 0) && (interface_.Flags&net.FlagUp != 0) {
if addrs, err := interface_.Addrs(); err == nil {
for _, addr := range addrs {
if addr_, ok := addr.(*net.IPNet); ok {
//DumpIPAddress(addr_.IP.String())
if addr_.IP.IsGlobalUnicast() {
ip := addr_.IP.String()
if v6 == IsIPv6(ip) {
return ip, nil
}
}
}
}
} else {
return "", err
}
}
}
return "", fmt.Errorf("cannot find an equivalent reachable address for: %s", address)
} else {
return "", err
}
}

return address, nil
}

func ToBroadcastIPAddress(address string) (string, error) {
// Note: net.ParseIP can't parse IPv6 zone
if ip, err := netip.ParseAddr(address); err == nil {
if !ip.IsMulticast() {
return "", fmt.Errorf("not a multicast address: %s", address)
}

if IsIPv6(address) && ip.Zone() == "" {
if interfaces, err := net.Interfaces(); err == nil {
for _, interface_ := range interfaces {
//fmt.Printf("%s\n", interface_.Flags.String())
if (interface_.Flags&net.FlagLoopback == 0) && (interface_.Flags&net.FlagUp != 0) &&
(interface_.Flags&net.FlagBroadcast != 0) && (interface_.Flags&net.FlagMulticast != 0) {
return address + "%" + interface_.Name, nil
}
}
} else {
return "", err
}
return "", fmt.Errorf("cannot find a zone for: %s", address)
}

return address, nil
} else {
return "", err
}
}

func DumpIPAddress(address any) {
// Note: net.ParseIP can't parse IPv6 zone
ip := netip.MustParseAddr(ToString(address))
fmt.Printf("address: %s\n", ip)
fmt.Printf(" global unicast: %t\n", ip.IsGlobalUnicast())
fmt.Printf(" interface local multicast: %t\n", ip.IsInterfaceLocalMulticast())
fmt.Printf(" link local multicast: %t\n", ip.IsLinkLocalMulticast())
fmt.Printf(" link local unicast: %t\n", ip.IsLinkLocalUnicast())
fmt.Printf(" loopback: %t\n", ip.IsLoopback())
fmt.Printf(" multicast: %t\n", ip.IsMulticast())
fmt.Printf(" private: %t\n", ip.IsPrivate())
fmt.Printf(" unspecified: %t\n", ip.IsUnspecified())
}
51 changes: 43 additions & 8 deletions util/string.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"fmt"
"reflect"
"strconv"
"strings"
stringspkg "strings"
"unsafe"
)

Expand Down Expand Up @@ -45,13 +45,48 @@ func ToString(value any) string {
}
}

func Joinq(s []string, sep string) string {
var builder strings.Builder
last := len(s) - 1
for i, s_ := range s {
builder.WriteString(strconv.Quote(s_))
if i != last {
builder.WriteString(sep)
func ToStrings(values []any) []string {
length := len(values)
if length == 0 {
return nil
}
strings := make([]string, length)
for index, value := range values {
strings[index] = ToString(value)
}
return strings
}

func JoinQuote(strings []string, separator string) string {
var builder stringspkg.Builder
ultimateIndex := len(strings) - 1
for index, value := range strings {
builder.WriteString(strconv.Quote(value))
if index != ultimateIndex {
builder.WriteString(separator)
}
}
return builder.String()
}

func JoinQuoteL(strings []string, separator string, lastSeparator string, coupleSeparator string) string {
var builder stringspkg.Builder
if len(strings) == 2 {
builder.WriteString(strconv.Quote(strings[0]))
builder.WriteString(coupleSeparator)
builder.WriteString(strconv.Quote(strings[1]))
} else {
ultimateIndex := len(strings) - 1
penultimateIndex := ultimateIndex - 1
for index, value := range strings {
builder.WriteString(strconv.Quote(value))
if index != ultimateIndex {
if index == penultimateIndex {
builder.WriteString(lastSeparator)
} else {
builder.WriteString(separator)
}
}
}
}
return builder.String()
Expand Down

0 comments on commit 165092c

Please sign in to comment.