Skip to content

Instantly share code, notes, and snippets.

@jiphex
Created August 26, 2011 10:32
Show Gist options
  • Save jiphex/1173162 to your computer and use it in GitHub Desktop.
Save jiphex/1173162 to your computer and use it in GitHub Desktop.
Generate RFC4193 Shell Script
#!/bin/sh
#
# @(#) generate-rfc4193-addr.sh (ULA) (c) Sep 2004 - Jun 2011 Holger Zuleger
#
# do what the name suggest
#
# firstpart = 64-Bit NTP time
# secondpart = EUI-64 Identifier or 48 Bit MAC-Adress
# sha1sum ($firstpart | $secondpart )
# use least significant 40 Bits of sha1sum
# build global prefix (locally assigned == FD00::/8)
#
# (M1) 11. May 2006
# - a check added to complain if firstpart or secondpart is empty
# - firstpart calculation changed in such a way, that only one transmit
# time is stored (ntpdate since version 4.2.0 use a list of ntp servers)
#
# (M2) 27. Aug 2006
# Fixed bug in using reference time instead of transmit timestamp.
# Thanks to Marc A. Donges for finding this out
#
# (M3) 4. Sep 2006
# Use ntpq instead of ntpdate because the latter is deprecated.
# This requires a local running and syncronized ntpd, but
# speeds up the execution time
#
# (M4) 29. Dec 2006
# set LC_ALL=C at the beginning of the script, to be sure the grep command
# used to scan the output of the ifconfig command finds the expected string
# Thanks to Ted Percival for finding this out
#
# (M5) 5. Jun 2011
# tr command added to remove the trailing newline from the sha1 calculation
# Thanks to Reinard Max for the fix
#
# (M6) 26. Aug 2011
# Modified to work on BSD as well as Linux, and take the interface as $1
#
PATH=/usr/local/bin:/bin:/usr/bin:/usr/sbin:/sbin
debug=0
USE_NTPQ=1
NTPSERVER=pool.ntp.org
test -z $1 && echo "Usage: $0 INTERFACE" && exit 1
#(M4)
LC_ALL=C
export LC_ALL
#(M3)
if test $USE_NTPQ -eq 1
then
if time=`ntpq -c rv | grep clock=`
then
test $debug -eq 1 && echo "$time"
firstpart=`echo $time | sed -e "s/clock=//" -e "s/ .*//" -e "s/\.//"`
else
echo "no local ntpd running" 1>&2
exit 1
fi
else
#(M1)
#(M2)
firstpart=`ntpdate -d -q $NTPSERVER 2>/dev/null | sed "/transmit timestamp/q" |
sed -n "/transmit time/s/^transmit timestamp: *\([^ ]*\) .*/\1/p" |
tr -d "."`
fi
secondpart=`ifconfig $1 |
egrep "inet6 (addr: )?fe80" |
sed -n "s/^.*fe80::\([0-9a-f\:]*\).*/\1/p" |
tr -d ":"`
#(M1)
if test -z "$firstpart" -o -z "$secondpart"
then
echo "$0: installation error: check if ntpdate and ifconfig is in search path"
exit 1
fi
test $debug -eq 1 && echo "Firstpart: $firstpart"
test $debug -eq 1 && echo "Secondpart: $secondpart"
test $debug -eq 1 && echo "123456789o123456789o123456789o123456789o123456789o123456789o"
test $debug -eq 1 && echo ${firstpart}${secondpart} | sha1sum
#(M5)
globalid=`echo ${firstpart}${secondpart} | tr -d "\012" | sha1sum | cut -c31-40`
test $debug -eq 1 && echo $globalid
echo fd${globalid} | sed "s|\(....\)\(....\)\(....\)|\1:\2:\3::/48|"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment