This repository has been archived by the owner on Sep 22, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Heroku Deploy Buttons do not currently support Git Submodules, which we need in order to pull the latest version of the rs-conn script automagically.
- Loading branch information
Showing
2 changed files
with
165 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
web: ./sputnik/sockets-connect/rs-conn python3 sputnik | ||
web: ./sputnik/vendor/rs-conn python3 sputnik |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <string> | ||
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 <string> | ||
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 |