docker-crontab/docker-entrypoint

208 lines
5.8 KiB
Plaintext
Raw Normal View History

2017-02-12 16:28:53 -07:00
#!/usr/bin/env bash
set -e
2017-02-15 10:58:57 -07:00
if [ -z "$DOCKER_HOST" -a "$DOCKER_PORT_2375_TCP" ]; then
export DOCKER_HOST='tcp://docker:2375'
fi
2017-02-12 16:28:53 -07:00
# for local testing only
#HOME_DIR=.
if [ "${LOG_FILE}" == "" ]; then
LOG_DIR=/var/log/crontab
LOG_FILE=${LOG_DIR}/jobs.log
mkdir -p ${LOG_DIR}
touch ${LOG_FILE}
fi
2017-02-12 16:28:53 -07:00
CONFIG=${HOME_DIR}/config.json
DOCKER_SOCK=/var/run/docker.sock
2017-02-14 07:18:25 -07:00
CRONTAB_FILE=/etc/crontabs/docker
2017-02-12 16:28:53 -07:00
# Ensure dir exist - in case of volume mapping
mkdir -p ${HOME_DIR}/jobs ${HOME_DIR}/projects
2017-02-12 16:28:53 -07:00
make_image_cmd() {
2017-02-12 17:05:46 -07:00
DOCKERARGS=$(echo ${1} | jq -r .dockerargs)
2017-02-12 16:28:53 -07:00
if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
2017-02-12 17:05:46 -07:00
IMAGE=$(echo ${1} | jq -r .image)
TMP_COMMAND=$(echo ${1} | jq -r .command)
2017-02-12 16:28:53 -07:00
echo "docker run ${DOCKERARGS} ${IMAGE} ${TMP_COMMAND}"
}
make_container_cmd() {
2017-02-12 17:05:46 -07:00
DOCKERARGS=$(echo ${1} | jq -r .dockerargs)
2017-02-12 16:28:53 -07:00
if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi
2017-02-12 17:05:46 -07:00
PROJECT=$(echo ${1} | jq -r .project)
CONTAINER=$(echo ${1} | jq -r .container)
TMP_COMMAND=$(echo ${1} | jq -r .command)
2017-02-12 16:28:53 -07:00
if [ "${PROJECT}" != "null" ]; then
# create bash script to detect all running containers
SCRIPT_NAME=$(cat /proc/sys/kernel/random/uuid)
2017-02-14 07:18:25 -07:00
cat << EOF > ${HOME_DIR}/projects/${SCRIPT_NAME}.sh
2017-02-12 21:37:00 -07:00
#!/usr/bin/env bash
2017-02-12 16:28:53 -07:00
set -e
UUID=$1
echo "project UUID ${UUID}"
2017-02-14 07:18:25 -07:00
CONTAINERS=\$(docker ps --format '{{.Names}}' | grep -E "^${PROJECT}_${CONTAINER}_[0-9]+")
2017-02-12 16:28:53 -07:00
for CONTAINER_NAME in \$CONTAINERS; do
2017-02-14 07:18:25 -07:00
docker exec ${DOCKERARGS} \${CONTAINER_NAME} ${TMP_COMMAND}
2017-02-12 16:28:53 -07:00
done
EOF
echo "/bin/bash ${HOME_DIR}/projects/${SCRIPT_NAME}.sh \${UUID}"
2017-02-12 16:28:53 -07:00
else
echo "docker exec ${DOCKERARGS} ${CONTAINER} ${TMP_COMMAND}"
fi
}
2017-02-14 07:44:14 -07:00
#make_host_cmd() {
# HOST_BINARY=$(echo ${1} | jq -r .host)
# TMP_COMMAND=$(echo ${1} | jq -r .command)
# echo "${HOST_BINARY} ${TMP_COMMAND}"
#}
2017-02-12 16:28:53 -07:00
make_cmd() {
2017-02-12 21:08:45 -07:00
if [ "$(echo ${1} | jq -r .image)" != "null" ]; then
make_image_cmd "$1"
elif [ "$(echo ${1} | jq -r .container)" != "null" ]; then
make_container_cmd "$1"
2017-02-14 07:44:14 -07:00
#elif [ "$(echo ${1} | jq -r .host)" != "null" ]; then
# make_host_cmd "$1"
2017-02-12 16:28:53 -07:00
else
2017-02-12 21:08:45 -07:00
echo ${1} | jq -r .command
2017-02-12 16:28:53 -07:00
fi
}
parse_schedule() {
case $1 in
"@yearly")
echo "0 0 0 1 1 *"
;;
"@annually")
echo "0 0 0 1 1 *"
;;
"@monthly")
echo "0 0 0 1 * *"
;;
"@weekly")
echo "0 0 0 * * 0"
;;
"@daily")
echo "0 0 0 * * *"
;;
"@midnight")
echo "0 0 0 * * *"
;;
"@hourly")
echo "0 0 * * * *"
;;
"@every")
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')
if [ -n "${M}" ]; then
TOTAL=$(($TOTAL + ${M::-1}))
fi
if [ -n "${H}" ]; then
TOTAL=$(($TOTAL + ${H::-1} * 60))
fi
if [ -n "${D}" ]; then
TOTAL=$(($TOTAL + ${D::-1} * 60 * 24))
fi
echo "*/${TOTAL} * * * * *"
;;
*)
echo "${@}"
;;
esac
}
function build_crontab() {
rm -rf ${CRONTAB_FILE}
2017-02-14 07:18:25 -07:00
ONSTART=()
2017-02-12 16:28:53 -07:00
while read i ; do
SCHEDULE=$(jq -r .[$i].schedule ${CONFIG} | sed 's/\*/\\*/g')
if [ "${SCHEDULE}" == "null" ]; then
echo "Schedule Missing: $(jq -r .[$i].schedule ${CONFIG})"
continue
fi
SCHEDULE=$(parse_schedule ${SCHEDULE} | sed 's/\\//g')
if [ "$(jq -r .[$i].command ${CONFIG})" == "null" ]; then
echo "Command Missing: $(jq -r .[$i].command ${CONFIG})"
continue
fi
2017-02-15 13:42:35 -07:00
COMMENT=$(jq -r .[$i].comment ${CONFIG})
if [ "${COMMENT}" != "null" ]; then
echo "# ${COMMENT}" >> ${CRONTAB_FILE}
fi
SCRIPT_NAME=$(jq -r .[$i].name ${CONFIG})
if [ "${SCRIPT_NAME}" == "null" ]; then
SCRIPT_NAME=$(cat /proc/sys/kernel/random/uuid)
fi
2017-02-15 11:16:11 -07:00
COMMAND="/bin/bash ${HOME_DIR}/jobs/${SCRIPT_NAME}.sh"
cat << EOF > ${HOME_DIR}/jobs/${SCRIPT_NAME}.sh
#!/usr/bin/env bash
set -e
UUID=\$(cat /proc/sys/kernel/random/uuid)
exec > >(read message; echo "\$(date -Iseconds) \${UUID} [info] \$message" | tee -a ${LOG_FILE} )
exec 2> >(read message; echo "\$(date -Iseconds) \${UUID} [error] \$message" | tee -a ${LOG_FILE} >&2)
echo "Start Cronjob **${SCRIPT_NAME}** ${COMMENT}"
2017-02-15 11:16:11 -07:00
$(make_cmd "$(jq -c .[$i] ${CONFIG})")
echo "End Cronjob **${SCRIPT_NAME}** ${COMMENT}"
2017-02-15 11:16:11 -07:00
EOF
2017-02-12 16:28:53 -07:00
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})"
continue
fi
2017-02-15 11:16:11 -07:00
#TRIGGER_COMMAND=$(make_cmd "$(jq -c .[$i].trigger[$j] ${CONFIG})")
2017-02-15 11:23:52 -07:00
echo "$(make_cmd "$(jq -c .[$i].trigger[$j] ${CONFIG})")" >> ${HOME_DIR}/jobs/${SCRIPT_NAME}.sh
2017-02-15 11:16:11 -07:00
#COMMAND="${COMMAND} && ${TRIGGER_COMMAND}"
2017-02-12 16:28:53 -07:00
done < <(jq -r '.['$i'].trigger|keys[]' ${CONFIG})
fi
echo "${SCHEDULE} ${COMMAND}" >> ${CRONTAB_FILE}
2017-02-14 07:18:25 -07:00
if [ "$(jq -r .[$i].onstart ${CONFIG})" == "true" ]; then
ONSTART+=("${COMMAND}")
fi
2017-02-12 16:28:53 -07:00
done < <(jq -r '.|keys[]' ${CONFIG})
2017-02-15 07:03:07 -07:00
echo "##### crontab generation complete #####"
2017-02-12 16:28:53 -07:00
cat ${CRONTAB_FILE}
2017-02-14 07:18:25 -07:00
2017-02-15 07:03:07 -07:00
echo "##### run commands with onstart #####"
for COMMAND in "${ONSTART[@]}"; do
2017-02-15 07:03:07 -07:00
echo "${COMMAND}"
2017-02-14 07:44:14 -07:00
${COMMAND} &
2017-02-14 07:18:25 -07:00
done
2017-02-12 16:28:53 -07:00
}
2017-02-12 16:57:19 -07:00
if [ "$1" = "crond" ]; then
if [ -f ${CONFIG} ]; then
build_crontab
else
echo "Unable to find ${HOME_DIR}/config.json"
fi
2017-02-12 16:28:53 -07:00
fi
echo "$@"
exec "$@"