72 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
# BSD 2-Clause License
 | 
						|
 | 
						|
# Copyright (c) 2020, Supreeth Herle
 | 
						|
# All rights reserved.
 | 
						|
 | 
						|
# Redistribution and use in source and binary forms, with or without
 | 
						|
# modification, are permitted provided that the following conditions are met:
 | 
						|
 | 
						|
# 1. Redistributions of source code must retain the above copyright notice, this
 | 
						|
#    list of conditions and the following disclaimer.
 | 
						|
 | 
						|
# 2. Redistributions in binary form must reproduce the above copyright notice,
 | 
						|
#    this list of conditions and the following disclaimer in the documentation
 | 
						|
#    and/or other materials provided with the distribution.
 | 
						|
 | 
						|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
						|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
						|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
						|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 | 
						|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
						|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
						|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
						|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
						|
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
						|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
 | 
						|
import click
 | 
						|
import sys
 | 
						|
import ipaddress
 | 
						|
 | 
						|
"""
 | 
						|
Script used to fetch first IP address in a given IP range. i.e. the calling bash script reads the std output
 | 
						|
 | 
						|
Usage in command line:
 | 
						|
e.g:
 | 
						|
$ python3 ip_utils.py --ip_range 192.168.100.0/24
 | 
						|
$ python3 ip_utils.py --ip_range 2001:230:cafe::/48
 | 
						|
"""
 | 
						|
 | 
						|
 | 
						|
def validate_ip_net(ctx, param, value):
 | 
						|
    try:
 | 
						|
        ip_net = ipaddress.ip_network(value)
 | 
						|
        return ip_net
 | 
						|
    except ValueError:
 | 
						|
        raise click.BadParameter(
 | 
						|
            'Value does not represent a valid IPv4/IPv6 range')
 | 
						|
 | 
						|
 | 
						|
@click.command()
 | 
						|
@click.option('--ip_range',
 | 
						|
              required=True,
 | 
						|
              callback=validate_ip_net,
 | 
						|
              help='UE IPv4/IPv6 Address range in CIDR format e.g. 192.168.100.0/24 or 2001:230:cafe::/48')
 | 
						|
def start(ip_range):
 | 
						|
 | 
						|
    # Get the first IP address in the IP range and netmask prefix length
 | 
						|
    first_ip_addr = next(ip_range.hosts(), None)
 | 
						|
    if not first_ip_addr:
 | 
						|
        raise ValueError('Invalid UE IPv4 range. Only one IP given')
 | 
						|
    else:
 | 
						|
        first_ip_addr = first_ip_addr.exploded
 | 
						|
        ip_netmask_prefix = ip_range.prefixlen
 | 
						|
        print(str(first_ip_addr) + '/' + str(ip_netmask_prefix))
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    try:
 | 
						|
        start()
 | 
						|
        sys.exit(0)
 | 
						|
    except ValueError:
 | 
						|
        sys.exit(1)
 |