2018-01-27 17:57:57 +00:00
#!/bin/bash
# (1) Primary setup
#--------------------------------------------------------#
# (1) Get current ABS directory
ROOT=$(dirname `realpath $0`);
# (2) Check required arguments
test $# -lt 4 && echo -e "ERR: Missing arguments\n\nARGUMENTS:\n\tname\t\tThe name of the machine\n\ttarget_host\tThe hostname (or ip) of the target\n\tout_port\tThe port you want to use to send\n\tin_port\t\tThe port the peer uses to listen\n\ttrigger_port\tOptional param. Used to trigger the peer connection\n" && exit 1;
# (3) Manage optional param #
TRIGGER="";
test $# -ge 5 && TRIGGER="$5";
# (2) Secondary setup
#--------------------------------------------------------#
# (1) Reset configuration file
test -f $ROOT/config && rm $ROOT/config;
# (2) Create buffer paths
BUF_IN="/tmp/buf_in_$4";
BUF_OUT="/tmp/buf_out_$2_$3";
# (3) Flush buffers
echo -ne "" > $BUF_IN;
echo -ne "" > $BUF_OUT;
# (3) Launch INPUT server
#--------------------------------------------------------#
# (1) Start the script in background
(
infail=0;
# kill script after 10 failures
while [ $infail -lt 10 ]; do
# main command
2018-01-28 12:44:55 +00:00
echo "(.) started [input]";
nc -lp $4 >> $BUF_IN 2> /dev/null && infail=0 || ( infail=`expr $infail + 1`; exit 1 ) || echo "Port $4 already in use";
2018-01-27 17:57:57 +00:00
# try to kill proccess that uses port if failed and such proccess exists
2018-01-28 12:44:55 +00:00
if [ $infail -eq 0 ]; then
echo " > END [input]";
else
echo " > FAIL [input]";
2018-01-27 17:57:57 +00:00
LISTEN_PID=`lsof -n -i4TCP:$4 | grep LISTEN | awk '{print $2}'`;
test -z "$LISTEN_PID" && kill -9 $LISTEN_PID;
fi;
done;
)&
# (2) Store the background proccess PID #
IN_PID=$!;
################################
# IF SET, SEND TRIGGER TO PEER #
################################
2018-01-28 12:44:55 +00:00
test ! -z "$TRIGGER" && ( echo "(.) sending [trigger:$2:$TRIGGER]"; bash -c "exec 3<>/dev/tcp/$2/$TRIGGER" && echo " > SENT [trigger:$2:$TRIGGER]" || echo " > ERR [trigger:$2:$TRIGGER]" )
2018-01-27 17:57:57 +00:00
##################################
# WAIT 2s FOR THE PEER TO LISTEN #
##################################
sleep 2;
# (4) Launch OUTPUT server
#--------------------------------------------------------#
# (1) Launch output server
(
outfail=0;
2018-01-28 12:44:55 +00:00
# stop after 5 failed attempts
while [ $outfail -lt 5 ]; do
2018-01-27 17:57:57 +00:00
# main command
2018-01-28 12:44:55 +00:00
echo "(.) started [output]";
tail -f $BUF_OUT | nc $2 $3 2>/dev/null && outfail=0 || ( outfail=`expr $outfail + 1`; exit 1 ) || echo "Cannot connect to $2:$3";
2018-01-27 17:57:57 +00:00
2018-01-28 12:44:55 +00:00
test $outfail -eq 0 && echo " > END [output]" || echo " > FAIL [output]";
2018-01-27 17:57:57 +00:00
sleep 1; # can sleep because the buffer is never flushed
done&
)&
# (2) Store the background proccess PID #
OUT_PID=$!;
# (5) Store the config file for 'write' + 'send' to work properly
#--------------------------------------------------------#
# (1) Store config file in 'config_$NAME'
echo -e "#!/bin/bash\nBUF_IN=\"$BUF_IN\"; BUF_OUT=\"$BUF_OUT\";\nIN_PID=$IN_PID; OUT_PID=$OUT_PID;\n" > $ROOT/config_$1;
2018-01-28 12:44:55 +00:00
# (2) Notify server started #
# (6) Manage ending proccess
#--------------------------------------------------------#
# (1) Kill subproccesses if Ctrl+C #
2018-01-28 15:58:24 +00:00
trap "kill -9 $OUT_PID 2>/dev/null; kill -9 $IN_PIT 2>/dev/null; rm $ROOT/config_$1; pkill nc 2>/dev/null; rm $BUF_OUT; rm $BUF_IN; exit 1;" INT;
trap "kill -9 $OUT_PID 2>/dev/null; kill -9 $IN_PIT 2>/dev/null; rm $ROOT/config_$1; pkill nc 2>/dev/null; rm $BUF_OUT; rm $BUF_IN; exit 1;" KILL;
2018-01-28 12:44:55 +00:00
# (2) Wait for daemons to stop #
wait $OUT_PID;
wait $IN_PID;
pkill nc 2>/dev/null;
# (3) Remove config file #
rm $ROOT/config_$1;
2018-01-28 15:58:24 +00:00
# (4) Remove buffers #
rm $BUF_OUT;
rm $BUF_IN;
2018-01-28 12:44:55 +00:00