diff --git a/Procfile b/Procfile index 82ce617..8e1860a 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: ./sputnik/sockets-connect/rs-conn python3 sputnik +web: ./sputnik/vendor/rs-conn python3 sputnik diff --git a/sputnik/vendor/rs-conn b/sputnik/vendor/rs-conn new file mode 100755 index 0000000..03f55ed --- /dev/null +++ b/sputnik/vendor/rs-conn @@ -0,0 +1,164 @@ +#!/bin/bash + +# Argument = -t test -r server -p password -v + +usage() +{ +cat << EOF +usage: $0 options {cmd} + +Run an app over a RuppellSok tunnel. + +OPTIONS: + -h Show this message + -r tunnel URI + -f Frontend port to connect your app to + -b Port your app runs on (defaults to 1337) + -v Verbose +EOF +} + +TUNNEL_URI= +FRONTEND_URI= +BACKEND_PORT= +VERBOSE= + +while getopts “hr:f:b:v” OPTION +do + case $OPTION in + h) + usage + exit 1 + ;; + r) + TUNNEL_URI=$OPTARG + ;; + f) + FRONTEND_URI=$OPTARG + ;; + b) + BACKEND_PORT=$OPTARG + ;; + v) + VERBOSE=1 + ;; + ?) + usage + exit + ;; + esac +done + +CMD=${@:$OPTIND:$#} + +if [[ -z $CMD ]] +then + usage + exit 1 +fi + +if [[ -z $FRONTEND_URI && -z $RUPPELLS_SOCKETS_FRONTEND_URI && -z $TUNNEL_URI && -z $RUPPELLS_SOCKETS_TUNNEL_URI ]] +then + echo "No frontend or tunnel URI defined, falling back to dev mode." + echo " You can connect to your app on localhost:10000" + BACKEND_PORT=10000 + DEV_MODE=true +else + if [[ -z $FRONTEND_URI ]] + then + if [[ -z $RUPPELLS_SOCKETS_FRONTEND_URI ]] + then + usage + exit 1 + fi + FRONTEND_URI=$RUPPELLS_SOCKETS_FRONTEND_URI + fi + FRONTEND_PORT=${FRONTEND_URI##tcp://}; FRONTEND_PORT=${FRONTEND_PORT#*:}; FRONTEND_PORT=${FRONTEND_PORT%*/} + + if [[ -z $BACKEND_PORT ]] + then + BACKEND_PORT=1337 + fi + + if [[ -z $TUNNEL_URI ]] + then + if [[ -z $RUPPELLS_SOCKETS_TUNNEL_URI ]] + then + usage + exit 1 + fi + TUNNEL_URI=$RUPPELLS_SOCKETS_TUNNEL_URI + fi + + # kudos - https://gist.github.com/cdown/1163649 + urlencode() { + # urlencode + local length="${#1}" + for (( i = 0 ; i < length ; i++ )); do + local c="${1:i:1}" + case "$c" in + [a-zA-Z0-9.~_-]) printf "$c" ;; + ' ') printf + ;; + *) printf '%%%X' "'$c" + esac + done + } + + urldecode() { + # urldecode + local url_encoded=${1//+/ } + printf '%b' "${url_encoded//%/\\x}" + } + + SSH_AUTH=${TUNNEL_URI##ssh://} ; SSH_AUTH=${SSH_AUTH%@*} + SSH_USER=${SSH_AUTH%:*} + urldecode ${SSH_AUTH#*:} > /tmp/$$.key + chmod 600 /tmp/$$.key + + SSH_ENDPOINT=${TUNNEL_URI##ssh://*@} + SSH_HOST=${SSH_ENDPOINT%:*} + SSH_PORT=${SSH_ENDPOINT#*:} +fi + +function sigtermed() +{ + if [[ $VERBOSE ]] ; then echo "forwarding SIGTERM to children" ; fi + kill -SIGTERM $CMDPID 2>/dev/null + (sleep 10 ; kill -0 $CMDPID ; if [[ $? ]]; then kill -9 $CMDPID ; fi ; ) & KILLER_PID=$! + wait $CMDPID 2>/dev/null + CMDEXIT=$? + kill $KILLER_PID 2>/dev/null + exit $CMDEXIT +} + +function finish() +{ + EXIT_CODE=$? + kill -9 $SSHPID 2>/dev/null + rm /tmp/$$.key + exit $EXIT_CODE +} + +trap sigtermed SIGTERM SIGINT +trap finish EXIT + +if [[ -z $DEV_MODE ]] +then + echo -n "Connecting tcp://localhost:${BACKEND_PORT}/ to ${FRONTEND_URI}... " + ssh -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -nN -i /tmp/$$.key -R $FRONTEND_PORT:127.0.2.1:$BACKEND_PORT -l $SSH_USER $SSH_HOST $KEY_CMD -p $SSH_PORT & SSHPID=$! + echo "done" +fi +echo -n "Running ${CMD}... " +RUPPELLS_SOCKETS_LOCAL_PORT=$BACKEND_PORT $CMD & CMDPID=$! +echo "done" + +if [[ -z $DEV_MODE ]] +then + while $(kill -0 $CMDPID) && $(kill -0 $SSHPID); do + sleep 0.5 + done +else + while $(kill -0 $CMDPID); do + sleep 0.5 + done +fi