mirror of
https://ghproxy.com/https://github.com/truecharts/charts.git
synced 2026-06-18 03:16:18 +08:00
105 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|