| #!/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 |