mirror of
https://github.com/yavook/kiwi-cron.git
synced 2024-11-21 15:03:01 +00:00
Merge branch 'release/0.1.0'
This commit is contained in:
commit
72c6719f83
8 changed files with 102 additions and 68 deletions
|
@ -1,5 +1,7 @@
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
|
ENV TZ=Etc/UTC
|
||||||
|
|
||||||
RUN set -ex; \
|
RUN set -ex; \
|
||||||
\
|
\
|
||||||
mkdir -pm 755 /kiwi-cron; \
|
mkdir -pm 755 /kiwi-cron; \
|
||||||
|
@ -16,6 +18,7 @@ RUN set -ex; \
|
||||||
\
|
\
|
||||||
apk --no-cache add \
|
apk --no-cache add \
|
||||||
docker-cli \
|
docker-cli \
|
||||||
|
tzdata \
|
||||||
;
|
;
|
||||||
|
|
||||||
COPY bin /usr/local/bin/
|
COPY bin /usr/local/bin/
|
||||||
|
|
|
@ -28,6 +28,12 @@ For each subdirectory, a random valid cron schedule is generated, so that:
|
||||||
|
|
||||||
Cron schedules are regenerated once on each startup, only for directories that have files.
|
Cron schedules are regenerated once on each startup, only for directories that have files.
|
||||||
|
|
||||||
|
## Time Zones
|
||||||
|
|
||||||
|
`kiwi-cron` images include the `tzdata` package and automatically handle `/etc/localtime` on startup. By default, "Etc/UTC" is set as the container time zone.
|
||||||
|
|
||||||
|
To use a different time zone, change the container environment variable `TZ` to your liking, e.g. "Europe/Berlin".
|
||||||
|
|
||||||
## Finer granularity: The `/kiwi-cron/every` directory
|
## Finer granularity: The `/kiwi-cron/every` directory
|
||||||
|
|
||||||
Directories like `/kiwi-cron/every/5_minutes` will run scripts every 5 minutes.
|
Directories like `/kiwi-cron/every/5_minutes` will run scripts every 5 minutes.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# replace crontab, run crond
|
exec /usr/local/libexec/kiwi-cron/run_cron \
|
||||||
/usr/local/libexec/kiwi-cron/schedule_dirs | crontab -
|
"${@}" \
|
||||||
exec crond -fd 8
|
/usr/local/libexec/kiwi-cron/schedule_dirs
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
this_script="$( readlink -f "${0}" )"
|
|
||||||
this_dir="${this_script%/*}"
|
|
||||||
|
|
||||||
cs_every="${1:-1}"
|
cs_every="${1:-1}"
|
||||||
cs_units="${2}"
|
cs_units="${2}"
|
||||||
cs_command="${3}"
|
cs_command="${3}"
|
||||||
|
@ -35,28 +32,22 @@ cs_rand_weekday=$(( (6 + RANDOM % 2) % 7 ))
|
||||||
cs_rand_month=$(( RANDOM % 2 + 1 ))
|
cs_rand_month=$(( RANDOM % 2 + 1 ))
|
||||||
|
|
||||||
case "${cs_units}" in
|
case "${cs_units}" in
|
||||||
minute)
|
minute)
|
||||||
"${this_dir}/print_cron_schedule" \
|
echo "*${cs_every}" "*" "*" "*" "*" "${cs_command}"
|
||||||
"*${cs_every}" "*" "*" "*" "*" "${cs_command}"
|
;;
|
||||||
;;
|
hour)
|
||||||
hour)
|
echo "${cs_rand_min}" "*${cs_every}" "*" "*" "*" "${cs_command}"
|
||||||
"${this_dir}/print_cron_schedule" \
|
;;
|
||||||
"${cs_rand_min}" "*${cs_every}" "*" "*" "*" "${cs_command}"
|
day)
|
||||||
;;
|
echo "${cs_rand_min}" "${cs_rand_hour}" "*${cs_every}" "*" "*" "${cs_command}"
|
||||||
day)
|
;;
|
||||||
"${this_dir}/print_cron_schedule" \
|
week)
|
||||||
"${cs_rand_min}" "${cs_rand_hour}" "*${cs_every}" "*" "*" "${cs_command}"
|
echo "${cs_rand_min}" "${cs_rand_hour}" "*" "*" "${cs_rand_weekday}" "${cs_command}"
|
||||||
;;
|
;;
|
||||||
week)
|
month)
|
||||||
"${this_dir}/print_cron_schedule" \
|
echo "${cs_rand_min}" "${cs_rand_hour}" "${cs_rand_day}" "*${cs_every}" "*" "${cs_command}"
|
||||||
"${cs_rand_min}" "${cs_rand_hour}" "*" "*" "${cs_rand_weekday}" "${cs_command}"
|
;;
|
||||||
;;
|
year)
|
||||||
month)
|
echo "${cs_rand_min}" "${cs_rand_hour}" "${cs_rand_day}" "${cs_rand_month}" "*" "${cs_command}"
|
||||||
"${this_dir}/print_cron_schedule" \
|
;;
|
||||||
"${cs_rand_min}" "${cs_rand_hour}" "${cs_rand_day}" "*${cs_every}" "*" "${cs_command}"
|
|
||||||
;;
|
|
||||||
year)
|
|
||||||
"${this_dir}/print_cron_schedule" \
|
|
||||||
"${cs_rand_min}" "${cs_rand_hour}" "${cs_rand_day}" "${cs_rand_month}" "*" "${cs_command}"
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
pcs_minute="${1}"
|
|
||||||
pcs_hour="${2}"
|
|
||||||
pcs_day="${3}"
|
|
||||||
pcs_month="${4}"
|
|
||||||
pcs_weekday="${5}"
|
|
||||||
pcs_command="${6}"
|
|
||||||
|
|
||||||
printf '%-8s%-8s%-8s%-8s%-8s%s\n' \
|
|
||||||
"${pcs_minute}" "${pcs_hour}" "${pcs_day}" "${pcs_month}" "${pcs_weekday}" "${pcs_command}"
|
|
|
@ -1,2 +1,28 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
print_cron_schedule () {
|
||||||
|
pcs_minute="${1}"
|
||||||
|
pcs_hour="${2}"
|
||||||
|
pcs_day="${3}"
|
||||||
|
pcs_month="${4}"
|
||||||
|
pcs_weekday="${5}"
|
||||||
|
pcs_command="${6}"
|
||||||
|
|
||||||
|
printf '%-8s%-8s%-8s%-8s%-8s%s\n' \
|
||||||
|
"${pcs_minute}" "${pcs_hour}" "${pcs_day}" "${pcs_month}" "${pcs_weekday}" "${pcs_command}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# header
|
||||||
|
echo '# crontab generated by kiwi-cron'
|
||||||
|
echo '# generation time: '"$(date)"
|
||||||
|
echo '#'
|
||||||
|
|
||||||
|
# short documentation line
|
||||||
|
print_cron_schedule \
|
||||||
|
"# min" "hour" "day" "month" "weekday" "command"
|
||||||
|
|
||||||
|
# schedules
|
||||||
|
while read -r pc_min pc_hour pc_day pc_month pc_weekday pc_command; do
|
||||||
|
print_cron_schedule \
|
||||||
|
"${pc_min}" "${pc_hour}" "${pc_day}" "${pc_month}" "${pc_weekday}" "${pc_command}"
|
||||||
|
done
|
||||||
|
|
44
libexec/kiwi-cron/run_cron
Executable file
44
libexec/kiwi-cron/run_cron
Executable file
|
@ -0,0 +1,44 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# set timezone
|
||||||
|
export TZ="${TZ:-Etc/UTC}"
|
||||||
|
ln -sf "/usr/share/zoneinfo/${TZ}" "/etc/localtime"
|
||||||
|
|
||||||
|
# check for CLI options
|
||||||
|
while getopts ':n' rc_optarg; do
|
||||||
|
case "${rc_optarg}" in
|
||||||
|
n)
|
||||||
|
rc_dry_run="yes"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Invalid option: -${OPTARG}."
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
shift "$(( OPTIND - 1 ))"
|
||||||
|
|
||||||
|
# CLI arguments
|
||||||
|
rc_executable="${1}"
|
||||||
|
|
||||||
|
|
||||||
|
if [ -n "${rc_dry_run}" ]; then
|
||||||
|
# verbose, dry run
|
||||||
|
set -x
|
||||||
|
|
||||||
|
"${rc_executable}" \
|
||||||
|
| /usr/local/libexec/kiwi-cron/print_crontab
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# replace crontab
|
||||||
|
"${rc_executable}" \
|
||||||
|
| /usr/local/libexec/kiwi-cron/print_crontab \
|
||||||
|
| crontab -
|
||||||
|
|
||||||
|
# hand over to crond
|
||||||
|
exec crond -fd 8
|
||||||
|
|
||||||
|
exit 0
|
|
@ -3,17 +3,6 @@
|
||||||
this_script="$( readlink -f "${0}" )"
|
this_script="$( readlink -f "${0}" )"
|
||||||
this_dir="${this_script%/*}"
|
this_dir="${this_script%/*}"
|
||||||
|
|
||||||
crontab=''
|
|
||||||
crontab_line () {
|
|
||||||
if [ -z "${crontab}" ]; then
|
|
||||||
crontab="${1}"
|
|
||||||
else
|
|
||||||
crontab="$(
|
|
||||||
printf '%s\n%s' "${crontab}" "${1}";
|
|
||||||
)"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
dir_has_no_files () {
|
dir_has_no_files () {
|
||||||
dhnf_directory="${1}"
|
dhnf_directory="${1}"
|
||||||
|
|
||||||
|
@ -47,14 +36,6 @@ dir_to_unit () {
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
crontab_line '# crontab generated by kiwi-cron'
|
|
||||||
crontab_line '# generation time: '"$(date)"
|
|
||||||
crontab_line '#'
|
|
||||||
crontab_line "$(
|
|
||||||
"${this_dir}/print_cron_schedule" \
|
|
||||||
"# min" "hour" "day" "month" "weekday" "command"
|
|
||||||
)"
|
|
||||||
|
|
||||||
# check *ly dirs in "/kiwi-cron" directory
|
# check *ly dirs in "/kiwi-cron" directory
|
||||||
schedule_dirs="$(
|
schedule_dirs="$(
|
||||||
find "/kiwi-cron" -type d -name "*ly" -mindepth 1 -maxdepth 1
|
find "/kiwi-cron" -type d -name "*ly" -mindepth 1 -maxdepth 1
|
||||||
|
@ -71,9 +52,7 @@ for schedule_dir in ${schedule_dirs}; do
|
||||||
units="${dir_name%ly}"
|
units="${dir_name%ly}"
|
||||||
units="$( dir_to_unit "${units}" )"
|
units="$( dir_to_unit "${units}" )"
|
||||||
|
|
||||||
crontab_line "$(
|
"${this_dir}/create_schedule" "1" "${units}" "run-parts '${schedule_dir}'"
|
||||||
"${this_dir}/create_schedule" "1" "${units}" "run-parts '${schedule_dir}'"
|
|
||||||
)"
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# check dirs in "/kiwi-cron/every" directory
|
# check dirs in "/kiwi-cron/every" directory
|
||||||
|
@ -93,9 +72,5 @@ for schedule_dir in ${every_schedule_dirs}; do
|
||||||
units="$( echo "${dir_name}" | awk -F_ '{print $2}' )"
|
units="$( echo "${dir_name}" | awk -F_ '{print $2}' )"
|
||||||
units="${units%s}"
|
units="${units%s}"
|
||||||
|
|
||||||
crontab_line "$(
|
"${this_dir}/create_schedule" "${every}" "${units}" "run-parts '${schedule_dir}'"
|
||||||
"${this_dir}/create_schedule" "${every}" "${units}" "run-parts '${schedule_dir}'"
|
|
||||||
)"
|
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "${crontab}"
|
|
||||||
|
|
Loading…
Reference in a new issue