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