#!/bin/sh [ -x /usr/sbin/xl2tpd ] || exit 0 [ -n "$INCLUDE_ONLY" ] || { . /lib/functions.sh . ../netifd-proto.sh init_proto "$@" } proto_l2tp_init_config() { proto_config_add_string "username" proto_config_add_string "password" proto_config_add_string "keepalive" proto_config_add_string "pppd_options" proto_config_add_boolean "ipv6" proto_config_add_int "demand" proto_config_add_int "mtu" proto_config_add_int "checkup_interval" proto_config_add_string "server" available=1 no_device=1 no_proto_task=1 } proto_l2tp_setup() { local interface="$1" local optfile="/tmp/l2tp/options.${interface}" local ip serv_addr server host json_get_var server server host="${server%:*}" for ip in $(resolveip -t 5 "$host"); do ( proto_add_host_dependency "$interface" "$ip" ) serv_addr=1 done [ -n "$serv_addr" ] || { echo "Could not resolve server address" >&2 sleep 5 proto_setup_failed "$interface" exit 1 } # Start and wait for xl2tpd if [ ! -p /var/run/xl2tpd/l2tp-control -o -z "$(pidof xl2tpd)" ]; then /etc/init.d/xl2tpd restart local wait_timeout=0 while [ ! -p /var/run/xl2tpd/l2tp-control ]; do wait_timeout=$(($wait_timeout + 1)) [ "$wait_timeout" -gt 5 ] && { echo "Cannot find xl2tpd control file." >&2 proto_setup_failed "$interface" exit 1 } sleep 1 done fi local ipv6 demand keepalive username password pppd_options mtu json_get_vars ipv6 demand keepalive username password pppd_options mtu [ "$ipv6" = 1 ] || ipv6="" if [ "${demand:-0}" -gt 0 ]; then demand="precompiled-active-filter /etc/ppp/filter demand idle $demand" else demand="persist" fi local interval="${keepalive##*[, ]}" [ "$interval" != "$keepalive" ] || interval=5 keepalive="${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}}" username="${username:+user \"$username\" password \"$password\"}" ipv6="${ipv6:++ipv6}" mtu="${mtu:+mtu $mtu mru $mtu}" mkdir -p /tmp/l2tp cat <"$optfile" usepeerdns nodefaultroute ipparam "$interface" ifname "l2tp-$interface" ip-up-script /lib/netifd/ppp-up ipv6-up-script /lib/netifd/ppp-up ip-down-script /lib/netifd/ppp-down ipv6-down-script /lib/netifd/ppp-down # Don't wait for LCP term responses; exit immediately when killed. lcp-max-terminate 0 $keepalive $username $ipv6 $mtu $pppd_options EOF xl2tpd-control add l2tp-${interface} pppoptfile=${optfile} lns=${server} || { echo "xl2tpd-control: Add l2tp-$interface failed" >&2 proto_setup_failed "$interface" exit 1 } xl2tpd-control connect l2tp-${interface} || { echo "xl2tpd-control: Connect l2tp-$interface failed" >&2 proto_setup_failed "$interface" exit 1 } } proto_l2tp_teardown() { local interface="$1" local optfile="/tmp/l2tp/options.${interface}" rm -f ${optfile} if [ -p /var/run/xl2tpd/l2tp-control ]; then xl2tpd-control remove l2tp-${interface} || { echo "xl2tpd-control: Remove l2tp-$interface failed" >&2 } fi # Wait for interface to go down while [ -d /sys/class/net/l2tp-${interface} ]; do sleep 1 done } [ -n "$INCLUDE_ONLY" ] || { add_protocol l2tp }