mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
| from ipaddress import ip_network, ip_address
 | |
| 
 | |
| 
 | |
| def is_ip_address(address):
 | |
|     """ 192.168.10.1 """
 | |
|     try:
 | |
|         ip_address(address)
 | |
|     except ValueError:
 | |
|         return False
 | |
|     else:
 | |
|         return True
 | |
| 
 | |
| 
 | |
| def is_ip_network(ip):
 | |
|     """ 192.168.1.0/24 """
 | |
|     try:
 | |
|         ip_network(ip)
 | |
|     except ValueError:
 | |
|         return False
 | |
|     else:
 | |
|         return True
 | |
| 
 | |
| 
 | |
| def is_ip_segment(ip):
 | |
|     """ 10.1.1.1-10.1.1.20 """
 | |
|     if '-' not in ip:
 | |
|         return False
 | |
|     ip_address1, ip_address2 = ip.split('-')
 | |
|     return is_ip_address(ip_address1) and is_ip_address(ip_address2)
 | |
| 
 | |
| 
 | |
| def in_ip_segment(ip, ip_segment):
 | |
|     ip1, ip2 = ip_segment.split('-')
 | |
|     ip1 = int(ip_address(ip1))
 | |
|     ip2 = int(ip_address(ip2))
 | |
|     ip = int(ip_address(ip))
 | |
|     return min(ip1, ip2) <= ip <= max(ip1, ip2)
 | |
| 
 | |
| 
 | |
| def contains_ip(ip, ip_group):
 | |
|     """
 | |
|     ip_group:
 | |
|     [192.168.10.1, 192.168.1.0/24, 10.1.1.1-10.1.1.20, 2001:db8:2de::e13, 2001:db8:1a:1110::/64.]
 | |
| 
 | |
|     """
 | |
| 
 | |
|     if '*' in ip_group:
 | |
|         return True
 | |
| 
 | |
|     for _ip in ip_group:
 | |
|         if is_ip_address(_ip):
 | |
|             # 192.168.10.1
 | |
|             if ip == _ip:
 | |
|                 return True
 | |
|         elif is_ip_network(_ip) and is_ip_address(ip):
 | |
|             # 192.168.1.0/24
 | |
|             if ip_address(ip) in ip_network(_ip):
 | |
|                 return True
 | |
|         elif is_ip_segment(_ip) and is_ip_address(ip):
 | |
|             # 10.1.1.1-10.1.1.20
 | |
|             if in_ip_segment(ip, _ip):
 | |
|                 return True
 | |
|         else:
 | |
|             # is domain name
 | |
|             if ip == _ip:
 | |
|                 return True
 | |
| 
 | |
|     return False
 |