1*62c56f98SSadaf Ebrahimi#!/bin/sh 2*62c56f98SSadaf Ebrahimi# -*-sh-basic-offset: 4-*- 3*62c56f98SSadaf Ebrahimi# Usage: udp_proxy_wrapper.sh [PROXY_PARAM...] -- [SERVER_PARAM...] 4*62c56f98SSadaf Ebrahimi# 5*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors 6*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 7*62c56f98SSadaf Ebrahimi 8*62c56f98SSadaf Ebrahimiset -u 9*62c56f98SSadaf Ebrahimi 10*62c56f98SSadaf EbrahimiMBEDTLS_BASE="$(dirname -- "$0")/../.." 11*62c56f98SSadaf EbrahimiTPXY_BIN="$MBEDTLS_BASE/programs/test/udp_proxy" 12*62c56f98SSadaf EbrahimiSRV_BIN="$MBEDTLS_BASE/programs/ssl/ssl_server2" 13*62c56f98SSadaf Ebrahimi 14*62c56f98SSadaf Ebrahimi: ${VERBOSE:=0} 15*62c56f98SSadaf Ebrahimi 16*62c56f98SSadaf Ebrahimistop_proxy() { 17*62c56f98SSadaf Ebrahimi if [ -n "${tpxy_pid:-}" ]; then 18*62c56f98SSadaf Ebrahimi echo 19*62c56f98SSadaf Ebrahimi echo " * Killing proxy (pid $tpxy_pid) ..." 20*62c56f98SSadaf Ebrahimi kill $tpxy_pid 21*62c56f98SSadaf Ebrahimi fi 22*62c56f98SSadaf Ebrahimi} 23*62c56f98SSadaf Ebrahimi 24*62c56f98SSadaf Ebrahimistop_server() { 25*62c56f98SSadaf Ebrahimi if [ -n "${srv_pid:-}" ]; then 26*62c56f98SSadaf Ebrahimi echo 27*62c56f98SSadaf Ebrahimi echo " * Killing server (pid $srv_pid) ..." 28*62c56f98SSadaf Ebrahimi kill $srv_pid >/dev/null 2>/dev/null 29*62c56f98SSadaf Ebrahimi fi 30*62c56f98SSadaf Ebrahimi} 31*62c56f98SSadaf Ebrahimi 32*62c56f98SSadaf Ebrahimicleanup() { 33*62c56f98SSadaf Ebrahimi stop_server 34*62c56f98SSadaf Ebrahimi stop_proxy 35*62c56f98SSadaf Ebrahimi exit 129 36*62c56f98SSadaf Ebrahimi} 37*62c56f98SSadaf Ebrahimi 38*62c56f98SSadaf Ebrahimitrap cleanup INT TERM HUP 39*62c56f98SSadaf Ebrahimi 40*62c56f98SSadaf Ebrahimi# Extract the proxy parameters 41*62c56f98SSadaf Ebrahimitpxy_cmd_snippet='"$TPXY_BIN"' 42*62c56f98SSadaf Ebrahimiwhile [ $# -ne 0 ] && [ "$1" != "--" ]; do 43*62c56f98SSadaf Ebrahimi tail="$1" quoted="" 44*62c56f98SSadaf Ebrahimi while [ -n "$tail" ]; do 45*62c56f98SSadaf Ebrahimi case "$tail" in 46*62c56f98SSadaf Ebrahimi *\'*) quoted="${quoted}${tail%%\'*}'\\''" tail="${tail#*\'}";; 47*62c56f98SSadaf Ebrahimi *) quoted="${quoted}${tail}"; tail=; false;; 48*62c56f98SSadaf Ebrahimi esac 49*62c56f98SSadaf Ebrahimi done 50*62c56f98SSadaf Ebrahimi tpxy_cmd_snippet="$tpxy_cmd_snippet '$quoted'" 51*62c56f98SSadaf Ebrahimi shift 52*62c56f98SSadaf Ebrahimidone 53*62c56f98SSadaf Ebrahimiunset tail quoted 54*62c56f98SSadaf Ebrahimiif [ $# -eq 0 ]; then 55*62c56f98SSadaf Ebrahimi echo " * No server arguments (must be preceded by \" -- \") - exit" 56*62c56f98SSadaf Ebrahimi exit 3 57*62c56f98SSadaf Ebrahimifi 58*62c56f98SSadaf Ebrahimishift 59*62c56f98SSadaf Ebrahimi 60*62c56f98SSadaf Ebrahimidtls_enabled= 61*62c56f98SSadaf Ebrahimiipv6_in_use= 62*62c56f98SSadaf Ebrahimiserver_port_orig= 63*62c56f98SSadaf Ebrahimiserver_addr_orig= 64*62c56f98SSadaf Ebrahimifor param; do 65*62c56f98SSadaf Ebrahimi case "$param" in 66*62c56f98SSadaf Ebrahimi server_port=*) server_port_orig="${param#*=}";; 67*62c56f98SSadaf Ebrahimi server_addr=*:*) server_addr_orig="${param#*=}"; ipv6_in_use=1;; 68*62c56f98SSadaf Ebrahimi server_addr=*) server_addr_orig="${param#*=}";; 69*62c56f98SSadaf Ebrahimi dtls=[!0]*) dtls_enabled=1;; 70*62c56f98SSadaf Ebrahimi esac 71*62c56f98SSadaf Ebrahimidone 72*62c56f98SSadaf Ebrahimi 73*62c56f98SSadaf Ebrahimiif [ -z "$dtls_enabled" ] || [ -n "$ipv6_in_use" ]; then 74*62c56f98SSadaf Ebrahimi echo >&2 "$0: Couldn't find DTLS enabling, or IPv6 is in use - immediate fallback to server application..." 75*62c56f98SSadaf Ebrahimi if [ $VERBOSE -gt 0 ]; then 76*62c56f98SSadaf Ebrahimi echo "[ $SRV_BIN $* ]" 77*62c56f98SSadaf Ebrahimi fi 78*62c56f98SSadaf Ebrahimi exec "$SRV_BIN" "$@" 79*62c56f98SSadaf Ebrahimifi 80*62c56f98SSadaf Ebrahimi 81*62c56f98SSadaf Ebrahimiif [ -z "$server_port_orig" ]; then 82*62c56f98SSadaf Ebrahimi server_port_orig=4433 83*62c56f98SSadaf Ebrahimifi 84*62c56f98SSadaf Ebrahimiecho " * Server port: $server_port_orig" 85*62c56f98SSadaf Ebrahimitpxy_cmd_snippet="$tpxy_cmd_snippet \"listen_port=\$server_port_orig\"" 86*62c56f98SSadaf Ebrahimitpxy_cmd_snippet="$tpxy_cmd_snippet \"server_port=\$server_port\"" 87*62c56f98SSadaf Ebrahimi 88*62c56f98SSadaf Ebrahimiif [ -n "$server_addr_orig" ]; then 89*62c56f98SSadaf Ebrahimi echo " * Server address: $server_addr_orig" 90*62c56f98SSadaf Ebrahimi tpxy_cmd_snippet="$tpxy_cmd_snippet \"server_addr=\$server_addr_orig\"" 91*62c56f98SSadaf Ebrahimi tpxy_cmd_snippet="$tpxy_cmd_snippet \"listen_addr=\$server_addr_orig\"" 92*62c56f98SSadaf Ebrahimifi 93*62c56f98SSadaf Ebrahimi 94*62c56f98SSadaf Ebrahimiserver_port=$(( server_port_orig + 1 )) 95*62c56f98SSadaf Ebrahimiset -- "$@" "server_port=$server_port" 96*62c56f98SSadaf Ebrahimiecho " * Intermediate port: $server_port" 97*62c56f98SSadaf Ebrahimi 98*62c56f98SSadaf Ebrahimiecho " * Start proxy in background ..." 99*62c56f98SSadaf Ebrahimiif [ $VERBOSE -gt 0 ]; then 100*62c56f98SSadaf Ebrahimi echo "[ $tpxy_cmd_snippet ]" 101*62c56f98SSadaf Ebrahimifi 102*62c56f98SSadaf Ebrahimieval exec "$tpxy_cmd_snippet" >/dev/null 2>&1 & 103*62c56f98SSadaf Ebrahimitpxy_pid=$! 104*62c56f98SSadaf Ebrahimi 105*62c56f98SSadaf Ebrahimiif [ $VERBOSE -gt 0 ]; then 106*62c56f98SSadaf Ebrahimi echo " * Proxy ID: $TPXY_PID" 107*62c56f98SSadaf Ebrahimifi 108*62c56f98SSadaf Ebrahimi 109*62c56f98SSadaf Ebrahimiecho " * Starting server ..." 110*62c56f98SSadaf Ebrahimiif [ $VERBOSE -gt 0 ]; then 111*62c56f98SSadaf Ebrahimi echo "[ $SRV_BIN $* ]" 112*62c56f98SSadaf Ebrahimifi 113*62c56f98SSadaf Ebrahimi 114*62c56f98SSadaf Ebrahimiexec "$SRV_BIN" "$@" >&2 & 115*62c56f98SSadaf Ebrahimisrv_pid=$! 116*62c56f98SSadaf Ebrahimi 117*62c56f98SSadaf Ebrahimiwait $srv_pid 118*62c56f98SSadaf Ebrahimi 119*62c56f98SSadaf Ebrahimistop_proxy 120*62c56f98SSadaf Ebrahimireturn 0 121