From 653dcb409126e4743f2cc49baa489f41cebc74db Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Fri, 15 Jul 2022 21:40:15 -0700 Subject: [PATCH 01/17] chore: update alpine image. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0685c21..a5dfb47 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.12 as rq-build +FROM alpine:3.16 as rq-build ENV RQ_VERSION=1.0.2 WORKDIR /root/ From 9701554b3ca7d5c5d7bcf429dd375dc98245a5a2 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:13:11 -0700 Subject: [PATCH 02/17] fix: SC2086 shellcheck fixes. --- docker-entrypoint | 96 +++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 2696ee5..ef27cf9 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -17,13 +17,13 @@ fi get_config() { if [ -f "${HOME_DIR}/config.json" ]; then - jq 'map(.)' ${HOME_DIR}/config.json > ${HOME_DIR}/config.working.json + jq 'map(.)' "${HOME_DIR}"/config.json > "${HOME_DIR}"/config.working.json elif [ -f "${HOME_DIR}/config.toml" ]; then - rq -t <<< $(cat ${HOME_DIR}/config.toml) | jq 'map(.)' > ${HOME_DIR}/config.json + rq -t <<< $(cat "${HOME_DIR}"/config.toml) | jq 'map(.)' > "${HOME_DIR}"/config.json elif [ -f "${HOME_DIR}/config.yml" ]; then - rq -y <<< $(cat ${HOME_DIR}/config.yml) | jq 'map(.)' > ${HOME_DIR}/config.json + rq -y <<< $(cat "${HOME_DIR}"/config.yml) | jq 'map(.)' > "${HOME_DIR}"/config.json elif [ -f "${HOME_DIR}/config.yaml" ]; then - rq -y <<< $(cat ${HOME_DIR}/config.yaml) | jq 'map(.)' > ${HOME_DIR}/config.json + rq -y <<< $(cat "${HOME_DIR}"/config.yaml) | jq 'map(.)' > "${HOME_DIR}"/config.json fi } @@ -31,7 +31,7 @@ DOCKER_SOCK=/var/run/docker.sock CRONTAB_FILE=/etc/crontabs/docker # Ensure dir exist - in case of volume mapping -mkdir -p ${HOME_DIR}/jobs ${HOME_DIR}/projects +mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects ensure_docker_socket_accessible() { if ! grep -q "^docker:" /etc/group; then @@ -40,12 +40,12 @@ ensure_docker_socket_accessible() { if [ "${DOCKER_GID}" != "0" ]; then if ! grep -qE "^[^:]+:[^:]+:${DOCKER_GID}:" /etc/group; then # No group with such gid exists - create group docker - addgroup -g ${DOCKER_GID} docker + addgroup -g "${DOCKER_GID}" docker adduser docker docker else # Group with such gid exists - add user "docker" to this group DOCKER_GROUP_NAME=`getent group "${DOCKER_GID}" | awk -F':' '{{ print $1 }}'` - adduser docker $DOCKER_GROUP_NAME + adduser docker "$DOCKER_GROUP_NAME" fi else # Docker socket belongs to "root" group - add user "docker" to this group @@ -59,14 +59,14 @@ slugify() { } make_image_cmd() { - DOCKERARGS=$(echo ${1} | jq -r .dockerargs) - VOLUMES=$(echo ${1} | jq -r '.volumes | map(" -v " + .) | join("")') - PORTS=$(echo ${1} | jq -r '.ports | map(" -p " + .) | join("")') - EXPOSE=$(echo ${1} | jq -r '.expose | map(" --expose " + .) | join("")') + DOCKERARGS=$(echo "${1}" | jq -r .dockerargs) + VOLUMES=$(echo "${1}" | jq -r '.volumes | map(" -v " + .) | join("")') + PORTS=$(echo "${1}" | jq -r '.ports | map(" -p " + .) | join("")') + EXPOSE=$(echo "${1}" | jq -r '.expose | map(" --expose " + .) | join("")') # We'll add name in, if it exists - NAME=$(echo ${1} | jq -r 'select(.name != null) | .name') - NETWORK=$(echo ${1} | jq -r 'select(.network != null) | .network') - ENVIRONMENT=$(echo ${1} | jq -r '.environment | map(" -e " + .) | join("")') + NAME=$(echo "${1}" | jq -r 'select(.name != null) | .name') + NETWORK=$(echo "${1}" | jq -r 'select(.network != null) | .network') + ENVIRONMENT=$(echo "${1}" | jq -r '.environment | map(" -e " + .) | join("")') # echo ${1} | jq -r '.environment | join("\n")' > ${PWD}/${NAME}.env # ENVIRONMENT=" --env-file ${PWD}/${NAME}.env" if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi @@ -76,19 +76,19 @@ make_image_cmd() { if [ ! -z "${ENVIRONMENT}" ]; then DOCKERARGS="${DOCKERARGS}${ENVIRONMENT}"; fi if [ ! -z "${PORTS}" ]; then DOCKERARGS="${DOCKERARGS}${PORTS}"; fi if [ ! -z "${EXPOSE}" ]; then DOCKERARGS="${DOCKERARGS}${EXPOSE}"; fi - IMAGE=$(echo ${1} | jq -r .image | envsubst) - TMP_COMMAND=$(echo ${1} | jq -r .command) + IMAGE=$(echo "${1}" | jq -r .image | envsubst) + TMP_COMMAND=$(echo "${1}" | jq -r .command) echo "docker run ${DOCKERARGS} ${IMAGE} ${TMP_COMMAND}" } make_container_cmd() { - DOCKERARGS=$(echo ${1} | jq -r .dockerargs) + DOCKERARGS=$(echo "${1}" | jq -r .dockerargs) if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi - SCRIPT_NAME=$(echo ${1} | jq -r .name) - SCRIPT_NAME=$(slugify $SCRIPT_NAME) - PROJECT=$(echo ${1} | jq -r .project) - CONTAINER=$(echo ${1} | jq -r .container | envsubst) - TMP_COMMAND=$(echo ${1} | jq -r .command) + SCRIPT_NAME=$(echo "${1}" | jq -r .name) + SCRIPT_NAME=$(slugify "$SCRIPT_NAME") + PROJECT=$(echo "${1}" | jq -r .project) + CONTAINER=$(echo "${1}" | jq -r .container | envsubst) + TMP_COMMAND=$(echo "${1}" | jq -r .command) if [ "${PROJECT}" != "null" ]; then @@ -96,7 +96,7 @@ make_container_cmd() { if [ "${SCRIPT_NAME}" == "null" ]; then SCRIPT_NAME=$(cat /proc/sys/kernel/random/uuid) fi -cat << EOF > ${HOME_DIR}/projects/${SCRIPT_NAME}.sh +cat << EOF > "${HOME_DIR}"/projects/"${SCRIPT_NAME}".sh #!/usr/bin/env bash set -e @@ -119,14 +119,14 @@ EOF #} make_cmd() { - if [ "$(echo ${1} | jq -r .image)" != "null" ]; then + if [ "$(echo "${1}" | jq -r .image)" != "null" ]; then make_image_cmd "$1" - elif [ "$(echo ${1} | jq -r .container)" != "null" ]; then + elif [ "$(echo "${1}" | jq -r .container)" != "null" ]; then make_container_cmd "$1" #elif [ "$(echo ${1} | jq -r .host)" != "null" ]; then # make_host_cmd "$1" else - echo ${1} | jq -r .command + echo "${1}" | jq -r .command fi } @@ -157,9 +157,9 @@ parse_schedule() { TIME=$2 TOTAL=0 - M=$(echo $TIME | grep -o '[0-9]\+m') - H=$(echo $TIME | grep -o '[0-9]\+h') - D=$(echo $TIME | grep -o '[0-9]\+d') + M=$(echo "$TIME" | grep -o '[0-9]\+m') + H=$(echo "$TIME" | grep -o '[0-9]\+h') + D=$(echo "$TIME" | grep -o '[0-9]\+d') if [ -n "${M}" ]; then TOTAL=$(($TOTAL + ${M::-1})) @@ -186,31 +186,31 @@ function build_crontab() { ONSTART=() while read i ; do - SCHEDULE=$(jq -r .[$i].schedule ${CONFIG} | sed 's/\*/\\*/g') + SCHEDULE=$(jq -r .["$i"].schedule "${CONFIG}" | sed 's/\*/\\*/g') if [ "${SCHEDULE}" == "null" ]; then - echo "Schedule Missing: $(jq -r .[$i].schedule ${CONFIG})" + echo "Schedule Missing: $(jq -r .["$i"].schedule "${CONFIG}")" continue fi - SCHEDULE=$(parse_schedule ${SCHEDULE} | sed 's/\\//g') + SCHEDULE=$(parse_schedule "${SCHEDULE}" | sed 's/\\//g') - if [ "$(jq -r .[$i].command ${CONFIG})" == "null" ]; then - echo "Command Missing: $(jq -r .[$i].command ${CONFIG})" + if [ "$(jq -r .["$i"].command "${CONFIG}")" == "null" ]; then + echo "Command Missing: $(jq -r .["$i"].command "${CONFIG}")" continue fi - COMMENT=$(jq -r .[$i].comment ${CONFIG}) + COMMENT=$(jq -r .["$i"].comment "${CONFIG}") if [ "${COMMENT}" != "null" ]; then echo "# ${COMMENT}" >> ${CRONTAB_FILE} fi - SCRIPT_NAME=$(jq -r .[$i].name ${CONFIG}) - SCRIPT_NAME=$(slugify $SCRIPT_NAME) + SCRIPT_NAME=$(jq -r .["$i"].name "${CONFIG}") + SCRIPT_NAME=$(slugify "$SCRIPT_NAME") if [ "${SCRIPT_NAME}" == "null" ]; then SCRIPT_NAME=$(cat /proc/sys/kernel/random/uuid) fi COMMAND="/bin/bash ${HOME_DIR}/jobs/${SCRIPT_NAME}.sh" -cat << EOF > ${HOME_DIR}/jobs/${SCRIPT_NAME}.sh +cat << EOF > "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh #!/usr/bin/env bash set -e @@ -222,31 +222,31 @@ set -e echo "Start Cronjob **${SCRIPT_NAME}** ${COMMENT}" -$(make_cmd "$(jq -c .[$i] ${CONFIG})") +$(make_cmd "$(jq -c .["$i"] "${CONFIG}")") EOF - if [ "$(jq -r .[$i].trigger ${CONFIG})" != "null" ]; then + if [ "$(jq -r .["$i"].trigger "${CONFIG}")" != "null" ]; then while read j ; do - if [ "$(jq .[$i].trigger[$j].command ${CONFIG})" == "null" ]; then - echo "Command Missing: $(jq -r .[$i].trigger[$j].command ${CONFIG})" + if [ "$(jq .["$i"].trigger["$j"].command "${CONFIG}")" == "null" ]; then + echo "Command Missing: $(jq -r .["$i"].trigger["$j"].command "${CONFIG}")" continue fi #TRIGGER_COMMAND=$(make_cmd "$(jq -c .[$i].trigger[$j] ${CONFIG})") - echo "$(make_cmd "$(jq -c .[$i].trigger[$j] ${CONFIG})")" >> ${HOME_DIR}/jobs/${SCRIPT_NAME}.sh + echo "$(make_cmd "$(jq -c .["$i"].trigger["$j"] "${CONFIG}")")" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh #COMMAND="${COMMAND} && ${TRIGGER_COMMAND}" - done < <(jq -r '.['$i'].trigger|keys[]' ${CONFIG}) + done < <(jq -r '.['"$i"'].trigger|keys[]' "${CONFIG}") fi - echo "echo \"End Cronjob **${SCRIPT_NAME}** ${COMMENT}\"" >> ${HOME_DIR}/jobs/${SCRIPT_NAME}.sh + echo "echo \"End Cronjob **${SCRIPT_NAME}** ${COMMENT}\"" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh echo "${SCHEDULE} ${COMMAND}" >> ${CRONTAB_FILE} - if [ "$(jq -r .[$i].onstart ${CONFIG})" == "true" ]; then + if [ "$(jq -r .["$i"].onstart "${CONFIG}")" == "true" ]; then ONSTART+=("${COMMAND}") fi - done < <(jq -r '.|keys[]' ${CONFIG}) + done < <(jq -r '.|keys[]' "${CONFIG}") echo "##### crontab generation complete #####" cat ${CRONTAB_FILE} @@ -271,7 +271,7 @@ start_app() { echo "NO CONFIG FILE FOUND" fi if [ "$1" = "crond" ]; then - if [ -f ${CONFIG} ]; then + if [ -f "${CONFIG}" ]; then build_crontab else echo "Unable to find ${CONFIG}" From 82875aba6e09ab8a0d777e7aa2aec0910beccef4 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:14:30 -0700 Subject: [PATCH 03/17] fix: SC2004 shellcheck fixes. --- docker-entrypoint | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index ef27cf9..e3caa03 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -162,13 +162,13 @@ parse_schedule() { D=$(echo "$TIME" | grep -o '[0-9]\+d') if [ -n "${M}" ]; then - TOTAL=$(($TOTAL + ${M::-1})) + TOTAL=$((TOTAL + ${M::-1})) fi if [ -n "${H}" ]; then - TOTAL=$(($TOTAL + ${H::-1} * 60)) + TOTAL=$((TOTAL + ${H::-1} * 60)) fi if [ -n "${D}" ]; then - TOTAL=$(($TOTAL + ${D::-1} * 60 * 24)) + TOTAL=$((TOTAL + ${D::-1} * 60 * 24)) fi echo "*/${TOTAL} * * * *" From 8c8e19c1c982330c7ef9b687629ff294c87a6ac9 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:15:18 -0700 Subject: [PATCH 04/17] fix: SC2006 shellcheck fixes. --- docker-entrypoint | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-entrypoint b/docker-entrypoint index e3caa03..987e178 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -44,7 +44,7 @@ ensure_docker_socket_accessible() { adduser docker docker else # Group with such gid exists - add user "docker" to this group - DOCKER_GROUP_NAME=`getent group "${DOCKER_GID}" | awk -F':' '{{ print $1 }}'` + DOCKER_GROUP_NAME=$(getent group "${DOCKER_GID}" | awk -F':' '{{ print $1 }}') adduser docker "$DOCKER_GROUP_NAME" fi else From 4d945526fe74057a8cf4f8173be8b42917c55a4d Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:16:22 -0700 Subject: [PATCH 05/17] fix: SC2236 shellcheck fixes. --- docker-entrypoint | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 987e178..3d3eaba 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -70,12 +70,12 @@ make_image_cmd() { # echo ${1} | jq -r '.environment | join("\n")' > ${PWD}/${NAME}.env # ENVIRONMENT=" --env-file ${PWD}/${NAME}.env" if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi - if [ ! -z "${NAME}" ]; then DOCKERARGS="${DOCKERARGS} --rm --name ${NAME} "; fi - if [ ! -z "${NETWORK}" ]; then DOCKERARGS="${DOCKERARGS} --network ${NETWORK} "; fi - if [ ! -z "${VOLUMES}" ]; then DOCKERARGS="${DOCKERARGS}${VOLUMES}"; fi - if [ ! -z "${ENVIRONMENT}" ]; then DOCKERARGS="${DOCKERARGS}${ENVIRONMENT}"; fi - if [ ! -z "${PORTS}" ]; then DOCKERARGS="${DOCKERARGS}${PORTS}"; fi - if [ ! -z "${EXPOSE}" ]; then DOCKERARGS="${DOCKERARGS}${EXPOSE}"; fi + if [ -n "${NAME}" ]; then DOCKERARGS="${DOCKERARGS} --rm --name ${NAME} "; fi + if [ -n "${NETWORK}" ]; then DOCKERARGS="${DOCKERARGS} --network ${NETWORK} "; fi + if [ -n "${VOLUMES}" ]; then DOCKERARGS="${DOCKERARGS}${VOLUMES}"; fi + if [ -n "${ENVIRONMENT}" ]; then DOCKERARGS="${DOCKERARGS}${ENVIRONMENT}"; fi + if [ -n "${PORTS}" ]; then DOCKERARGS="${DOCKERARGS}${PORTS}"; fi + if [ -n "${EXPOSE}" ]; then DOCKERARGS="${DOCKERARGS}${EXPOSE}"; fi IMAGE=$(echo "${1}" | jq -r .image | envsubst) TMP_COMMAND=$(echo "${1}" | jq -r .command) echo "docker run ${DOCKERARGS} ${IMAGE} ${TMP_COMMAND}" From 96e699c4d76f8f701ad39235cb15e19021e2c8c1 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:17:17 -0700 Subject: [PATCH 06/17] fix: SC2162 shellcheck fixes. --- docker-entrypoint | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 3d3eaba..08c14a3 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -184,7 +184,7 @@ function build_crontab() { rm -rf ${CRONTAB_FILE} ONSTART=() - while read i ; do + while read -r i ; do SCHEDULE=$(jq -r .["$i"].schedule "${CONFIG}" | sed 's/\*/\\*/g') if [ "${SCHEDULE}" == "null" ]; then @@ -228,7 +228,7 @@ EOF if [ "$(jq -r .["$i"].trigger "${CONFIG}")" != "null" ]; then - while read j ; do + while read -r j ; do if [ "$(jq .["$i"].trigger["$j"].command "${CONFIG}")" == "null" ]; then echo "Command Missing: $(jq -r .["$i"].trigger["$j"].command "${CONFIG}")" continue From dcd3e429f670698087916b8a06528e1e9445a8a0 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:17:58 -0700 Subject: [PATCH 07/17] fix: SC2166 shellcheck fixes. --- docker-entrypoint | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-entrypoint b/docker-entrypoint index 08c14a3..14b3ef9 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -e -if [ -z "$DOCKER_HOST" -a "$DOCKER_PORT_2375_TCP" ]; then +if [ -z "$DOCKER_HOST" ] && [ -a "$DOCKER_PORT_2375_TCP" ]; then export DOCKER_HOST='tcp://docker:2375' fi From 6d92c31545fba5fcaf46c8197038be3cd197af9d Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:21:06 -0700 Subject: [PATCH 08/17] fix: SC2005 and SC2046 shellcheck fixes. --- docker-entrypoint | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 14b3ef9..cc7ec49 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -19,11 +19,11 @@ get_config() { if [ -f "${HOME_DIR}/config.json" ]; then jq 'map(.)' "${HOME_DIR}"/config.json > "${HOME_DIR}"/config.working.json elif [ -f "${HOME_DIR}/config.toml" ]; then - rq -t <<< $(cat "${HOME_DIR}"/config.toml) | jq 'map(.)' > "${HOME_DIR}"/config.json + rq -t <<< "$(cat "${HOME_DIR}"/config.toml)" | jq 'map(.)' > "${HOME_DIR}"/config.json elif [ -f "${HOME_DIR}/config.yml" ]; then - rq -y <<< $(cat "${HOME_DIR}"/config.yml) | jq 'map(.)' > "${HOME_DIR}"/config.json + rq -y <<< "$(cat "${HOME_DIR}"/config.yml)" | jq 'map(.)' > "${HOME_DIR}"/config.json elif [ -f "${HOME_DIR}/config.yaml" ]; then - rq -y <<< $(cat "${HOME_DIR}"/config.yaml) | jq 'map(.)' > "${HOME_DIR}"/config.json + rq -y <<< "$(cat "${HOME_DIR}"/config.yaml)" | jq 'map(.)' > "${HOME_DIR}"/config.json fi } @@ -234,7 +234,7 @@ EOF continue fi #TRIGGER_COMMAND=$(make_cmd "$(jq -c .[$i].trigger[$j] ${CONFIG})") - echo "$(make_cmd "$(jq -c .["$i"].trigger["$j"] "${CONFIG}")")" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh + make_cmd "$(jq -c .["$i"].trigger["$j"] "${CONFIG}")" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh #COMMAND="${COMMAND} && ${TRIGGER_COMMAND}" done < <(jq -r '.['"$i"'].trigger|keys[]' "${CONFIG}") fi From 882fb137f29beac6a248efd2f8aa2a20c7f1f79b Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:25:09 -0700 Subject: [PATCH 09/17] fix: SC1001, SC2018, SC2019 shellcheck fixes. --- docker-entrypoint | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-entrypoint b/docker-entrypoint index cc7ec49..8404445 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -55,7 +55,7 @@ ensure_docker_socket_accessible() { } slugify() { - echo "$@" | iconv -t ascii | sed -r s/[~\^]+//g | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z + echo "$@" | iconv -t ascii | sed -r s/[~^]+//g | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr '[:upper:]' '[:lower:]' } make_image_cmd() { From f18275eb0d3bc9b7d3a7a4a27d67842471d22afb Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:28:20 -0700 Subject: [PATCH 10/17] fix: simplifying logic. --- docker-entrypoint | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 8404445..1ddd1fd 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -16,15 +16,17 @@ if [ "${LOG_FILE}" == "" ]; then fi get_config() { + JSON_CONFIG={} if [ -f "${HOME_DIR}/config.json" ]; then - jq 'map(.)' "${HOME_DIR}"/config.json > "${HOME_DIR}"/config.working.json + JSON_CONFIG="$(cat "${HOME_DIR}"/config.json)" elif [ -f "${HOME_DIR}/config.toml" ]; then - rq -t <<< "$(cat "${HOME_DIR}"/config.toml)" | jq 'map(.)' > "${HOME_DIR}"/config.json + JSON_CONFIG="$(rq -t <<< "$(cat "${HOME_DIR}"/config.toml)")" elif [ -f "${HOME_DIR}/config.yml" ]; then - rq -y <<< "$(cat "${HOME_DIR}"/config.yml)" | jq 'map(.)' > "${HOME_DIR}"/config.json + JSON_CONFIG="$(rq -y <<< "$(cat "${HOME_DIR}"/config.yml)")" elif [ -f "${HOME_DIR}/config.yaml" ]; then - rq -y <<< "$(cat "${HOME_DIR}"/config.yaml)" | jq 'map(.)' > "${HOME_DIR}"/config.json + JSON_CONFIG="$(rq -y <<< "$(cat "${HOME_DIR}"/config.yaml)")" fi + jq 'map(.)' "${JSON_CONFIG}" > "${HOME_DIR}"/config.working.json } DOCKER_SOCK=/var/run/docker.sock @@ -263,19 +265,13 @@ ensure_docker_socket_accessible start_app() { get_config - if [ -f "${HOME_DIR}/config.working.json" ]; then - export CONFIG=${HOME_DIR}/config.working.json - elif [ -f "${HOME_DIR}/config.json" ]; then - export CONFIG=${HOME_DIR}/config.json - else - echo "NO CONFIG FILE FOUND" + export CONFIG=${HOME_DIR}/config.working.json + if [ ! -f "${CONFIG}" ]; then + echo "Unable to find ${CONFIG}." + exit 1 fi - if [ "$1" = "crond" ]; then - if [ -f "${CONFIG}" ]; then - build_crontab - else - echo "Unable to find ${CONFIG}" - fi + if [ "$1" == "crond" ]; then + build_crontab fi echo "$@" exec "$@" From 99aa59ddb4153e192f0f904672f1cfab5d6f6a05 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:31:20 -0700 Subject: [PATCH 11/17] chore: whitespace and dead code cleanup. --- docker-entrypoint | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 1ddd1fd..9f406c6 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -5,7 +5,7 @@ if [ -z "$DOCKER_HOST" ] && [ -a "$DOCKER_PORT_2375_TCP" ]; then export DOCKER_HOST='tcp://docker:2375' fi -# for local testing only +# For local testing only. #HOME_DIR=. if [ "${LOG_FILE}" == "" ]; then @@ -32,25 +32,25 @@ get_config() { DOCKER_SOCK=/var/run/docker.sock CRONTAB_FILE=/etc/crontabs/docker -# Ensure dir exist - in case of volume mapping +# Ensure dir exist - in case of volume mapping. mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects ensure_docker_socket_accessible() { if ! grep -q "^docker:" /etc/group; then - # Ensure 'docker' user has permissions for docker socket (without changing permissions) + # Ensure 'docker' user has permissions for docker socket (without changing permissions). DOCKER_GID=$(stat -c '%g' ${DOCKER_SOCK}) if [ "${DOCKER_GID}" != "0" ]; then if ! grep -qE "^[^:]+:[^:]+:${DOCKER_GID}:" /etc/group; then - # No group with such gid exists - create group docker + # No group with such gid exists - create group docker. addgroup -g "${DOCKER_GID}" docker adduser docker docker else - # Group with such gid exists - add user "docker" to this group + # Group with such gid exists - add user "docker" to this group. DOCKER_GROUP_NAME=$(getent group "${DOCKER_GID}" | awk -F':' '{{ print $1 }}') adduser docker "$DOCKER_GROUP_NAME" fi else - # Docker socket belongs to "root" group - add user "docker" to this group + # Docker socket belongs to "root" group - add user "docker" to this group. adduser docker root fi fi @@ -65,12 +65,9 @@ make_image_cmd() { VOLUMES=$(echo "${1}" | jq -r '.volumes | map(" -v " + .) | join("")') PORTS=$(echo "${1}" | jq -r '.ports | map(" -p " + .) | join("")') EXPOSE=$(echo "${1}" | jq -r '.expose | map(" --expose " + .) | join("")') - # We'll add name in, if it exists NAME=$(echo "${1}" | jq -r 'select(.name != null) | .name') NETWORK=$(echo "${1}" | jq -r 'select(.network != null) | .network') ENVIRONMENT=$(echo "${1}" | jq -r '.environment | map(" -e " + .) | join("")') - # echo ${1} | jq -r '.environment | join("\n")' > ${PWD}/${NAME}.env - # ENVIRONMENT=" --env-file ${PWD}/${NAME}.env" if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi if [ -n "${NAME}" ]; then DOCKERARGS="${DOCKERARGS} --rm --name ${NAME} "; fi if [ -n "${NETWORK}" ]; then DOCKERARGS="${DOCKERARGS} --network ${NETWORK} "; fi @@ -93,8 +90,7 @@ make_container_cmd() { TMP_COMMAND=$(echo "${1}" | jq -r .command) if [ "${PROJECT}" != "null" ]; then - - # create bash script to detect all running containers + # Create bash script to detect all running containers. if [ "${SCRIPT_NAME}" == "null" ]; then SCRIPT_NAME=$(cat /proc/sys/kernel/random/uuid) fi @@ -108,7 +104,6 @@ for CONTAINER_NAME in \$CONTAINERS; do done EOF echo "/bin/bash ${HOME_DIR}/projects/${SCRIPT_NAME}.sh" - # cat "/bin/bash ${HOME_DIR}/projects/${SCRIPT_NAME}.sh" else echo "docker exec ${DOCKERARGS} ${CONTAINER} ${TMP_COMMAND}" fi @@ -182,7 +177,6 @@ parse_schedule() { } function build_crontab() { - rm -rf ${CRONTAB_FILE} ONSTART=() @@ -216,28 +210,17 @@ cat << EOF > "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh #!/usr/bin/env bash set -e -# TODO find workaround -# [error] write /dev/stdout: broken pipe <- when using docker commands -#UUID=\$(cat /proc/sys/kernel/random/uuid) -#exec > >(read message; echo "\${UUID} \$(date -Iseconds) [info] \$message" | tee -a ${LOG_FILE} ) -#exec 2> >(read message; echo "\${UUID} \$(date -Iseconds) [error] \$message" | tee -a ${LOG_FILE} >&2) - echo "Start Cronjob **${SCRIPT_NAME}** ${COMMENT}" $(make_cmd "$(jq -c .["$i"] "${CONFIG}")") EOF - - - if [ "$(jq -r .["$i"].trigger "${CONFIG}")" != "null" ]; then while read -r j ; do if [ "$(jq .["$i"].trigger["$j"].command "${CONFIG}")" == "null" ]; then echo "Command Missing: $(jq -r .["$i"].trigger["$j"].command "${CONFIG}")" continue fi - #TRIGGER_COMMAND=$(make_cmd "$(jq -c .[$i].trigger[$j] ${CONFIG})") make_cmd "$(jq -c .["$i"].trigger["$j"] "${CONFIG}")" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh - #COMMAND="${COMMAND} && ${TRIGGER_COMMAND}" done < <(jq -r '.['"$i"'].trigger|keys[]' "${CONFIG}") fi @@ -260,7 +243,6 @@ EOF done } - ensure_docker_socket_accessible start_app() { From dc18a5199df675bdcf9ee4644250320dfcd8c6e8 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:33:41 -0700 Subject: [PATCH 12/17] chore: reorganization. --- docker-entrypoint | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 9f406c6..e9ece87 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -1,12 +1,19 @@ #!/usr/bin/env bash set -e +DOCKER_SOCK=/var/run/docker.sock +CRONTAB_FILE=/etc/crontabs/docker + +# For local testing only. +#HOME_DIR=. + +# Ensure dir exist - in case of volume mapping. +mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects + if [ -z "$DOCKER_HOST" ] && [ -a "$DOCKER_PORT_2375_TCP" ]; then export DOCKER_HOST='tcp://docker:2375' fi -# For local testing only. -#HOME_DIR=. if [ "${LOG_FILE}" == "" ]; then LOG_DIR=/var/log/crontab @@ -29,12 +36,6 @@ get_config() { jq 'map(.)' "${JSON_CONFIG}" > "${HOME_DIR}"/config.working.json } -DOCKER_SOCK=/var/run/docker.sock -CRONTAB_FILE=/etc/crontabs/docker - -# Ensure dir exist - in case of volume mapping. -mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects - ensure_docker_socket_accessible() { if ! grep -q "^docker:" /etc/group; then # Ensure 'docker' user has permissions for docker socket (without changing permissions). @@ -243,8 +244,6 @@ EOF done } -ensure_docker_socket_accessible - start_app() { get_config export CONFIG=${HOME_DIR}/config.working.json @@ -259,4 +258,5 @@ start_app() { exec "$@" } +ensure_docker_socket_accessible start_app "$@" From c685687367918b3b0b62e6775776ded1994a7756 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:34:43 -0700 Subject: [PATCH 13/17] chore: rename function to better describe what it does. --- docker-entrypoint | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index e9ece87..6dac6af 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -22,7 +22,7 @@ if [ "${LOG_FILE}" == "" ]; then touch ${LOG_FILE} fi -get_config() { +normalize_config() { JSON_CONFIG={} if [ -f "${HOME_DIR}/config.json" ]; then JSON_CONFIG="$(cat "${HOME_DIR}"/config.json)" @@ -245,7 +245,7 @@ EOF } start_app() { - get_config + normalize_config export CONFIG=${HOME_DIR}/config.working.json if [ ! -f "${CONFIG}" ]; then echo "Unable to find ${CONFIG}." From 84265413ee79bb51c5e81a2d1555c2d567cfafc4 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:38:01 -0700 Subject: [PATCH 14/17] chore: adding error handling. --- docker-entrypoint | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docker-entrypoint b/docker-entrypoint index 6dac6af..b5a7fd7 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -7,6 +7,11 @@ CRONTAB_FILE=/etc/crontabs/docker # For local testing only. #HOME_DIR=. +if [ -z "${HOME_DIR}" ]; then + echo "HOME_DIR not set." + exit 1 +fi + # Ensure dir exist - in case of volume mapping. mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects From f0c30632bd919fa159db8095cbca579f20446164 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:43:14 -0700 Subject: [PATCH 15/17] chore: standardize on {}. --- docker-entrypoint | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index b5a7fd7..3987ea5 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -15,7 +15,7 @@ fi # Ensure dir exist - in case of volume mapping. mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects -if [ -z "$DOCKER_HOST" ] && [ -a "$DOCKER_PORT_2375_TCP" ]; then +if [ -z "${DOCKER_HOST}" ] && [ -a "${DOCKER_PORT_2375_TCP}" ]; then export DOCKER_HOST='tcp://docker:2375' fi @@ -53,7 +53,7 @@ ensure_docker_socket_accessible() { else # Group with such gid exists - add user "docker" to this group. DOCKER_GROUP_NAME=$(getent group "${DOCKER_GID}" | awk -F':' '{{ print $1 }}') - adduser docker "$DOCKER_GROUP_NAME" + adduser docker "${DOCKER_GROUP_NAME}" fi else # Docker socket belongs to "root" group - add user "docker" to this group. @@ -63,7 +63,7 @@ ensure_docker_socket_accessible() { } slugify() { - echo "$@" | iconv -t ascii | sed -r s/[~^]+//g | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr '[:upper:]' '[:lower:]' + echo "${@}" | iconv -t ascii | sed -r s/[~^]+//g | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr '[:upper:]' '[:lower:]' } make_image_cmd() { @@ -90,7 +90,7 @@ make_container_cmd() { DOCKERARGS=$(echo "${1}" | jq -r .dockerargs) if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi SCRIPT_NAME=$(echo "${1}" | jq -r .name) - SCRIPT_NAME=$(slugify "$SCRIPT_NAME") + SCRIPT_NAME=$(slugify "${SCRIPT_NAME}") PROJECT=$(echo "${1}" | jq -r .project) CONTAINER=$(echo "${1}" | jq -r .container | envsubst) TMP_COMMAND=$(echo "${1}" | jq -r .command) @@ -123,11 +123,11 @@ EOF make_cmd() { if [ "$(echo "${1}" | jq -r .image)" != "null" ]; then - make_image_cmd "$1" + make_image_cmd "${1}" elif [ "$(echo "${1}" | jq -r .container)" != "null" ]; then - make_container_cmd "$1" + make_container_cmd "${1}" #elif [ "$(echo ${1} | jq -r .host)" != "null" ]; then - # make_host_cmd "$1" + # make_host_cmd "${1}" else echo "${1}" | jq -r .command fi @@ -160,9 +160,9 @@ parse_schedule() { TIME=$2 TOTAL=0 - M=$(echo "$TIME" | grep -o '[0-9]\+m') - H=$(echo "$TIME" | grep -o '[0-9]\+h') - D=$(echo "$TIME" | grep -o '[0-9]\+d') + M=$(echo "${TIME}" | grep -o '[0-9]\+m') + H=$(echo "${TIME}" | grep -o '[0-9]\+h') + D=$(echo "${TIME}" | grep -o '[0-9]\+d') if [ -n "${M}" ]; then TOTAL=$((TOTAL + ${M::-1})) @@ -206,7 +206,7 @@ function build_crontab() { fi SCRIPT_NAME=$(jq -r .["$i"].name "${CONFIG}") - SCRIPT_NAME=$(slugify "$SCRIPT_NAME") + SCRIPT_NAME=$(slugify "${SCRIPT_NAME}") if [ "${SCRIPT_NAME}" == "null" ]; then SCRIPT_NAME=$(cat /proc/sys/kernel/random/uuid) fi @@ -256,12 +256,12 @@ start_app() { echo "Unable to find ${CONFIG}." exit 1 fi - if [ "$1" == "crond" ]; then + if [ "${1}" == "crond" ]; then build_crontab fi - echo "$@" - exec "$@" + echo "${@}" + exec "${@}" } ensure_docker_socket_accessible -start_app "$@" +start_app "${@}" From 7f29f0621e1410580f9e75d3de6d63cbd457d9a7 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:51:38 -0700 Subject: [PATCH 16/17] chore: standardizing on env vars. --- docker-entrypoint | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docker-entrypoint b/docker-entrypoint index 3987ea5..e44ded5 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -195,8 +195,9 @@ function build_crontab() { fi SCHEDULE=$(parse_schedule "${SCHEDULE}" | sed 's/\\//g') - if [ "$(jq -r .["$i"].command "${CONFIG}")" == "null" ]; then - echo "Command Missing: $(jq -r .["$i"].command "${CONFIG}")" + COMMAND=$(jq -r .["$i"].command "${CONFIG}") + if [ "${COMMAND}" == "null" ]; then + echo "Command Missing: '${COMMAND}'" continue fi @@ -220,10 +221,12 @@ echo "Start Cronjob **${SCRIPT_NAME}** ${COMMENT}" $(make_cmd "$(jq -c .["$i"] "${CONFIG}")") EOF - if [ "$(jq -r .["$i"].trigger "${CONFIG}")" != "null" ]; then + TRIGGER=$(jq -r .["$i"].trigger "${CONFIG}") + if [ "${TRIGGER}" != "null" ]; then while read -r j ; do - if [ "$(jq .["$i"].trigger["$j"].command "${CONFIG}")" == "null" ]; then - echo "Command Missing: $(jq -r .["$i"].trigger["$j"].command "${CONFIG}")" + TRIGGER_COMMAND=$(jq .["$i"].trigger["$j"].command "${CONFIG}") + if [ "${TRIGGER_COMMAND}" == "null" ]; then + echo "Command Missing: '${TRIGGER_COMMAND}'" continue fi make_cmd "$(jq -c .["$i"].trigger["$j"] "${CONFIG}")" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh From 1d844f8318e524e23b22462e5845a38112066524 Mon Sep 17 00:00:00 2001 From: Robert Wlodarczyk Date: Sat, 16 Jul 2022 08:58:33 -0700 Subject: [PATCH 17/17] chore: missed one spot using previously set env var. --- docker-entrypoint | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-entrypoint b/docker-entrypoint index e44ded5..1c7a91d 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -229,7 +229,7 @@ EOF echo "Command Missing: '${TRIGGER_COMMAND}'" continue fi - make_cmd "$(jq -c .["$i"].trigger["$j"] "${CONFIG}")" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh + make_cmd "${TRIGGER_COMMAND}" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh done < <(jq -r '.['"$i"'].trigger|keys[]' "${CONFIG}") fi