From fba4fd53146fc85043e47ed26e96a7dc93bb10d6 Mon Sep 17 00:00:00 2001 From: Richard Hansen Date: Mon, 1 Jun 2020 16:02:44 -0400 Subject: [PATCH] scripts: Various shell script cleanups (#4008) --- bin/buildForWindows.sh | 52 ++++++++++++++++++---------- bin/debugRun.sh | 15 +++----- bin/installDeps.sh | 77 +++++++++++++++++------------------------- bin/run.sh | 40 +++++++++++----------- bin/safeRun.sh | 77 +++++++++++++++++++++--------------------- 5 files changed, 129 insertions(+), 132 deletions(-) diff --git a/bin/buildForWindows.sh b/bin/buildForWindows.sh index e4ca9a883..b991b7ce3 100755 --- a/bin/buildForWindows.sh +++ b/bin/buildForWindows.sh @@ -1,5 +1,23 @@ #!/bin/sh +pecho() { printf %s\\n "$*"; } +log() { pecho "$@"; } +error() { log "ERROR: $@" >&2; } +fatal() { error "$@"; exit 1; } +is_cmd() { command -v "$@" >/dev/null 2>&1; } + +# Move to the folder where ep-lite is installed +cd "$(dirname "$0")"/.. + +# Is wget installed? +is_cmd wget || fatal "Please install wget" + +# Is zip installed? +is_cmd zip || fatal "Please install zip" + +# Is zip installed? +is_cmd unzip || fatal "Please install unzip" +======= #Move to the folder where ep-lite is installed cd $(dirname $0) @@ -29,9 +47,9 @@ hash unzip > /dev/null 2>&1 || { START_FOLDER=$(pwd); TMP_FOLDER=$(mktemp -d) -echo "create a clean environment in $TMP_FOLDER..." -cp -ar . $TMP_FOLDER -cd $TMP_FOLDER +log "create a clean environment in $TMP_FOLDER..." +cp -ar . "$TMP_FOLDER" +cd "$TMP_FOLDER" rm -rf node_modules rm -f etherpad-lite-win.zip @@ -39,33 +57,33 @@ rm -f etherpad-lite-win.zip # making the windows package smaller export NODE_ENV=production -echo "do a normal unix install first..." +log "do a normal unix install first..." bin/installDeps.sh || exit 1 -echo "copy the windows settings template..." +log "copy the windows settings template..." cp settings.json.template settings.json -echo "resolve symbolic links..." +log "resolve symbolic links..." cp -rL node_modules node_modules_resolved rm -rf node_modules mv node_modules_resolved node_modules -echo "download windows node..." +log "download windows node..." cd bin wget "https://nodejs.org/dist/latest-erbium/win-x86/node.exe" -O ../node.exe -echo "remove git history to reduce folder size" +log "remove git history to reduce folder size" rm -rf .git/objects -echo "remove windows jsdom-nocontextify/test folder" -rm -rf $TMP_FOLDER/src/node_modules/wd/node_modules/request/node_modules/form-data/node_modules/combined-stream/test -rm -rf $TMP_FOLDER/src/node_modules/nodemailer/node_modules/mailcomposer/node_modules/mimelib/node_modules/encoding/node_modules/iconv-lite/encodings/tables +log "remove windows jsdom-nocontextify/test folder" +rm -rf "$TMP_FOLDER"/src/node_modules/wd/node_modules/request/node_modules/form-data/node_modules/combined-stream/test +rm -rf "$TMP_FOLDER"/src/node_modules/nodemailer/node_modules/mailcomposer/node_modules/mimelib/node_modules/encoding/node_modules/iconv-lite/encodings/tables -echo "create the zip..." -cd $TMP_FOLDER -zip -9 -r $START_FOLDER/etherpad-lite-win.zip ./* +log "create the zip..." +cd "$TMP_FOLDER" +zip -9 -r "$START_FOLDER"/etherpad-lite-win.zip ./* -echo "clean up..." -rm -rf $TMP_FOLDER +log "clean up..." +rm -rf "$TMP_FOLDER" -echo "Finished. You can find the zip in the Etherpad root folder, it's called etherpad-lite-win.zip" +log "Finished. You can find the zip in the Etherpad root folder, it's called etherpad-lite-win.zip" \ No newline at end of file diff --git a/bin/debugRun.sh b/bin/debugRun.sh index 246d53900..d9b18aaa2 100755 --- a/bin/debugRun.sh +++ b/bin/debugRun.sh @@ -1,20 +1,15 @@ #!/bin/sh -#Move to the folder where ep-lite is installed -cd $(dirname $0) +# Move to the folder where ep-lite is installed +cd "$(dirname "$0")"/.. -#Was this script started in the bin folder? if yes move out -if [ -d "../bin" ]; then - cd "../" -fi - -#Prepare the environment +# Prepare the environment bin/installDeps.sh || exit 1 echo "If you are new to debugging Node.js with Chrome DevTools, take a look at this page:" echo "https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27" echo "Open 'chrome://inspect' on Chrome to start debugging." -#Use 0.0.0.0 to allow external connections to the debugger -#(ex: running Etherpad on a docker container). Use default port # (9229) +# Use 0.0.0.0 to allow external connections to the debugger +# (ex: running Etherpad on a docker container). Use default port # (9229) node --inspect=0.0.0.0:9229 node_modules/ep_etherpad-lite/node/server.js "$@" diff --git a/bin/installDeps.sh b/bin/installDeps.sh index cac279e11..5e0bbb931 100755 --- a/bin/installDeps.sh +++ b/bin/installDeps.sh @@ -8,6 +8,12 @@ REQUIRED_NODE_MINOR=13 REQUIRED_NPM_MAJOR=5 REQUIRED_NPM_MINOR=5 +pecho() { printf %s\\n "$*"; } +log() { pecho "$@"; } +error() { log "ERROR: $@" >&2; } +fatal() { error "$@"; exit 1; } +is_cmd() { command -v "$@" >/dev/null 2>&1; } + require_minimal_version() { PROGRAM_LABEL="$1" VERSION_STRING="$2" @@ -16,71 +22,50 @@ require_minimal_version() { # Flag -s (--only-delimited on GNU cut) ensures no string is returned # when there is no match - DETECTED_MAJOR=$(echo $VERSION_STRING | cut -s -d "." -f 1) - DETECTED_MINOR=$(echo $VERSION_STRING | cut -s -d "." -f 2) + DETECTED_MAJOR=$(pecho "$VERSION_STRING" | cut -s -d "." -f 1) + DETECTED_MINOR=$(pecho "$VERSION_STRING" | cut -s -d "." -f 2) - if [ -z "$DETECTED_MAJOR" ]; then - printf 'Cannot extract %s major version from version string "%s"\n' "$PROGRAM_LABEL" "$VERSION_STRING" >&2 - exit 1 - fi + [ -n "$DETECTED_MAJOR" ] || fatal "Cannot extract $PROGRAM_LABEL major version from version string \"$VERSION_STRING\"" - if [ -z "$DETECTED_MINOR" ]; then - printf 'Cannot extract %s minor version from version string "%s"\n' "$PROGRAM_LABEL" "$VERSION_STRING" >&2 - exit 1 - fi + [ -n "$DETECTED_MINOR" ] || fatal "Cannot extract $PROGRAM_LABEL minor version from version string \"$VERSION_STRING\"" case "$DETECTED_MAJOR" in ''|*[!0-9]*) - printf '%s major version from "%s" is not a number. Detected: "%s"\n' "$PROGRAM_LABEL" "$VERSION_STRING" "$DETECTED_MAJOR" >&2 - exit 1 + fatal "$PROGRAM_LABEL major version from \"$VERSION_STRING\" is not a number. Detected: \"$DETECTED_MAJOR\"" ;; esac case "$DETECTED_MINOR" in ''|*[!0-9]*) - printf '%s minor version from "%s" is not a number. Detected: "%s"\n' "$PROGRAM_LABEL" "$VERSION_STRING" "$DETECTED_MINOR" >&2 - exit 1 + fatal "$PROGRAM_LABEL minor version from \"$VERSION_STRING\" is not a number. Detected: \"$DETECTED_MINOR\"" esac - if [ "$DETECTED_MAJOR" -lt "$REQUIRED_MAJOR" ] || ([ "$DETECTED_MAJOR" -eq "$REQUIRED_MAJOR" ] && [ "$DETECTED_MINOR" -lt "$REQUIRED_MINOR" ]); then - printf 'Your %s version "%s" is too old. %s %d.%d.x or higher is required.\n' "$PROGRAM_LABEL" "$VERSION_STRING" "$PROGRAM_LABEL" "$REQUIRED_MAJOR" "$REQUIRED_MINOR" >&2 - exit 1 - fi + [ "$DETECTED_MAJOR" -gt "$REQUIRED_MAJOR" ] || ([ "$DETECTED_MAJOR" -eq "$REQUIRED_MAJOR" ] && [ "$DETECTED_MINOR" -ge "$REQUIRED_MINOR" ]) \ + || fatal "Your $PROGRAM_LABEL version \"$VERSION_STRING\" is too old. $PROGRAM_LABEL $REQUIRED_MAJOR.$REQUIRED_MINOR.x or higher is required." } -#Move to the folder where ep-lite is installed -cd $(dirname $0) +# Move to the folder where ep-lite is installed +cd "$(dirname "$0")"/.. -#Was this script started in the bin folder? if yes move out -if [ -d "../bin" ]; then - cd "../" -fi +# Is node installed? +# Not checking io.js, default installation creates a symbolic link to node +is_cmd node || fatal "Please install node.js ( https://nodejs.org )" -#Is node installed? -#Not checking io.js, default installation creates a symbolic link to node -hash node > /dev/null 2>&1 || { - echo "Please install node.js ( https://nodejs.org )" >&2 - exit 1 -} +# Is npm installed? +is_cmd npm || fatal "Please install npm ( https://npmjs.org )" -#Is npm installed? -hash npm > /dev/null 2>&1 || { - echo "Please install npm ( https://npmjs.org )" >&2 - exit 1 -} - -#Check npm version +# Check npm version NPM_VERSION_STRING=$(npm --version) require_minimal_version "npm" "$NPM_VERSION_STRING" "$REQUIRED_NPM_MAJOR" "$REQUIRED_NPM_MINOR" -#Check node version +# Check node version NODE_VERSION_STRING=$(node --version) NODE_VERSION_STRING=${NODE_VERSION_STRING#"v"} require_minimal_version "nodejs" "$NODE_VERSION_STRING" "$REQUIRED_NODE_MAJOR" "$REQUIRED_NODE_MINOR" -#Get the name of the settings file +# Get the name of the settings file settings="settings.json" a=''; for arg in "$@"; do @@ -88,13 +73,13 @@ for arg in "$@"; do a=$arg done -#Does a $settings exist? if not copy the template -if [ ! -f $settings ]; then - echo "Copy the settings template to $settings..." - cp settings.json.template $settings || exit 1 +# Does a $settings exist? if not copy the template +if [ ! -f "$settings" ]; then + log "Copy the settings template to $settings..." + cp settings.json.template "$settings" || exit 1 fi -echo "Ensure that all dependencies are up to date... If this is the first time you have run Etherpad please be patient." +log "Ensure that all dependencies are up to date... If this is the first time you have run Etherpad please be patient." ( mkdir -p node_modules cd node_modules @@ -106,8 +91,8 @@ echo "Ensure that all dependencies are up to date... If this is the first time exit 1 } -#Remove all minified data to force node creating it new -echo "Clearing minified cache..." +# Remove all minified data to force node creating it new +log "Clearing minified cache..." rm -f var/minified* exit 0 diff --git a/bin/run.sh b/bin/run.sh index 74fa56d68..ff6b3de09 100755 --- a/bin/run.sh +++ b/bin/run.sh @@ -1,39 +1,37 @@ #!/bin/sh -#Move to the folder where ep-lite is installed -cd $(dirname $0) +pecho() { printf %s\\n "$*"; } +log() { pecho "$@"; } +error() { log "ERROR: $@" >&2; } +fatal() { error "$@"; exit 1; } -#Was this script started in the bin folder? if yes move out -if [ -d "../bin" ]; then - cd "../" -fi +# Move to the folder where ep-lite is installed +cd "$(dirname "$0")"/.. ignoreRoot=0 -for ARG in "$@" -do +for ARG in "$@"; do if [ "$ARG" = "--root" ]; then ignoreRoot=1 fi done -#Stop the script if it's started as root -if [ "$(id -u)" -eq 0 ] && [ $ignoreRoot -eq 0 ]; then - echo "You shouldn't start Etherpad as root!" - echo "Please type 'Etherpad rocks my socks' or supply the '--root' argument if you still want to start it as root" +# Stop the script if it's started as root +if [ "$(id -u)" -eq 0 ] && [ "$ignoreRoot" -eq 0 ]; then + cat <&2 +You shouldn't start Etherpad as root! +Please type 'Etherpad rocks my socks' (or restart with the '--root' +argument) if you still want to start it as root: +EOF + printf "> " >&2 read rocks - if [ ! "$rocks" == "Etherpad rocks my socks" ] - then - echo "Your input was incorrect" - exit 1 - fi + [ "$rocks" = "Etherpad rocks my socks" ] || fatal "Your input was incorrect" fi -#Prepare the environment +# Prepare the environment bin/installDeps.sh "$@" || exit 1 -#Move to the node folder and start -echo "Started Etherpad..." +# Move to the node folder and start +log "Starting Etherpad..." SCRIPTPATH=$(pwd -P) exec node "$SCRIPTPATH/node_modules/ep_etherpad-lite/node/server.js" "$@" - diff --git a/bin/safeRun.sh b/bin/safeRun.sh index 99a72bcc0..6d43e3035 100755 --- a/bin/safeRun.sh +++ b/bin/safeRun.sh @@ -1,10 +1,11 @@ #!/bin/sh -#This script ensures that ep-lite is automatically restarting after an error happens +# This script ensures that ep-lite is automatically restarting after +# an error happens -#Handling Errors -# 0 silent -# 1 email +# Handling Errors +# 0 silent +# 1 email ERROR_HANDLING=0 # Your email address which should receive the error messages EMAIL_ADDRESS="no-reply@example.com" @@ -15,54 +16,54 @@ TIME_BETWEEN_EMAILS=600 # 10 minutes # DON'T EDIT AFTER THIS LINE +pecho() { printf %s\\n "$*"; } +log() { pecho "$@"; } +error() { log "ERROR: $@" >&2; } +fatal() { error "$@"; exit 1; } + LAST_EMAIL_SEND=0 + +# Move to the folder where ep-lite is installed +cd "$(dirname "$0")"/.. + +# Check if a logfile parameter is set LOG="$1" - -#Move to the folder where ep-lite is installed -cd $(dirname $0) - -#Was this script started in the bin folder? if yes move out -if [ -d "../bin" ]; then - cd "../" -fi - -#Check if a logfile parameter is set -if [ -z "${LOG}" ]; then - echo "Set a logfile as the first parameter" - exit 1 -fi - +[ -n "${LOG}" ] || fatal "Set a logfile as the first parameter" shift -while [ 1 ] -do - #Try to touch the file if it doesn't exist - if [ ! -f ${LOG} ]; then - touch ${LOG} || ( echo "Logfile '${LOG}' is not writeable" && exit 1 ) - fi - #Check if the file is writeable - if [ ! -w ${LOG} ]; then - echo "Logfile '${LOG}' is not writeable" - exit 1 - fi +while true; do + # Try to touch the file if it doesn't exist + [ -f "${LOG}" ] || touch "${LOG}" || fatal "Logfile '${LOG}' is not writeable" - #Start the application - bin/run.sh $@ >>${LOG} 2>>${LOG} + # Check if the file is writeable + [ -w "${LOG}" ] || fatal "Logfile '${LOG}' is not writeable" - #Send email - if [ $ERROR_HANDLING = 1 ]; then + # Start the application + bin/run.sh "$@" >>${LOG} 2>>${LOG} + + TIME_FMT=$(date +%Y-%m-%dT%H:%M:%S%z) + + # Send email + if [ "$ERROR_HANDLING" = 1 ]; then TIME_NOW=$(date +%s) TIME_SINCE_LAST_SEND=$(($TIME_NOW - $LAST_EMAIL_SEND)) - if [ $TIME_SINCE_LAST_SEND -gt $TIME_BETWEEN_EMAILS ]; then - printf "Server was restarted at: $(date)\nThe last 50 lines of the log before the error happens:\n $(tail -n 50 ${LOG})" | mail -s "Pad Server was restarted" $EMAIL_ADDRESS + if [ "$TIME_SINCE_LAST_SEND" -gt "$TIME_BETWEEN_EMAILS" ]; then + { + cat <>${LOG} + pecho "RESTART! ${TIME_FMT}" >>${LOG} - #Sleep 10 seconds before restart + # Sleep 10 seconds before restart sleep 10 done