#!/bin/bash ################################################################################ # Author: Fred (support@qo-op.com) # Version: 0.1 # License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) ################################################################################ ################################################################################ ## ASTROPORT API SERVER http://${myHOST}:1234 ## ATOMIC GET REDIRECT TO ONE SHOT WEB SERVICE THROUGH PORTS ## ASYNCHRONOUS IPFS API ################################################################################ MY_PATH="`dirname \"$0\"`" # relative MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized . "${MY_PATH}/tools/my.sh" PORT=12345 YOU=$(myIpfsApi); ## API of $USER running ipfs echo "YOU=$YOU" LIBRA=$(myIpfsGw) ## SWARM#0 ENTRANCE URL echo "LIBRA=$LIBRA" TUBE=$(myTube) echo "TUBE=$TUBE" mkdir -p ~/.zen/tmp/coucou/ ~/.zen/game/players/localhost ## CHECK FOR ANY ALREADY RUNNING nc ncrunning=$(ps axf --sort=+utime | grep -w 'nc -l -p 1234' | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) [[ $ncrunning ]] && echo "RESTARTING" && kill -9 $ncrunning ## NOT RUNNING TWICE # Some client needs to respect that HTTPCORS="HTTP/1.1 200 OK Access-Control-Allow-Origin: ${myASTROPORT} Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET Server: Astroport.ONE Content-Type: text/html; charset=UTF-8 " echo "_________________________________________________________ $(date)" echo "LAUNCHING Astroport API Server - TUBE : $LIBRA - " echo echo "GCHANGE ${myASTROPORT}/?salt=totodu56&pepper=totodu56&g1pub" echo "OPEN TW ${myASTROPORT}/?salt=totodu56&pepper=totodu56&g1pub=astro" echo "GCHANGE MESSAGING ${myASTROPORT}/?salt=totodu56&pepper=totodu56&messaging" echo "CREATE SAME PLAYER : ${myASTROPORT}/?salt=totodu56&pepper=totodu56&g1pub=on&email=totodu56@yopmail.com" echo echo "NEW PLAYER : ${myASTROPORT}/?salt=${RANDOM}&pepper=${RANDOM}&g1pub=on&email=astro${RANDOM}@yopmail.com" echo echo "BunkerBOX : ${myASTROPORT}/?salt=totodu56&pepper=totodu56&g1pub=_URL_&email=totodu56@yopmail.com" echo echo "TESTCRAFT ${myASTROPORT}/?salt=totodu56&pepper=totodu56&testcraft=on&dataid=QmPXhrqQrS1bePKJUPH9cJ2qe4RrNjaJdRXaJzSjxWuvDi" echo "_________________________________________________________" function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; } ############################# ########## MAIN ############### ############################# while true; do start=`date +%s` MOATS=$(date -u +"%Y%m%d%H%M%S%4N") # EACH VISITOR RECEIVE COMMAND RESPONSE ON ## RANDOM PORT = RESPONSE SOCKET & IPNS SESSION TOKEN [ ${PORT} -le 12345 ] && PORT=$((PORT+${RANDOM:0:2})) || PORT=$((PORT-${RANDOM:0:2})) ## RANDOM PORT SWAPPINESS AVOIDING COLLISION ## CHECK PORT IS FREE & KILL OLD ONE pidportinuse=$(ps axf --sort=+utime | grep -w "nc -l -p ${PORT}" | grep -v -E 'color=auto|grep' | awk '{gsub(/^ +| +$/,"")} {print $0}' | tail -n 1 | cut -d " " -f 1) [[ $pidportinuse ]] && kill -9 $pidportinuse && echo "KILLING $pidportinuse" && continue ## CHECK 12345 PORT RUNNING (STATION FoF MAP) maprunning=$(ps auxf --sort=+utime | grep -w '_12345.sh' | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) [[ ! $maprunning ]] \ && echo '(ᵔ◡◡ᵔ) LAUNCHING '${myASTROPORT}:'12345 (ᵔ◡◡ᵔ)' \ && exec $MY_PATH/_12345.sh & ############### ACTIVATE USE ON QUICK IPFS DRIVE ### CREATE IPNS KEY - ACTIVATE WHITH ENOUGH BOOTSTRAP #~ echo #~ ipfs key rm ${PORT} > /dev/null 2>&1 #~ SESSIONNS=$(ipfs key gen ${PORT}) #~ echo "IPNS SESSION ${myIPFS}/ipns/$SESSIONNS CREATED" ### # USE IT # ### MIAM=$(echo ${PORT} | ipfs add -q) ### ipfs name publish --allow-offline -t 180s --key=${PORT} /ipfs/$MIAM & ############### ############### # RESET VARIABLES CMD="" THAT="" AND="" THIS="" APPNAME="" WHAT="" OBJ="" VAL="" ############### ############### ############### ############### templates/index.http # REPLACE myHOST in http response template (fixing next API meeting point) echo "$HTTPCORS" > ~/.zen/tmp/coucou/${MOATS}.myHOST.http myHtml >> ~/.zen/tmp/coucou/${MOATS}.myHOST.http sed -i -e "s~\"http://127.0.0.1:1234/\"~\"$(myIpfs)\"~g" \ -e "s~http://${myHOST}:12345~http://${myIP}:${PORT}~g" \ ~/.zen/tmp/coucou/${MOATS}.myHOST.http ############################################################################ ## SERVE LANDING REDIRECT PAGE ~/.zen/tmp/coucou/${MOATS}.myHOST.http on PORT 1234 (LOOP BLOCKING POINT) ############################################################################ REQ=$(cat $HOME/.zen/tmp/coucou/${MOATS}.myHOST.http | nc -l -p 1234 -q 1) ## # WAIT FOR 1234 PORT CONTACT URL=$(echo "$REQ" | grep '^GET' | cut -d ' ' -f2 | cut -d '?' -f2) HOSTP=$(echo "$REQ" | grep '^Host:' | cut -d ' ' -f2 | cut -d '?' -f2) HOST=$(echo "$HOSTP" | cut -d ':' -f 1) ############### ############### ############### ############### [[ $XDG_SESSION_TYPE == 'x11' ]] && espeak "Ding" >/dev/null 1>&2 & ############################################################################ [[ $URL == "/test" || $URL == "" ]] && continue echo "************************************************************************* $(date)" echo "ASTROPORT 1234 UP & RUNNING.......................... $myASTROPORT" echo "${MOATS} NEXT COMMAND DELIVERY PAGE http://$myHOST:${PORT}" echo "URL" > ~/.zen/tmp/coucou/${MOATS}.url ## LOGGING URL ############################################################################ start=`date +%s` ############################################################################ ## / CONTACT if [[ $URL == "/" ]]; then echo "/ CONTACT : $HOSTP" echo "$HTTPCORS DING : ${MOATS} : $(date)" | nc -l -p ${PORT} -q 1 > /dev/null 2>&1 & end=`date +%s` echo " (‿/‿) $myHOST:$PORT / Execution time was "`expr $end - $start` seconds. continue fi ############################################################################ # URL DECODING ############################################################################ echo "==================================================" echo "GET RECEPTION : $URL" arr=(${URL//[=&]/ }) ##################################################################### ### /?poule ##################################################################### if [[ ${arr[0]} == "poule" ]]; then echo "UPDATING CODE git pull > ~/.zen/tmp/.lastpull" echo "$HTTPCORS" > ~/.zen/tmp/.lastpull git pull >> ~/.zen/tmp/.lastpull rm ~/.zen/game/players/localhost/latest (cat ~/.zen/tmp/.lastpull | nc -l -p ${PORT} -q 1 > /dev/null 2>&1 &) && continue fi ########## CHECK GET PARAM NAMES ################################################################################################### [[ ${arr[0]} == "" || ${arr[1]} == "" ]] && (echo "$HTTPCORS ERROR - MISSING DATA" | nc -l -p ${PORT} -q 1 > /dev/null 2>&1 &) && continue CMD=$(urldecode ${arr[0]} | xargs) THAT=$(urldecode ${arr[1]} | xargs) # SPLIT URL INTO AND=$(urldecode ${arr[2]} | xargs) THIS=$(urldecode ${arr[3]} | xargs) APPNAME=$(urldecode ${arr[4]} | xargs) WHAT=$(urldecode ${arr[5]} | xargs) OBJ=$(urldecode ${arr[6]} | xargs) VAL=$(urldecode ${arr[7]} | xargs) echo "===== COMMAND = $CMD =====" echo "CMD=THAT&AND=THIS&APPNAME=WHAT&OBJ=VAL" echo "$CMD=$THAT&$AND=$THIS&$APPNAME=$WHAT&$OBJ=$VAL" case $CMD in "salt") exec ${MY_PATH}/API/SALT.sh "$PORT" "$THAT" "$AND" "$THIS" "$APPNAME" "$WHAT" "$OBJ" "$VAL" "${MOATS}" & ;; "player") exec ${MY_PATH}/API/PLAYER.sh "$PORT" "$THAT" "$AND" "$THIS" "$APPNAME" "$WHAT" "$OBJ" "$VAL" "${MOATS}" & ;; "qrcode") exec ${MY_PATH}/API/QRCODE.sh "$PORT" "$THAT" "$AND" "$THIS" "$APPNAME" "$WHAT" "$OBJ" "$VAL" "${MOATS}" & ;; "") echo "$HTTPCORS ERROR UNKNOWN $CMD : ${MOATS} : $(date)" | nc -l -p ${PORT} -q 1 > /dev/null 2>&1 & ;; ### ADD API SCRIPT INTO /API *) [[ ! -s ${MY_PATH}/API/${CMD^^}.sh ]] \ && ( echo "$HTTPCORS ERROR UNKNOWN $CMD : ${MOATS} : $(date)" | nc -l -p ${PORT} -q 1 > /dev/null 2>&1 & ) \ || exec ${MY_PATH}/API/${CMD^^}.sh "$PORT" "$THAT" "$AND" "$THIS" "$APPNAME" "$WHAT" "$OBJ" "$VAL" & ;; esac end=`date +%s` echo " ($CMD) $myHOST:$PORT / Launching time was "`expr $end - $start` seconds. done exit 0