From 36ef24f15ff5ee5d283e2297721fd7208d65ed31 Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 09:48:40 -0700
Subject: [PATCH 1/8] chore: omit additional items.

---
 .gitignore | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore
index f8a3aa0..f6473b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,10 @@
 .idea
 *.iml
-
-config.json
 .vscode
 .DS_Store
+
+config.json
+config.working.json
+
+jobs/
+projects/

From a523ad7d747d942383c3c644fbcf8a8abc4d82a7 Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 09:49:17 -0700
Subject: [PATCH 2/8] fix: reset COMMENT.

---
 docker-entrypoint | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/docker-entrypoint b/docker-entrypoint
index 272f182..41af427 100755
--- a/docker-entrypoint
+++ b/docker-entrypoint
@@ -186,7 +186,6 @@ function build_crontab() {
 
     ONSTART=()
     while read -r i ; do
-
         SCHEDULE=$(jq -r .["$i"].schedule "${CONFIG}" | sed 's/\*/\\*/g')
         if [ "${SCHEDULE}" == "null" ]; then
             echo "Schedule Missing: $(jq -r .["$i"].schedule "${CONFIG}")"
@@ -203,6 +202,9 @@ function build_crontab() {
         COMMENT=$(jq -r .["$i"].comment "${CONFIG}")
         if [ "${COMMENT}" != "null" ]; then
             echo "# ${COMMENT}" >> ${CRONTAB_FILE}
+        else
+            # Reset COMMENT to empty rather than keep the 'null' value.
+            COMMENT=
         fi
 
         SCRIPT_NAME=$(jq -r .["$i"].name "${CONFIG}")
@@ -217,7 +219,6 @@ cat << EOF > "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh
 set -e
 
 echo "Start Cronjob **${SCRIPT_NAME}** ${COMMENT}"
-
 $(make_cmd "$(jq -c .["$i"] "${CONFIG}")")
 EOF
         TRIGGER=$(jq -r .["$i"].trigger "${CONFIG}")

From 9316c9f5c2dd05c329897ae28b3aa2eb57f8a047 Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 10:22:43 -0700
Subject: [PATCH 3/8] fix: address jq parsing errors when some properties are
 not set.

---
 docker-entrypoint | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/docker-entrypoint b/docker-entrypoint
index 41af427..1d51a53 100755
--- a/docker-entrypoint
+++ b/docker-entrypoint
@@ -67,19 +67,19 @@ 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("")')
+    VOLUMES=$(echo "${1}" | jq -r 'select(.volumes != null) | .volumes | map(" -v " + .) | join("")')
+    PORTS=$(echo "${1}" | jq -r 'select(.ports != null) | .ports | map(" -p " + .) | join("")')
+    EXPOSE=$(echo "${1}" | jq -r 'select(.expose != null) | .expose | map(" --expose " + .) | 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("")')
+    ENVIRONMENT=$(echo "${1}" | jq -r 'select(.environment != null) | .environment | map(" -e " + .) | join("")')
     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
-    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
+    if [ -n "${NAME}" ]; then DOCKERARGS+=" --rm --name ${NAME} "; fi
+    if [ -n "${NETWORK}" ]; then DOCKERARGS+=" --network ${NETWORK} "; fi
+    if [ -n "${VOLUMES}" ]; then DOCKERARGS+="${VOLUMES}"; fi
+    if [ -n "${ENVIRONMENT}" ]; then DOCKERARGS+="${ENVIRONMENT}"; fi
+    if [ -n "${PORTS}" ]; then DOCKERARGS+="${PORTS}"; fi
+    if [ -n "${EXPOSE}" ]; then 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 0643e9ceaeee2c8df64207dad50887c11d558081 Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 10:40:02 -0700
Subject: [PATCH 4/8] chore: moving line to be consistent.

---
 docker-entrypoint | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docker-entrypoint b/docker-entrypoint
index 1d51a53..09ef079 100755
--- a/docker-entrypoint
+++ b/docker-entrypoint
@@ -67,13 +67,13 @@ slugify() {
 
 make_image_cmd() {
     DOCKERARGS=$(echo "${1}" | jq -r .dockerargs)
+    if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
     VOLUMES=$(echo "${1}" | jq -r 'select(.volumes != null) | .volumes | map(" -v " + .) | join("")')
     PORTS=$(echo "${1}" | jq -r 'select(.ports != null) | .ports | map(" -p " + .) | join("")')
     EXPOSE=$(echo "${1}" | jq -r 'select(.expose != null) | .expose | map(" --expose " + .) | join("")')
     NAME=$(echo "${1}" | jq -r 'select(.name != null) | .name')
     NETWORK=$(echo "${1}" | jq -r 'select(.network != null) | .network')
     ENVIRONMENT=$(echo "${1}" | jq -r 'select(.environment != null) | .environment | map(" -e " + .) | join("")')
-    if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
     if [ -n "${NAME}" ]; then DOCKERARGS+=" --rm --name ${NAME} "; fi
     if [ -n "${NETWORK}" ]; then DOCKERARGS+=" --network ${NETWORK} "; fi
     if [ -n "${VOLUMES}" ]; then DOCKERARGS+="${VOLUMES}"; fi

From 08bbceff959460d63b77fcc0746dd14b5005afce Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 10:43:25 -0700
Subject: [PATCH 5/8] fix: cleaning script creation.

---
 docker-entrypoint | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/docker-entrypoint b/docker-entrypoint
index 09ef079..fc3deca 100755
--- a/docker-entrypoint
+++ b/docker-entrypoint
@@ -104,8 +104,8 @@ cat << EOF > "${HOME_DIR}"/projects/"${SCRIPT_NAME}".sh
 set -e
 
 CONTAINERS=\$(docker ps --format '{{.Names}}' | grep -E "^${PROJECT}_${CONTAINER}.[0-9]+")
-for CONTAINER_NAME in \$CONTAINERS; do
-    docker exec ${DOCKERARGS} \${CONTAINER_NAME} ${TMP_COMMAND}
+for CONTAINER_NAME in \${CONTAINERS}; do
+    docker exec "${DOCKERARGS} \${CONTAINER_NAME} ${TMP_COMMAND}"
 done
 EOF
         echo "/bin/bash ${HOME_DIR}/projects/${SCRIPT_NAME}.sh"

From e69b2767074136107d45a6f4fadfd3a1cf26fe16 Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 10:45:41 -0700
Subject: [PATCH 6/8] chore: nicer formatting.

---
 docker-entrypoint | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/docker-entrypoint b/docker-entrypoint
index fc3deca..4509cb3 100755
--- a/docker-entrypoint
+++ b/docker-entrypoint
@@ -201,10 +201,11 @@ function build_crontab() {
 
         COMMENT=$(jq -r .["$i"].comment "${CONFIG}")
         if [ "${COMMENT}" != "null" ]; then
-            echo "# ${COMMENT}" >> ${CRONTAB_FILE}
+            COMMENT=" ${COMMENT}"
+            echo "#${COMMENT}" >> ${CRONTAB_FILE}
         else
             # Reset COMMENT to empty rather than keep the 'null' value.
-            COMMENT=
+            COMMENT=" "
         fi
 
         SCRIPT_NAME=$(jq -r .["$i"].name "${CONFIG}")
@@ -218,7 +219,7 @@ cat << EOF > "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh
 #!/usr/bin/env bash
 set -e
 
-echo "Start Cronjob **${SCRIPT_NAME}** ${COMMENT}"
+echo "Start Cronjob **${SCRIPT_NAME}**${COMMENT}"
 $(make_cmd "$(jq -c .["$i"] "${CONFIG}")")
 EOF
         TRIGGER=$(jq -r .["$i"].trigger "${CONFIG}")
@@ -233,7 +234,7 @@ EOF
             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}
 

From 31d0b732b2ae29069edb6a93af60b9fb47c68603 Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 10:53:34 -0700
Subject: [PATCH 7/8] chore: cleaning up echos.

---
 docker-entrypoint | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/docker-entrypoint b/docker-entrypoint
index 4509cb3..de76ba9 100755
--- a/docker-entrypoint
+++ b/docker-entrypoint
@@ -16,7 +16,7 @@ fi
 mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects
 
 if [ -z "${DOCKER_HOST}" ] && [ -a "${DOCKER_PORT_2375_TCP}" ]; then
-    export DOCKER_HOST='tcp://docker:2375'
+    export DOCKER_HOST="tcp://docker:2375"
 fi
 
 if [ "${LOG_FILE}" == "" ]; then
@@ -188,14 +188,14 @@ function build_crontab() {
     while read -r i ; do
         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')
 
         COMMAND=$(jq -r .["$i"].command "${CONFIG}")
         if [ "${COMMAND}" == "null" ]; then
-            echo "Command Missing: '${COMMAND}'"
+            echo "'command' missing: '${COMMAND}'"
             continue
         fi
 
@@ -219,7 +219,7 @@ cat << EOF > "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh
 #!/usr/bin/env bash
 set -e
 
-echo "Start Cronjob **${SCRIPT_NAME}**${COMMENT}"
+echo "start cron job **${SCRIPT_NAME}**${COMMENT}"
 $(make_cmd "$(jq -c .["$i"] "${CONFIG}")")
 EOF
         TRIGGER=$(jq -r .["$i"].trigger "${CONFIG}")
@@ -227,14 +227,14 @@ EOF
             while read -r j ; do
                 TRIGGER_COMMAND=$(jq .["$i"].trigger["$j"].command "${CONFIG}")
                 if [ "${TRIGGER_COMMAND}" == "null" ]; then
-                    echo "Command Missing: '${TRIGGER_COMMAND}'"
+                    echo "'command' missing: '${TRIGGER_COMMAND}'"
                     continue
                 fi
                 make_cmd "${TRIGGER_COMMAND}" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh
             done < <(jq -r '.['"$i"'].trigger|keys[]' "${CONFIG}")
         fi
 
-        echo "echo \"End Cronjob **${SCRIPT_NAME}**${COMMENT}\"" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh
+        echo "echo \"end cron job **${SCRIPT_NAME}**${COMMENT}\"" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh
 
         echo "${SCHEDULE} ${COMMAND}" >> ${CRONTAB_FILE}
 
@@ -257,7 +257,7 @@ start_app() {
     normalize_config
     export CONFIG=${HOME_DIR}/config.working.json
     if [ ! -f "${CONFIG}" ]; then
-        echo "Unable to find ${CONFIG}."
+        echo "generated ${CONFIG} missing."
         exit 1
     fi
     if [ "${1}" == "crond" ]; then

From 9da424985d018ead48b360539cc1556137204003 Mon Sep 17 00:00:00 2001
From: Robert Wlodarczyk <robert@simplicityguy.com>
Date: Sat, 16 Jul 2022 11:24:32 -0700
Subject: [PATCH 8/8] fix: moving the top level key name to the "name"
 property.

---
 docker-entrypoint | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docker-entrypoint b/docker-entrypoint
index de76ba9..dd8ada5 100755
--- a/docker-entrypoint
+++ b/docker-entrypoint
@@ -37,7 +37,7 @@ normalize_config() {
     elif [ -f "${HOME_DIR}/config.yaml" ]; then
         JSON_CONFIG="$(rq -y <<< "$(cat "${HOME_DIR}"/config.yaml)")"
     fi
-    jq -r 'map(.)' <<< "${JSON_CONFIG}" > "${HOME_DIR}"/config.working.json
+    jq -r 'to_entries | map_values(.value + { name: .key })' <<< "${JSON_CONFIG}" > "${HOME_DIR}"/config.working.json
 }
 
 ensure_docker_socket_accessible() {