diff --git a/contrib/scripts/test-ppp.sh b/contrib/scripts/test-ppp.sh new file mode 100755 index 0000000000..c100e976fa --- /dev/null +++ b/contrib/scripts/test-ppp.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# test-ppp.sh: +# +# Test script that creates an netns and connect it with +# veth pairs. On the other end, it runs pppoe-server. +# It also creates a NetworkManager profile that can be activated. +# +# Usage: +# +# ./test-ppp.sh [setup]: create the setup. This implies a "cleanup" +# first. +# ./test-ppp.sh cleanup: cleanup the things that the script created. +set -e + +export IFACE=net1 +export IFACE_PEER=net1-x +export CON_NAME="ppp-$IFACE" +export NETNS=nm-ppp +export PPP_SERVICE=isp +export PPP_AUTH=pap +export PPP_USER=test-user +export PPP_PASSWD=test-passwd +export IP_PEER="192.168.133.6" +export IP_RANGE="192.168.133.100-130" + +die() { + printf '%s\n' "$*" >&2 + exit 1 +} + +do_cleanup() { + pkill -F "/tmp/nm-test-ppp-$IFACE.pid" pppoe-server &>/dev/null || : + rm -rf \ + "/tmp/nm-test-ppp-$IFACE.pid" \ + "/tmp/nm-test-ppp-allip-$IFACE" \ + "/tmp/nm-test-ppp-pppoe-server-options-$IFACE" \ + "/tmp/nm-test-ppp-$IFACE-$PPP_AUTH-secrets" + ip --netns "$NETNS" link delete "$IFACE_PEER" &>/dev/null || : + ip netns delete "$NETNS" &>/dev/null || : + + nmcli connection delete id ppp-net1 || : +} + +do_setup() { + do_cleanup + + ip netns add "$NETNS" + ip --netns "$NETNS" link add "$IFACE" type veth peer "$IFACE_PEER" + ip --netns "$NETNS" link set "$IFACE_PEER" up + + ip --netns "$NETNS" addr add "$IP_PEER/24" dev "$IFACE_PEER" + + echo "$IP_RANGE" > "/tmp/nm-test-ppp-allip-$IFACE" + + cat < "/tmp/nm-test-ppp-pppoe-server-options-$IFACE" +require-$PPP_AUTH +lcp-echo-interval 10 +lcp-echo-failure 2 +ms-dns 8.8.8.8 +ms-dns 8.8.4.4 +netmask 255.255.255.0 +defaultroute +noipdefault +usepeerdns +EOF + + echo "$PPP_USER * $PPP_PASSWD $IP_PEER" > "/tmp/nm-test-ppp-$IFACE-$PPP_AUTH-secrets" + chmod 600 "/tmp/nm-test-ppp-$IFACE-$PPP_AUTH-secrets" + mkdir -p /etc/ppp + touch "/etc/ppp/$PPP_AUTH-secrets" + ip netns exec "$NETNS" bash -ex <( + cat <<'EOF' + mount -o bind "/tmp/nm-test-ppp-$IFACE-$PPP_AUTH-secrets" "/etc/ppp/$PPP_AUTH-secrets" && + exec pppoe-server \ + -X "/tmp/nm-test-ppp-$IFACE.pid" \ + -S "$PPP_SERVICE" \ + -C "$PPP_SERVICE" \ + -L "$IP_PEER" \ + -p "/tmp/nm-test-ppp-allip-$IFACE" \ + -I "$IFACE_PEER" \ + -O "/tmp/nm-test-ppp-pppoe-server-options-$IFACE" +EOF +) & + + ip --netns "$NETNS" link set "$IFACE" netns $$ + + nmcli connection add \ + type pppoe \ + con-name "$CON_NAME" \ + ifname "ppp-$IFACE" \ + pppoe.parent "$IFACE" \ + service "$PPP_SERVICE" \ + username "$PPP_USER" \ + password "$PPP_PASSWD" \ + autoconnect no +} + +CMD="${1-setup}" +case "$CMD" in + setup| \ + cleanup) + "do_$CMD" + ;; + *) + die "invalid command $1" + ;; +esac