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
 |