r3-cloud/r3.sh

406 lines
11 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
usage() {
echo "Usage : r3 <task> <container>"
}
2021-06-20 20:47:15 +02:00
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=$?
2021-06-20 20:47:15 +02:00
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
2021-06-18 14:29:44 +02:00
if [ "${LAST_ERROR}" = 3 ] ;
then
echo "You do not appear to have a proper lib path - did you clone the project correctly?"
fi
2021-06-28 09:05:53 +02:00
if [ "${LAST_ERROR}" = 4 ] ;
then
echo "File not found : ${FILE}"
2021-06-28 09:05:53 +02:00
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
2021-06-20 20:47:15 +02:00
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/"
2021-06-28 09:05:53 +02:00
R3_SYSTEM_FOLDER="${R3_V2_SRC_PATH}/r3/r3-system/"
2021-07-03 10:40:18 +02:00
R3_COMPONENT_FOLDER="${R3_V2_SRC_PATH}/r3/r3-component/"
2021-06-20 20:47:15 +02:00
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
2021-06-28 09:05:53 +02:00
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
2021-06-28 09:05:53 +02:00
# 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"
2021-06-20 20:47:15 +02:00
TEMPLATE="${ARG2}.template"
EXTEND_CLASS=''
EXTEND_CLASS_FILE_NAME=''
2021-06-28 09:05:53 +02:00
SUBFOLDER='./'
INCLUDE_PATH='.'
2021-06-20 20:47:15 +02:00
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"
2021-07-03 10:40:18 +02:00
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}"
2021-06-28 09:05:53 +02:00
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}"
2021-06-20 20:47:15 +02:00
fi
2021-06-28 09:05:53 +02:00
if [ "${ARG2}" = "system" ]; then
CLASS_NAME="${ARG1}"
FILE_NAME="r3$(echo "${CLASS_NAME}" | sed 's/\([A-Z]\)/-\1/g' | awk '{print tolower($0)}').js"
2021-06-28 09:05:53 +02:00
INCLUDE_PATH="../$INCLUDE_PATH"
R3_FOLDER=$R3_SYSTEM_FOLDER
EXTEND_CLASS="System"
2021-06-28 09:05:53 +02:00
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}"
2021-06-20 20:47:15 +02:00
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}"
2021-06-20 20:47:15 +02:00
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
2021-06-20 20:47:15 +02:00
if [ "${CLASS_NAME}" = "Utils" ]; then
perl -p -i -e 's/^const Utils.*\n$//' "${R3_FOLDER}${FILE_NAME}"
fi
2021-06-28 09:05:53 +02:00
grep 'GENERATE_' < "${TEMPLATE_FOLDER}"token.db | sed "s/^.*GENERATE/GENERATE/" | while IFS= read -r TOKEN
do
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
START_TOKEN="${TOKEN}_START"
END_TOKEN="${TOKEN}_END"
TEMPLATE=$(echo "${TOKEN}.template" | sed "s/^GENERATE_//" | awk '{print tolower($0)}')
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
if grep -q "${START_TOKEN}" "${R3_FOLDER}${FILE_NAME}"; then
2021-06-28 09:05:53 +02:00
if [ -f "${TEMPLATE_FOLDER}${TEMPLATE}" ]; then
2021-06-28 09:05:53 +02:00
echo "Generating template ${TEMPLATE}"
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
SPACE_COUNT=$(grep "${END_TOKEN}" "${R3_FOLDER}${FILE_NAME}" | perl -pe "s/^.*?(\s)/\1/" | perl -lne 'END {print $c} map ++$c, / /g')
SPACES=''
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
for ((i=0; i < SPACE_COUNT; i++)) do
SPACES=" $SPACES"
done
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
# 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
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
done
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
INCLUDE_PATH=$(echo "${INCLUDE_PATH}" | sed -E 's/([+,/,@])/\\\1/g')
2021-06-20 20:47:15 +02:00
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}"
2021-06-28 09:05:53 +02:00
sed -i "s/INCLUDE_PATH/${INCLUDE_PATH}/g" "${R3_FOLDER}${FILE_NAME}"
2021-06-20 20:47:15 +02:00
echo "Created class ${R3_FOLDER}${FILE_NAME}"
2021-07-03 10:40:18 +02:00
# 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
2021-06-20 20:47:15 +02:00
exit 0;
fi
if [ "${TASK}" = 'build-events' ];
then
echo "building events"
2021-06-18 14:29:44 +02:00
cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3
./build_events.php
cd - 2>&1 || exit 3
# set -o xtrace
2021-06-18 14:29:44 +02:00
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
2021-06-28 09:05:53 +02:00
check_file_found() {
FILE="$1"
ORIG_FILE=$FILE
FILE="${R3_FOLDER}${FILE}"
if [ ! -f "${FILE}" ]; then
FILE="${R3_SYSTEM_FOLDER}${ORIG_FILE}"
fi
2021-07-03 10:40:18 +02:00
if [ ! -f "${FILE}" ]; then
FILE="${R3_COMPONENT_FOLDER}${ORIG_FILE}"
fi
2021-06-28 09:05:53 +02:00
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
2021-06-20 20:47:15 +02:00
if [ "${TASK}" = 'update-templates' ];
then
echo "updating templates"
2021-07-03 10:40:18 +02:00
r3 update-token-db
2021-06-20 20:47:15 +02:00
cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3
2021-06-28 09:05:53 +02:00
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/")
2021-06-20 20:47:15 +02:00
IFS=',' read -a commands <<< $COMMANDS
2021-06-28 09:05:53 +02:00
INDEX=-1
2021-06-20 20:47:15 +02:00
for FILE in ${FILES}; do
2021-06-28 09:05:53 +02:00
INDEX=$((INDEX + 1));
ORIG_FILE=$FILE
check_file_found "${ORIG_FILE}"
if [ -n "${ARG1}" ] && [ "${ARG1}" != "${ORIG_FILE}" ];
2021-06-20 20:47:15 +02:00
then
2021-06-28 09:05:53 +02:00
echo "skipping ${ORIG_FILE}"
continue
else
COMMAND="${commands[$INDEX]}";
2021-06-20 20:47:15 +02:00
2021-06-28 09:05:53 +02:00
echo "File = ${FILE}";
echo "Command = ${COMMAND}";
2021-06-20 20:47:15 +02:00
# set -o xtrace
2021-06-28 09:05:53 +02:00
./update_templates.php "${FILE}" save
RESULT=$?
if [ "${RESULT}" = 1 ];
then
exit 5
fi
2021-06-28 09:05:53 +02:00
$COMMAND
RESULT=$?
if [ "${RESULT}" = 1 ];
then
exit 5
fi
2021-06-28 09:05:53 +02:00
./update_templates.php "${FILE}" restore
RESULT=$?
if [ "${RESULT}" = 1 ];
then
exit 5
fi
2021-06-28 09:05:53 +02:00
fi
2021-06-20 20:47:15 +02:00
done
echo "building graph"
./update_templates.php all build-graph
2021-06-20 20:47:15 +02:00
cd - 2>&1 || exit 3
2021-06-28 09:05:53 +02:00
exit 0;
2021-06-20 20:47:15 +02:00
fi
2021-06-28 09:05:53 +02:00
if [ "${TASK}" = 'update-options' ];
2021-06-20 20:47:15 +02:00
then
echo "updating options"
cd "${R3_V2_LIB_PATH}" 2>&1 || exit 3
2021-06-28 09:05:53 +02:00
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
2021-06-20 20:47:15 +02:00
cd - 2>&1 || exit 3
2021-06-28 09:05:53 +02:00
exit 0;
2021-06-20 20:47:15 +02:00
fi
# shellcheck disable=SC2086
docker-compose $TASK $ARG1 $ARG2 $ARG3 $ARG4 $ARG5