ing
This commit is contained in:
		
							parent
							
								
									b88826a1cd
								
							
						
					
					
						commit
						e20c998949
					
				@ -31,7 +31,12 @@ type CIDRRanger interface {
 | 
				
			|||||||
	Contains(ip net.IP) bool
 | 
						Contains(ip net.IP) bool
 | 
				
			||||||
	First() net.IP
 | 
						First() net.IP
 | 
				
			||||||
	Last() net.IP
 | 
						Last() net.IP
 | 
				
			||||||
	Range(exclude []net.IP) []net.IP
 | 
						Range() []net.IP
 | 
				
			||||||
 | 
						// (!Contains(startIP) || !Contains(endIP)) return nil
 | 
				
			||||||
 | 
						// (startIP > endIP) return nil
 | 
				
			||||||
 | 
						// (nil != startIP && nil != endIP) return (startIP ~ endIP) + include - exclude
 | 
				
			||||||
 | 
						// (nil == startIP || nil == endIP) return include - exclude
 | 
				
			||||||
 | 
						Ranges(startIP net.IP, endIP net.IP, include []net.IP, exclude []net.IP) []net.IP
 | 
				
			||||||
	Broadcast() net.IP
 | 
						Broadcast() net.IP
 | 
				
			||||||
	Network() net.IP
 | 
						Network() net.IP
 | 
				
			||||||
	Next(ip net.IP) net.IP
 | 
						Next(ip net.IP) net.IP
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,7 @@ func (cr *cidrRangeIPv4) Last() net.IP {
 | 
				
			|||||||
	return cr.Previous(bIP)
 | 
						return cr.Previous(bIP)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (cr *cidrRangeIPv4) Range(exclude []net.IP) []net.IP {
 | 
					func (cr *cidrRangeIPv4) Range() []net.IP {
 | 
				
			||||||
	fIP := cr.First()
 | 
						fIP := cr.First()
 | 
				
			||||||
	if nil == fIP {
 | 
						if nil == fIP {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
@ -36,23 +36,61 @@ func (cr *cidrRangeIPv4) Range(exclude []net.IP) []net.IP {
 | 
				
			|||||||
	fNum := converter.IPv4ToInt(fIP.To4())
 | 
						fNum := converter.IPv4ToInt(fIP.To4())
 | 
				
			||||||
	lNum := converter.IPv4ToInt(lIP.To4())
 | 
						lNum := converter.IPv4ToInt(lIP.To4())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	exs := make([]int32, 0)
 | 
						r := make([]net.IP, 0)
 | 
				
			||||||
 | 
						for i := fNum; i <= lNum; i++ {
 | 
				
			||||||
 | 
							r = append(r, converter.IntToIPv4(i))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return r
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// (!Contains(startIP) || !Contains(endIP)) return nil
 | 
				
			||||||
 | 
					// (startIP > endIP) return nil
 | 
				
			||||||
 | 
					// (nil != startIP && nil != endIP) return (startIP ~ endIP) + include - exclude
 | 
				
			||||||
 | 
					// (nil == startIP || nil == endIP) return include - exclude
 | 
				
			||||||
 | 
					func (cr *cidrRangeIPv4) Ranges(startIP net.IP, endIP net.IP, include []net.IP, exclude []net.IP) []net.IP {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res := make(map[int32]bool)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if nil != startIP && nil != endIP {
 | 
				
			||||||
 | 
							if !cr.Contains(startIP) {
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !cr.Contains(endIP) {
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							sNum := converter.IPv4ToInt(startIP.To4())
 | 
				
			||||||
 | 
							eNum := converter.IPv4ToInt(endIP.To4())
 | 
				
			||||||
 | 
							if sNum > eNum {
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for i := sNum; i <= eNum; i++ {
 | 
				
			||||||
 | 
								res[i] = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if nil != include {
 | 
				
			||||||
 | 
							for _, in := range include {
 | 
				
			||||||
 | 
								iNum := converter.IPv4ToInt(in.To4())
 | 
				
			||||||
 | 
								if _, ok := res[iNum]; !ok {
 | 
				
			||||||
 | 
									res[iNum] = true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if nil != exclude {
 | 
						if nil != exclude {
 | 
				
			||||||
		for _, ex := range exclude {
 | 
							for _, ex := range exclude {
 | 
				
			||||||
			exs = append(exs, converter.IPv4ToInt(ex.To4()))
 | 
								iNum := converter.IPv4ToInt(ex.To4())
 | 
				
			||||||
 | 
								if _, ok := res[iNum]; ok {
 | 
				
			||||||
 | 
									delete(res, iNum)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r := make([]net.IP, 0)
 | 
						r := make([]net.IP, 0)
 | 
				
			||||||
Loop:
 | 
						for k, _ := range res {
 | 
				
			||||||
	for i := fNum; i <= lNum; i++ {
 | 
							r = append(r, converter.IntToIPv4(k))
 | 
				
			||||||
		for _, exN := range exs {
 | 
					 | 
				
			||||||
			if exN == i {
 | 
					 | 
				
			||||||
				continue Loop
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		r = append(r, converter.IntToIPv4(i))
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return r
 | 
						return r
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,11 @@ func (cr *cidrRangeIPv6) Last() net.IP {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (cr *cidrRangeIPv6) Range(exclude []net.IP) []net.IP {
 | 
					func (cr *cidrRangeIPv6) Range() []net.IP {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cr *cidrRangeIPv6) Ranges(startIP net.IP, endIP net.IP, include []net.IP, exclude []net.IP) []net.IP {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -13,5 +13,4 @@ func IntToIPv4(n int32) net.IP {
 | 
				
			|||||||
	b := make([]byte, 4)
 | 
						b := make([]byte, 4)
 | 
				
			||||||
	binary.BigEndian.PutUint32(b, uint32(n))
 | 
						binary.BigEndian.PutUint32(b, uint32(n))
 | 
				
			||||||
	return net.IP(b)
 | 
						return net.IP(b)
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user