Files
charts/clustertool/pkg/helper/netvalidate.go
2024-10-19 15:18:05 +02:00

105 lines
2.5 KiB
Go

package helper
import (
"net"
"os"
"strings"
"github.com/rs/zerolog/log"
)
// CIDROverlap checks if two CIDR annotations overlap.
func CIDROverlap(cidr1, cidr2 string) (bool, error) {
_, ipnet1, err1 := net.ParseCIDR(cidr1)
_, ipnet2, err2 := net.ParseCIDR(cidr2)
if err1 != nil || err2 != nil {
return false, err1
}
return ipnet1.Contains(ipnet2.IP) || ipnet2.Contains(ipnet1.IP), nil
}
// IPInCIDR checks if an IP fits into a CIDR.
func IPInCIDR(ipStr, cidr string) (bool, error) {
ip := net.ParseIP(ipStr)
if ip == nil {
return false, nil
}
_, ipnet, err := net.ParseCIDR(cidr)
if err != nil {
return false, err
}
return ipnet.Contains(ip), nil
}
// IPInRange checks if an IP fits into an IP range (ip-ip).
func IPInRange(ipStr, rangeStr string) (bool, error) {
ip := net.ParseIP(ipStr)
if ip == nil {
return false, nil
}
parts := strings.Split(rangeStr, "-")
if len(parts) != 2 {
return false, nil
}
startIP := net.ParseIP(parts[0])
endIP := net.ParseIP(parts[1])
if startIP == nil || endIP == nil {
return false, nil
}
return bytesCompare(ip, startIP) >= 0 && bytesCompare(ip, endIP) <= 0, nil
}
// bytesCompare compares two IP addresses.
// Returns -1 if a < b, 0 if a == b, 1 if a > b.
func bytesCompare(a, b net.IP) int {
for i := range a {
if a[i] < b[i] {
return -1
}
if a[i] > b[i] {
return 1
}
}
return 0
}
func ValidateIPorCIDRNotInCIDR(ipOrCIDR, cidr, ipOrCIDRName, cidrName string) {
inCIDR, err := IPInCIDR(ipOrCIDR, cidr)
if err != nil {
log.Info().Msgf("Error validating %s against %s: %v\n", ipOrCIDRName, cidrName, err)
os.Exit(1)
}
if inCIDR {
log.Info().Msgf("Cannot proceed, %s cannot be in %s\n", ipOrCIDRName, cidrName)
os.Exit(1)
}
}
func ValidateRangeNotInCIDR(rangeStr, cidr, rangeName, cidrName string) {
parts := strings.Split(rangeStr, "-")
if len(parts) != 2 {
log.Info().Msgf("Invalid range format for %s\n", rangeName)
os.Exit(1)
}
inCIDRStart, errStart := IPInCIDR(parts[0], cidr)
inCIDREnd, errEnd := IPInCIDR(parts[1], cidr)
if errStart != nil || errEnd != nil {
log.Info().Msgf("Error validating %s against %s: %v %v\n", rangeName, cidrName, errStart, errEnd)
os.Exit(1)
}
if inCIDRStart || inCIDREnd {
log.Info().Msgf("Cannot proceed, %s cannot be in %s\n", rangeName, cidrName)
os.Exit(1)
}
}