132 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| ##################################################################################
 | |
| #
 | |
| #  Copyright (C) 2017 Craig Miller
 | |
| #
 | |
| #  See the file "LICENSE" for information on usage and redistribution
 | |
| #  of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 | |
| #  Distributed under GPLv2 License
 | |
| #
 | |
| ##################################################################################
 | |
| 
 | |
| 
 | |
| # IPv6 Address Expansion functions
 | |
| #
 | |
| # by Craig Miller   19 Feb 2017
 | |
| #
 | |
| # 16 Nov 2017 v0.93 - added CLI functionality
 | |
| 
 | |
| 
 | |
| VERSION=0.93
 | |
| 
 | |
| empty_addr="0000:0000:0000:0000:0000:0000:0000:0000"
 | |
| empty_addr_len=${#empty_addr}
 | |
| 
 | |
| function usage {
 | |
|                echo " $0 - expand compressed IPv6 addresss "
 | |
|          echo " e.g. $0 2001:db8:1:12:123::456 "
 | |
|          echo " "
 | |
|          echo " -t  self test"
 | |
|          echo " "
 | |
|          echo " By Craig Miller - Version: $VERSION"
 | |
|          exit 1
 | |
|            }
 | |
| 
 | |
| if [ "$1" == "-h" ]; then
 | |
|   #call help
 | |
|   usage
 | |
| fi
 | |
| 
 | |
| #
 | |
| # Expands IPv6 quibble to 4 digits with leading zeros e.g. db8 -> 0db8
 | |
| #
 | |
| # Returns string with expanded quibble
 | |
| 
 | |
| function expand_quibble() {
 | |
|   addr=$1
 | |
|   # create array of quibbles
 | |
|   addr_array=(${addr//:/ })
 | |
|   addr_array_len=${#addr_array[@]}
 | |
|   # step thru quibbles
 | |
|   for ((i=0; i< $addr_array_len ; i++ ))
 | |
|   do
 | |
|     quibble=${addr_array[$i]}
 | |
|     quibble_len=${#quibble}
 | |
|     case $quibble_len in
 | |
|       1) quibble="000$quibble";;
 | |
|       2) quibble="00$quibble";;
 | |
|       3) quibble="0$quibble";;
 | |
|     esac
 | |
|     addr_array[$i]=$quibble 
 | |
|   done
 | |
|   # reconstruct addr from quibbles
 | |
|   return_str=${addr_array[*]}
 | |
|   return_str="${return_str// /:}"
 | |
|   echo $return_str
 | |
| }
 | |
| 
 | |
| #
 | |
| # Expands IPv6 address :: format to full zeros
 | |
| #
 | |
| # Returns string with expanded address
 | |
| 
 | |
| function expand() {
 | |
|   if [[ $1 == *"::"* ]]; then
 | |
|     # check for leading zeros on front_addr
 | |
|     if [[ $1 == "::"* ]]; then
 | |
|       front_addr=0
 | |
|     else
 | |
|       front_addr=$(echo $1 | sed -r 's;([^ ]+)::.*;\1;') 
 | |
|     fi
 | |
|     # check for trailing zeros on back_addr
 | |
|     if [[ $1 == *"::" ]]; then
 | |
|       back_addr=0
 | |
|     else
 | |
|       back_addr=$(echo $1 | sed -r 's;.*::([^ ]+);\1;') 
 | |
|     fi
 | |
|     front_addr=$(expand_quibble $front_addr)
 | |
|     back_addr=$(expand_quibble $back_addr)
 | |
|     
 | |
|     new_addr=$empty_addr
 | |
|     front_addr_len=${#front_addr}
 | |
|     back_addr_len=${#back_addr}
 | |
|     # calculate fill needed
 | |
|     num_zeros=$(($empty_addr_len - $front_addr_len - $back_addr_len - 1))
 | |
| 
 | |
|     #fill_str=${empty_addr[0]:0:$num_zeros}
 | |
|     new_addr="$front_addr:${empty_addr[0]:0:$num_zeros}$back_addr"
 | |
|     
 | |
|     # return expanded address
 | |
|     echo $new_addr
 | |
|   else
 | |
|     # return input with expandd quibbles
 | |
|     expand_quibble $1
 | |
|   fi
 | |
| }
 | |
| 
 | |
| # self test - call with '-t' parameter
 | |
| if [ "$1" == "-t" ]; then
 | |
|   # add address examples to test
 | |
|   expand fd11::1d70:cf84:18ef:d056
 | |
|   expand 2a01::1
 | |
|   expand fe80::f203:8cff:fe3f:f041
 | |
|   expand 2001:db8:123::5
 | |
|   expand 2001:470:ebbd:0:f203:8cff:fe3f:f041
 | |
|   # special cases
 | |
|   expand ::1
 | |
|   expand fd32:197d:3022:1101::
 | |
|   exit 1
 | |
| fi
 | |
| 
 | |
| # allow script to be sourced (with no arguements)
 | |
| if [[ $1 != "" ]]; then
 | |
|   # validate input is an IPv6 address
 | |
|   if [[ $1 == *":"* ]]; then
 | |
|     expand $1
 | |
|   else
 | |
|     echo "ERROR: unregcognized IPv6 address $1"
 | |
|     exit 1
 | |
|   fi
 | |
| fi
 | 
