1
0
Fork 0
mirror of https://github.com/yavook/kiwi-cron.git synced 2024-11-21 23:13:00 +00:00

Merge branch 'release/0.1.0'

This commit is contained in:
Jörn-Michael Miehe 2022-03-01 18:44:26 +01:00
commit 72c6719f83
8 changed files with 102 additions and 68 deletions

View file

@ -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/

View file

@ -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.

View file

@ -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

View file

@ -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)
"${this_dir}/print_cron_schedule" \ echo "${cs_rand_min}" "*${cs_every}" "*" "*" "*" "${cs_command}"
"${cs_rand_min}" "*${cs_every}" "*" "*" "*" "${cs_command}"
;; ;;
day) day)
"${this_dir}/print_cron_schedule" \ echo "${cs_rand_min}" "${cs_rand_hour}" "*${cs_every}" "*" "*" "${cs_command}"
"${cs_rand_min}" "${cs_rand_hour}" "*${cs_every}" "*" "*" "${cs_command}"
;; ;;
week) week)
"${this_dir}/print_cron_schedule" \ echo "${cs_rand_min}" "${cs_rand_hour}" "*" "*" "${cs_rand_weekday}" "${cs_command}"
"${cs_rand_min}" "${cs_rand_hour}" "*" "*" "${cs_rand_weekday}" "${cs_command}"
;; ;;
month) 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_day}" "*${cs_every}" "*" "${cs_command}"
;; ;;
year) year)
"${this_dir}/print_cron_schedule" \ echo "${cs_rand_min}" "${cs_rand_hour}" "${cs_rand_day}" "${cs_rand_month}" "*" "${cs_command}"
"${cs_rand_min}" "${cs_rand_hour}" "${cs_rand_day}" "${cs_rand_month}" "*" "${cs_command}"
;; ;;
esac esac

View file

@ -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}"

View file

@ -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
View 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

View file

@ -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}"