Skip to content

Instantly share code, notes, and snippets.

@olomor
Last active December 30, 2022 02:07
Show Gist options
  • Save olomor/09b4f081fc8f603e776eaadc53ad8b0b to your computer and use it in GitHub Desktop.
Save olomor/09b4f081fc8f603e776eaadc53ad8b0b to your computer and use it in GitHub Desktop.
function bin2dec()
{
echo -n $((2#${1}))
}
function dec2bin()
{
D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
echo -n ${D2B[${1}]}
}
function ip2bin()
{
local X=${1}
local OLDIFS="${IFS}"
IFS="."
set -- $X
echo -n "$(dec2bin $1)$(dec2bin $2)$(dec2bin $3)$(dec2bin $4)"
IFS="$OLDIFS"
}
function dec2ip() {
printf "%d.%d.%d.%d\n" \
$(( ($1 >> 24) & 255 )) \
$(( ($1 >> 16) & 255 )) \
$(( ($1 >> 8 ) & 255 )) \
$(( ($1) & 255 ))
}
function cidrSubnetMask()
{
local ONES="11111111111111111111111111111111"
local ZEROES="00000000000000000000000000000000"
local BITS=$((32-${1}))
echo ${ONES:0:$((${#ONES}-${BITS}))}${ZEROES:0:${BITS}}
}
function cidrNetworkAddress()
{
local CIDR=${1}
local CIDR_IPADDRESS=${CIDR%%/*}
local CIDR_MASKBITS=${CIDR##*/}
local BIN_IPADDRESS="$(ip2bin ${CIDR_IPADDRESS})"
local BIN_SUBNETMASK="$(cidrSubnetMask ${CIDR_MASKBITS})"
local R=""
for I in {0..31}
do
R="${R}$(( 2#${BIN_IPADDRESS:$I:1} & 2#${BIN_SUBNETMASK:$I:1} ))"
done
echo -n "$(bin2dec ${R:0:8}).$(bin2dec ${R:8:8}).$(bin2dec ${R:16:8}).$(bin2dec ${R:24:8})"
}
function cidrSubnetMaxAddresses()
{
echo -n $(( 1 << ( 32 - ${1/*\//} )))
}
function cidrSubnetMaxHosts()
{
echo -n $(( $(cidrSubnetMaxAddresses ${1})-2 ))
}
function cidrBroadcastAddress()
{
local CIDR=${1}
local CIDR_IPADDRESS=${CIDR%%/*}
local CIDR_MASKBITS=${CIDR##*/}
local CIDR_NETWORK_ADDRESS=$(cidrNetworkAddress ${CIDR})
local CIDR_NETWORK_ADDRESS_BIN=$(ip2bin ${CIDR_NETWORK_ADDRESS})
local CIDR_NETWORK_ADDRESS_DEC=$(bin2dec ${CIDR_NETWORK_ADDRESS_BIN})
local CIDR_MAX_ADDRESSES=$(cidrSubnetMaxAddresses ${CIDR})
local CIDR_BROADCAST_ADDRESS_DEC=$(( ${CIDR_NETWORK_ADDRESS_DEC} + ${CIDR_MAX_ADDRESSES} - 1 ))
echo -n $(dec2ip ${CIDR_BROADCAST_ADDRESS_DEC})
}
function cidrListIPAddresses()
{
local OLDIFS="$IFS"
local CIDR="${1}"
local CIDR_NETWORK_ADDRESS=$(cidrNetworkAddress ${CIDR})
local CIDR_NETWORK_MASKBTIS=${CIDR##*/}
local CIDR_NETWORK_MAXHOSTS=$(cidrSubnetMaxHosts ${CIDR})
IFS="."
set -- ${CIDR_NETWORK_ADDRESS}
local IPS=$((0x$(printf "%02x%02x%02x%02x" $1 $2 $3 $4)))
local VAL=""
IFS="$OLDIFS"
for ((N=0; N<CIDR_NETWORK_MAXHOSTS; N++))
{
VAL=$((IPS|N))
printf "%d.%d.%d.%d\n" \
$(( (VAL >> 24) & 255 )) \
$(( (VAL >> 16) & 255 )) \
$(( (VAL >> 8 ) & 255 )) \
$(( (VAL) & 255 ))
}
}
@olomor
Copy link
Author

olomor commented Dec 30, 2022

Bash SubNet Calculator Code Library

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment