#!/bin/bash

leasefile='/var/run/dhclient6_eth5_832.leases'
EXT_IFACE='eth5.832' #une seule interface autorisée
INT_IFACE=('eth0') #Plusieurs interfaces autorisées ex : INT_IFACE=('eth0' 'eth0.10')
INT_PREFIX=('01') #Plusieurs prefixes autorisés (chaque interface doit avoir un préfixe) ex : INT_PREFIX=('01' '02')
#Les logs sont sont consultables avec journalctl -t dhclient-ipv6
#Il faut configurer autoconf sur $INT_IFACE pour recevoir le prefix uniquement
#Il faut parfois attendre 20 minutes pour recevoir route par défaut+préfix de chez Orange
#Rendre ce fichier executable

ipv6_ifsetup(){
#Suppression des anciennes adresses/routes pour les interfaces internes/externes
#Recréation des adresses/routes internes

systemctl stop radvd >/dev/null 2>&1

for if in ${!INT_IFACE[@]} ; do

  IFACE=${INT_IFACE[$if]}
  IPREFIX=${INT_PREFIX[$if]}

  iface_prefix=`echo $current_pdnet | cut -d: -f1-3`
  iface_prefix+=:`echo $current_pdnet | awk -F':' '{print "000"$4}' | rev | cut -c3-4 | rev`
  iface_prefix+=$IPREFIX
  iface_prefix+="::/64"
  
  #Suppression des adresses internes
  ifip=($(ip -6 a s dev $IFACE scope global| grep inet6 | awk -F' ' '{print $2}'))
  for i in ${!ifip[@]} ;do

    iface_ip=${ifip[$i]}
    ip -6 a d "$iface_ip" dev $IFACE
    echo "Delete ipv6 address : $iface_ip on interface $IFACE" | systemd-cat -p info -t dhclient-ipv6
  done
  
  #Suppression des routes internes
  ifrt=($(ip -6 r s dev $IFACE | grep -v -e "default via" -e "fe80::/64" | awk -F' ' '{print $1}'))
  for i in ${!ifrt[@]} ;do

    iface_rt=${ifrt[$i]}
    ip -6 r d "$iface_ip" dev $IFACE
    echo "Delete ipv6 route : $iface_ip on interface $IFACE" | systemd-cat -p info -t dhclient-ipv6
  done

  iface_ip=`echo $iface_prefix |sed 's|::/64|::1/64|g'`
  echo "Create ipv6 address : $iface_ip on interface $IFACE" | systemd-cat -p info -t dhclient-ipv6	
  ip -6 a a "$iface_ip" dev $IFACE scope global
  
  if [ "$(ip -6 r s $iface_prefix dev $IFACE)" = "" ] ; then
   
    echo "Check ipv6 route failed : create route $iface_prefix on interface $IFACE" | systemd-cat -p info -t dhclient-ipv6	
    ip -6 r a "$iface_prefix" dev $IFACE proto kernel
  fi
done

extifip=($(ip -6 a s dev $EXT_IFACE scope global| grep inet6 | awk -F' ' '{print $2}'))
for i in ${!extifip[@]} ; do

    ip -6 a d "${extifip[$i]}" dev $IFACE	
    echo "Delete ipv6 address : ${extifip[$i]} on interface $EXT_IFACE" | systemd-cat -p info -t dhclient-ipv6
done

extifrt=($(ip -6 r s dev $EXT_IFACE | grep -v -e "default via" -e "fe80::/64" | awk -F' ' '{print $1}'))
for i in ${!extifrt[@]} ; do

    ip -6 r d "${extifrt[$i]}" dev $IFACE	
    echo "Delete ipv6 address : ${extifrt[$i]} on interface $EXT_IFACE" | systemd-cat -p info -t dhclient-ipv6
done

systemctl restart radvd >/dev/null 2>&1
}

ipv6_radvd_reconf(){
#Suppression du fichier /etc/radvd.conf
echo > /etc/radvd.conf

for if in ${!INT_IFACE[@]}
do

  IFACE=${INT_IFACE[$if]}
  IPREFIX=${INT_PREFIX[$if]}

  iface_prefix=`echo $current_pdnet | cut -d: -f1-3`
  iface_prefix+=:`echo $current_pdnet | awk -F':' '{print "000"$4}' | rev | cut -c3-4 | rev`
  iface_prefix+=$IPREFIX
  iface_prefix+="::/64"
  
  echo "# Generated automatically by dhclient6-script exit-hook on `date`" >> /etc/radvd.conf
  echo "interface $IFACE {" >> /etc/radvd.conf
  echo "  IgnoreIfMissing on;" >> /etc/radvd.conf
  echo "  AdvCurHopLimit 64;" >> /etc/radvd.conf
  echo "  AdvLinkMTU 0;" >> /etc/radvd.conf
  echo "  AdvSendAdvert on;" >> /etc/radvd.conf
  echo "  MaxRtrAdvInterval 600;" >> /etc/radvd.conf
  echo "  AdvDefaultPreference medium;" >> /etc/radvd.conf
  echo "  AdvOtherConfigFlag off;" >> /etc/radvd.conf
  echo "  AdvReachableTime 0;" >> /etc/radvd.conf
  echo "  AdvDefaultLifetime 1800;" >> /etc/radvd.conf
  echo "  MinRtrAdvInterval 198;" >> /etc/radvd.conf
  echo "  AdvRetransTimer 0;" >> /etc/radvd.conf
  echo "  AdvManagedFlag off;" >> /etc/radvd.conf
  echo "  prefix $iface_prefix {" >> /etc/radvd.conf
  echo "    AdvPreferredLifetime 604800;" >> /etc/radvd.conf
  echo "    AdvOnLink on;" >> /etc/radvd.conf
  echo "    AdvValidLifetime 2592000;" >> /etc/radvd.conf
  echo "    AdvAutonomous on;" >> /etc/radvd.conf
  echo "  };" >> /etc/radvd.conf
  echo "};" >> /etc/radvd.conf  
  echo " " >> /etc/radvd.conf  

done

}

ipv6_checkdefaultroute() {

#Contrôle de la route par défaut et ajout ou modification (ne pas créer via set protocols)
default_iface=`ip -6 route | grep fe80::ba0:bab | awk -F ' ' '{print $5}'`
echo "Current default ipv6 route interface :" $default_iface | systemd-cat -p info -t dhclient-ipv6

if [ "$default_iface" != "$EXT_IFACE" ] ; then

  if [ "$default_iface" = "" ] ; then

    ip -6 route add default via fe80::ba0:bab dev $EXT_IFACE
    echo "Default ipv6 route is missing --> Add a new one" | systemd-cat -p warning -t dhclient-ipv6
  else 

    ip -6 route change default via fe80::ba0:bab dev $EXT_IFACE
    echo "Default ipv6 route incorrectly set to $default_iface --> Remapping to $EXT_IFACE" | systemd-cat -p warning -t dhclient-ipv6
  fi
fi
}

echo "Starting dhclient-ipv6 for $reason at `date`" | systemd-cat -p info -t dhclient-ipv6

current_pd=`cat $leasefile | grep prefix | awk -F ' ' '{print $2}'`
current_pdnet=`echo $current_pd | rev | cut -c6- | rev`
current_basenet=`echo $current_pdnet | cut -d: -f1-3`:`echo $current_pdnet | awk -F':' '{print "000"$4}' | rev | cut -c3-4 | rev`

ipv6_checkdefaultroute

case "$reason" in
  BOUND6|REBIND6)

    if [ ! -z "$new_ip6_prefix" ] ; then
      echo "Received prefix : " $new_ip6_prefix  | systemd-cat -p info -t dhclient-ipv6
      ipv6_radvd_reconf
      ipv6_ifsetup
    fi
    ;;
  REBOOT|PREINIT6)

  if [ "$current_pd" != "" ] ; then
    echo "IPv6 lease seems OK. Current prefix is $current_pd -> Start ipv6 config" | systemd-cat -p info -t dhclient-ipv6
    ipv6_ifsetup
  fi
    ;;
esac