1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package ips
- import (
- "fmt"
- "strings"
- "github.com/seancfoley/ipaddress-go/ipaddr"
- )
- // GetFirstAddr - gets the first valid address in a given IPv4 CIDR
- func GetFirstAddr(cidr4 string) (*ipaddr.IPAddress, error) {
- currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress()
- if !currentCidr.IsIPv4() {
- return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetFirstAddr")
- }
- lower := currentCidr.GetLower()
- ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), ".")
- if ipParts[len(ipParts)-1] == "0" {
- lower = lower.Increment(1)
- }
- return lower, nil
- }
- // GetLastAddr - gets the last valid address in a given IPv4 CIDR
- func GetLastAddr(cidr4 string) (*ipaddr.IPAddress, error) {
- currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress()
- if !currentCidr.IsIPv4() {
- return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetLastAddr")
- }
- upper := currentCidr.GetUpper()
- ipParts := strings.Split(upper.GetNetIPAddr().IP.String(), ".")
- if ipParts[len(ipParts)-1] == "255" {
- upper = upper.Increment(-1)
- }
- return upper, nil
- }
- // GetFirstAddr6 - gets the first valid IPv6 address in a given IPv6 CIDR
- func GetFirstAddr6(cidr6 string) (*ipaddr.IPAddress, error) {
- currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress()
- if !currentCidr.IsIPv6() {
- return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetFirstAddr6")
- }
- lower := currentCidr.GetLower()
- ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), "::")
- if len(ipParts) == 2 {
- if len(ipParts[len(ipParts)-1]) == 0 {
- lower = lower.Increment(1)
- }
- }
- return lower, nil
- }
- // GetLastAddr6 - gets the last valid IPv6 address in a given IPv6 CIDR
- func GetLastAddr6(cidr6 string) (*ipaddr.IPAddress, error) {
- currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress()
- if !currentCidr.IsIPv6() {
- return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetLastAddr6")
- }
- upper := currentCidr.GetUpper()
- return upper, nil
- }
|