#!/usr/bin/env bash usage() { echo "Usage : r3 " } store_history() { if [ "${TASK}" = 'create' ]; then COMMAND=$(echo "r3 ${TASK} ${ARG1} ${ARG2} ${ARG3} ${ARG4} ${ARG5}" | sed "s/\s+/ /g" | sed "s/\s*$//") if grep -q "${COMMAND}" "${R3_V2_LIB_PATH}"/.r3_history; then echo "Already found command in history" else echo "Saving command to history" echo "r3 ${TASK} ${ARG1} ${ARG2} ${ARG3} ${ARG4} ${ARG5}" >> "${R3_V2_LIB_PATH}"/.r3_history fi fi } cleanup() { LAST_ERROR=$? if [ "${LAST_ERROR}" = 0 ] ; then store_history fi if [ "${LAST_ERROR}" = 1 ] ; then usage fi if [ "${LAST_ERROR}" = 2 ] ; then echo "You do not appear to have a proper install path - please navigate to the r3-cloud folder and run './install.sh --full'" fi if [ "${LAST_ERROR}" = 3 ] ; then echo "You do not appear to have a proper lib path - did you clone the project correctly?" fi if [ "${LAST_ERROR}" = 4 ] ; then echo "File not found : ${FILE}" fi if [ "${LAST_ERROR}" = 5 ] ; then echo "Warning! An error occurred during restore and the process is stopped to prevent potential data loss" echo "Scroll up for the reason and take action accordingly" fi cd "${CWD}" 2>&1 || exit } R3_INSTALL_PATH=/usr/share/cybafelo/r3/r3-cloud R3_V2_LIB_PATH=${R3_INSTALL_PATH}/r3-libs/r3-v2 R3_V2_SRC_PATH=${R3_INSTALL_PATH}/r3-libs/r3-v2/src R3_FOLDER="${R3_V2_SRC_PATH}/r3/" R3_SYSTEM_FOLDER="${R3_V2_SRC_PATH}/r3/r3-system/" R3_COMPONENT_FOLDER="${R3_V2_SRC_PATH}/r3/r3-component/" TEMPLATE_FOLDER="${R3_V2_SRC_PATH}/templates/" CWD=$(pwd) TASK=$1 ARG1=$2 ARG2=$3 ARG3=$4 ARG4=$5 ARG5=$6 trap cleanup EXIT cd "${R3_INSTALL_PATH}" 2>&1 || exit 2 if [ "${TASK}" = 'update-token-db' ]; then echo "updating token.db" grep "\bGENERATE_[A-Z_]*\b" "${R3_V2_SRC_PATH}"/* -R | sed "s/^.*GENERATE_/GENERATE_/" | sed "s/\(_START\|_END\)$//" | sort --unique > "${TEMPLATE_FOLDER}"token.db grep "\bCUSTOM_[A-Z_]*\b" "${R3_V2_SRC_PATH}"/* -R | sed "s/^.*CUSTOM_/CUSTOM_/" | sed "s/\(_START\|_END\)$//" | sort --unique >> "${TEMPLATE_FOLDER}"token.db exit 0; fi if [ "${TASK}" = 'create' ]; then # echo "updating token.db" # grep "GENERATE_.*_START" "${TEMPLATE_FOLDER}"*.template "${R3_FOLDER}"*.js "${R3_SYSTEM_FOLDER}"*.js -R | sed "s/^.*GENERATE_/GENERATE_/" | sed "s/_START$//" | sort --unique > "${TEMPLATE_FOLDER}"token.db # grep "CUSTOM_.*_START" "${TEMPLATE_FOLDER}"*.template "${R3_FOLDER}"*.js "${R3_SYSTEM_FOLDER}"*.js -R | sed "s/^.*CUSTOM_/CUSTOM_/" | sed "s/_START$//" | sort --unique >> "${TEMPLATE_FOLDER}"token.db CLASS_NAME=$ARG1 FILE_NAME="r3$(echo "${CLASS_NAME}" | sed 's/\([A-Z]\)/-\1/g' | awk '{print tolower($0)}').js" TEMPLATE="${ARG2}.template" EXTEND_CLASS='' EXTEND_CLASS_FILE_NAME='' SUBFOLDER='./' INCLUDE_PATH='.' if [ "${ARG2}" = "extends" ]; then EXTEND_CLASS="${ARG3}" EXTEND_CLASS_FILE_NAME="r3$(echo "${EXTEND_CLASS}" | sed 's/\([A-Z]\)/-\1/g' | awk '{print tolower($0)}').js" SUBFOLDER="${ARG4}" SLASH_COUNT=$(echo "${SUBFOLDER}" | perl -lne 'END {print $c} map ++$c, /\//g') for ((i=1; i < SLASH_COUNT; i++)) do INCLUDE_PATH="../$INCLUDE_PATH" done R3_FOLDER="${R3_FOLDER}${SUBFOLDER}" echo "Creating class ${CLASS_NAME} based on template ${TEMPLATE} extending ${EXTEND_CLASS} and saving to ${R3_FOLDER}${FILE_NAME}" fi if [ "${ARG2}" = "normal" ] || [ "${ARG2}" = "static" ]; then SUBFOLDER="${ARG3}" SLASH_COUNT=$(echo "${SUBFOLDER}" | perl -lne 'END {print $c} map ++$c, /\//g') for ((i=1; i < SLASH_COUNT; i++)) do INCLUDE_PATH="../$INCLUDE_PATH" done R3_FOLDER="${R3_FOLDER}${SUBFOLDER}" echo "Creating ${ARG2} class ${CLASS_NAME} based on template ${TEMPLATE} and saving to ${R3_FOLDER}${FILE_NAME}" fi if [ "${ARG2}" = "system" ]; then CLASS_NAME="${ARG1}" FILE_NAME="r3$(echo "${CLASS_NAME}" | sed 's/\([A-Z]\)/-\1/g' | awk '{print tolower($0)}').js" INCLUDE_PATH="../$INCLUDE_PATH" R3_FOLDER=$R3_SYSTEM_FOLDER EXTEND_CLASS="System" EXTEND_CLASS_FILE_NAME="r3$(echo "${EXTEND_CLASS}" | sed 's/\([A-Z]\)/-\1/g' | awk '{print tolower($0)}').js" echo "Creating system ${CLASS_NAME} based on template ${TEMPLATE} extending ${EXTEND_CLASS} and saving to ${R3_FOLDER}${FILE_NAME}" fi if [ "${ARG2}" = "system-base" ]; then FILE_NAME="r3$(echo "${CLASS_NAME}" | sed 's/\([A-Z]\)/-\1/g' | awk '{print tolower($0)}').js" INCLUDE_PATH="../$INCLUDE_PATH" R3_FOLDER=$R3_SYSTEM_FOLDER echo "Creating system ${CLASS_NAME} based on template ${TEMPLATE} extending ${EXTEND_CLASS} and saving to ${R3_FOLDER}${FILE_NAME}" fi cp "${TEMPLATE_FOLDER}${TEMPLATE}" "${R3_FOLDER}${FILE_NAME}" if [ "${EXTEND_CLASS}" = "Event" ]; then perl -p -i -e 's/^const Event.*\n$//' "${R3_FOLDER}${FILE_NAME}" fi if [ "${EXTEND_CLASS}" = "Utils" ]; then perl -p -i -e 's/^const Utils.*\n$//' "${R3_FOLDER}${FILE_NAME}" fi if [ "${CLASS_NAME}" = "Event" ]; then perl -p -i -e 's/^const Event.*\n$//' "${R3_FOLDER}${FILE_NAME}" fi if [ "${CLASS_NAME}" = "Utils" ]; then perl -p -i -e 's/^const Utils.*\n$//' "${R3_FOLDER}${FILE_NAME}" fi grep 'GENERATE_' < "${TEMPLATE_FOLDER}"token.db | sed "s/^.*GENERATE/GENERATE/" | while IFS= read -r TOKEN do START_TOKEN="${TOKEN}_START" END_TOKEN="${TOKEN}_END" TEMPLATE=$(echo "${TOKEN}.template" | sed "s/^GENERATE_//" | awk '{print tolower($0)}') if grep -q "${START_TOKEN}" "${R3_FOLDER}${FILE_NAME}"; then if [ -f "${TEMPLATE_FOLDER}${TEMPLATE}" ]; then echo "Generating template ${TEMPLATE}" SPACE_COUNT=$(grep "${END_TOKEN}" "${R3_FOLDER}${FILE_NAME}" | perl -pe "s/^.*?(\s)/\1/" | perl -lne 'END {print $c} map ++$c, / /g') SPACES='' for ((i=0; i < SPACE_COUNT; i++)) do SPACES=" $SPACES" done # shellcheck disable=SC2002 CONTENTS=$(cat "${TEMPLATE_FOLDER}${TEMPLATE}" | sed -E 's/([+,/,@])/\\\1/g') perl -i -pe "BEGIN{undef $/;} s/${START_TOKEN}.*\/\/${END_TOKEN}/${START_TOKEN}\n${CONTENTS}\n${SPACES}\/\/${END_TOKEN}/smg" "${R3_FOLDER}${FILE_NAME}" fi fi done INCLUDE_PATH=$(echo "${INCLUDE_PATH}" | sed -E 's/([+,/,@])/\\\1/g') sed -i "s/CLASS_NAME/${CLASS_NAME}/g" "${R3_FOLDER}${FILE_NAME}" sed -i "s/EXTEND_CLASS_FILE_NAME/${EXTEND_CLASS_FILE_NAME}/g" "${R3_FOLDER}${FILE_NAME}" sed -i "s/EXTEND_CLASS/${EXTEND_CLASS}/g" "${R3_FOLDER}${FILE_NAME}" sed -i "s/INCLUDE_PATH/${INCLUDE_PATH}/g" "${R3_FOLDER}${FILE_NAME}" echo "Created class ${R3_FOLDER}${FILE_NAME}" # cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3 # # ./update_templates.php "${R3_FOLDER}${FILE_NAME}" save # RESULT=$? # if [ "${RESULT}" = 1 ]; # then # exit 5 # fi # # ./update_templates.php "${R3_FOLDER}${FILE_NAME}" restore # RESULT=$? # if [ "${RESULT}" = 1 ]; # then # exit 5 # fi # # ./update_templates.php all build-graph # # cd - 2>&1 || exit 3 exit 0; fi if [ "${TASK}" = 'build-events' ]; then echo "building events" cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3 ./build_events.php cd - 2>&1 || exit 3 # set -o xtrace CONTENTS=$(cat "${R3_FOLDER}events-generated") perl -i -pe "BEGIN{undef $/;} s/\/\/EVENT_GENERATED_START.*\/\/EVENT_GENERATED_END/\/\/EVENT_GENERATED_START\n${CONTENTS}\n\/\/EVENT_GENERATED_END/smg" "${R3_FOLDER}r3-event.js" rm "${R3_FOLDER}events-generated" exit 0 fi check_file_found() { FILE="$1" ORIG_FILE=$FILE FILE="${R3_FOLDER}${FILE}" if [ ! -f "${FILE}" ]; then FILE="${R3_SYSTEM_FOLDER}${ORIG_FILE}" fi if [ ! -f "${FILE}" ]; then FILE="${R3_COMPONENT_FOLDER}${ORIG_FILE}" fi if [ ! -f "${FILE}" ]; then exit 4 fi } if [ "${TASK}" = 'build-graph' ]; then echo "building graph" cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3 # grep "$(grep "^class" src/r3/* -R | grep -v "extends" | grep -v "class R3 " | sed "s/.*class/class/" | sed "s/\s*{//" | perl -pe "s/\n/\\\|/" | sed "s/\\\|$/\\\)/" | sed "s/^/\\\(/")" src/r3/* -Rl | sort | sed "s/src\/r3/\./" | sed "s/\(.*r3-\)\(.*\).js/const \u\2 = require('\1\2.js');/" > base_classes.js # grep -n "^class.*extends" src/r3/* -R | sed "s/src\/r3\(.*\).js.*class\s*\(.*\) extends \(.*\) {/R3.\3.\2 = require('.\1.js');/" | sed "s/R3Object/Object/" ./update_templates.php all build-graph cd - 2>&1 || exit 3 exit 0 fi if [ "${TASK}" = 'update-templates' ]; then echo "updating templates" r3 update-token-db cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3 COMMANDS=$(grep "r3 create" .r3_history | sed "s/^.*r3 /r3 /" | sed "s/\s+/ /g" | sort --unique | perl -pe "s/\n/,/" | perl -pe "s/\s+,/,/g" | perl -pe "s/,$//") FILES=$(grep "r3 create" .r3_history | sed "s/^.*r3 /r3 /" | sed "s/\s+/ /g" | sort --unique | cut -d' ' -f3 | sed 's/\([A-Z]\)/-\1/g' | awk '{print tolower($0)}' | sed "s/^/r3/" | sed "s/$/.js/") IFS=',' read -a commands <<< $COMMANDS INDEX=-1 for FILE in ${FILES}; do INDEX=$((INDEX + 1)); ORIG_FILE=$FILE check_file_found "${ORIG_FILE}" if [ -n "${ARG1}" ] && [ "${ARG1}" != "${ORIG_FILE}" ]; then echo "skipping ${ORIG_FILE}" continue else COMMAND="${commands[$INDEX]}"; echo "File = ${FILE}"; echo "Command = ${COMMAND}"; # set -o xtrace ./update_templates.php "${FILE}" save RESULT=$? if [ "${RESULT}" = 1 ]; then exit 5 fi $COMMAND RESULT=$? if [ "${RESULT}" = 1 ]; then exit 5 fi ./update_templates.php "${FILE}" restore RESULT=$? if [ "${RESULT}" = 1 ]; then exit 5 fi fi done echo "building graph" ./update_templates.php all build-graph cd - 2>&1 || exit 3 exit 0; fi if [ "${TASK}" = 'update-options' ]; then echo "updating options" cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3 if [ -n "${ARG1}" ] ; then check_file_found "${ARG1}" ./update_templates.php "${FILE}" update-options else ./update_templates.php all update-options fi cd - 2>&1 || exit 3 exit 0; fi if [ "${TASK}" = 'update-methods' ]; then echo "updating methods" cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3 if [ -n "${ARG1}" ] ; then check_file_found "${ARG1}" ./update_templates.php "${FILE}" install-methods else ./update_templates.php all install-methods fi cd - 2>&1 || exit 3 exit 0; fi # shellcheck disable=SC2086 docker-compose $TASK $ARG1 $ARG2 $ARG3 $ARG4 $ARG5