#!/usr/bin/env bash STARTUP_CONFIG=${STARTUP_CONFIG:="/config/vpp/startup.conf"} VPPCFG_YAML_FILE=${VPPCFG_YAML_FILE:="/config/vpp/vppcfg.yaml"} VPPCFG_VPP_FILE=${VPPCFG_VPP_FILE:="/config/vpp/config/vppcfg.vpp"} CLAB_VPP_FILE=${CLAB_VPP_FILE:="/config/vpp/config/clab.vpp"} NETNS=${NETNS:="dataplane"} BIRD_ENABLED=${BIRD_ENABLED:="true"} BIRD_CONFIG=${BIRD_CONFIG:="/config/bird/bird.conf"} FRR_ENABLED=${FRR_ENABLED:="false"} FRR_CONFIG=${FRR_CONFIG:="/config/frr/frr.conf"} echo "Creating dataplane namespace" /usr/bin/mkdir -p /etc/netns/$NETNS /usr/bin/touch /etc/netns/$NETNS/resolv.conf /usr/sbin/ip netns add $NETNS /usr/bin/nsenter --net=/run/netns/$NETNS /usr/sbin/ip link set lo up echo "Starting SSH, with credentials root:vpp" sed -i -e 's,^#PermitRootLogin prohibit-password,PermitRootLogin yes,' /etc/ssh/sshd_config sed -i -e 's,^root:.*,root:$y$j9T$kG8pyZEVmwLXEtXekQCRK.$9iJxq/bEx5buni1hrC8VmvkDHRy7ZMsw9wYvwrzexID:20211::::::,' /etc/shadow /etc/init.d/ssh start # TODO(pim): Remove this after containerlab 0.75 is released if [ ! -r /config/vpp/startup.conf ]; then echo "Detected old containerlab binary - invoking backwards compatible behavior" STARTUP_CONFIG="/etc/vpp/startup.conf" VPPCFG_YAML_FILE="/etc/vpp/vppcfg.yaml" VPPCFG_VPP_FILE="/config/vpp/config/vppcfg.vpp" CLAB_VPP_FILE="/config/vpp/config/clab.vpp" BIRD_CONFIG="/etc/bird/bird.conf" FFR_CONFIG="/etc/frr/frr.conf" mkdir -p /config/vpp/config/ echo "comment { please upgrade to containerlab 0.75+ }" > /config/vpp/config/manual-pre.vpp echo "comment { please upgrade to containerlab 0.75+ }" > /config/vpp/config/manual-post.vpp else echo "Initializing /config" for dir in vpp bird frr; do rsync -av --ignore-existing /etc/$dir/ /config/$dir/ rm -rf /etc/$dir/ ln -s /config/$dir /etc/$dir done fi if [ "$BIRD_ENABLED" == "true" ]; then echo "Starting Bird in $NETNS" mkdir -p /run/bird /var/log/bird chown bird:bird /var/log/bird ROUTERID=$(ip -br a show eth0 | awk '{ print $3 }' | cut -f1 -d/) sed -i -e "s,.*router id .*,router id $ROUTERID; # Set by container-init.sh," $BIRD_CONFIG /usr/bin/nsenter --net=/run/netns/$NETNS /usr/sbin/bird -u bird -g vpp -c $BIRD_CONFIG fi if [ "$FRR_ENABLED" == "true" ]; then echo "Starting FRRouting in $NETNS" ROUTERID=$(ip -br a show eth0 | awk '{ print $3 }' | cut -f1 -d/) sed -i -e "s,^ip router-id .*,ip router-id $ROUTERID," $FRR_CONFIG /etc/init.d/frr start fi echo "Generating $CLAB_VPP_FILE" : > $CLAB_VPP_FILE MTU=9216 for IFNAME in $(ip -br link show type veth | cut -f1 -d@ | grep -v '^eth0$' | sort); do MAC=$(ip -br link show dev $IFNAME | awk '{ print $3 }') echo " * $IFNAME hw-addr $MAC mtu $MTU" ip link set $IFNAME up mtu $MTU cat << EOF >> $CLAB_VPP_FILE create host-interface name $IFNAME hw-addr $MAC set interface name host-$IFNAME $IFNAME set interface mtu $MTU $IFNAME set interface state $IFNAME up EOF done if [ -s $VPPCFG_YAML_FILE ]; then echo "Generating $VPPCFG_YAML_FILE into $VPPCFG_VPP_FILE" : > $VPPCFG_VPP_FILE if [ -r $VPPCFG_YAML_FILE ]; then vppcfg plan --novpp -c $VPPCFG_YAML_FILE -o $VPPCFG_VPP_FILE fi else echo "Generating empty $VPPCFG_VPP_FILE due to missing or empty $VPPCFG_YAML_FILE" echo "comment { please provide a vppcfg.yaml file }" > $VPPCFG_VPP_FILE fi echo "Starting VPP" exec /usr/bin/vpp -c $STARTUP_CONFIG