diff --git a/Dockerfile b/Dockerfile index e69cf48..97ae97b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -107,6 +107,6 @@ ENV \ GPG_KEY_ID="" \ GPG_PASSPHRASE="" -COPY run.sh /usr/local/bin/do-plicity +COPY do-plicity /usr/local/bin/ CMD ["do-plicity"] diff --git a/do-plicity b/do-plicity new file mode 100755 index 0000000..8a4c28c --- /dev/null +++ b/do-plicity @@ -0,0 +1,145 @@ +#!/bin/sh + +############# +# CONSTANTS # +############# + +# commands +env_exe="$(command -v env)" +ionice_exe="$(command -v ionice)" +duplicity_exe="$(command -v duplicity)" + +# check if uses encryption +if [ -n "${GPG_KEY_ID}" ]; then + # gpg key given + env_changes="PASSPHRASE='${GPG_PASSPHRASE}'" + encrypt_opts="--encrypt-key='${GPG_KEY_ID}'" +else + # no key given + env_changes="" + encrypt_opts="--no-encryption" +fi + +############# +# FUNCTIONS # +############# + +append_options() { + ao_cmdline="${1}" + ao_options="${2}" + shift 1 + + # remove leading whitespace characters + ao_options="${ao_options#"${ao_options%%[![:space:]]*}"}" + # remove trailing whitespace characters + ao_options="${ao_options%"${ao_options##*[![:space:]]}"}" + + # if options are given, stitch together with a space + if [ -n "${ao_options}" ]; then + echo "${ao_cmdline} ${ao_options}" + else + echo "${ao_cmdline}" + fi +} + +print_command() { + pc_task="${1}" + shift 1 + + # if environment should be changed, call with "env" + if [ -n "${env_changes}" ]; then + pc_cmdline="${env_exe} ${env_changes} " + else + pc_cmdline="" + fi + + pc_cmdline="${pc_cmdline}${ionice_exe} -c 3 ${duplicity_exe} ${encrypt_opts}" + + case "${pc_task}" in + backup) + pc_cmdline="${pc_cmdline} --allow-source-mismatch --volsize ${BACKUP_VOLSIZE} --full-if-older-than ${FULL_BACKUP_FREQUENCY}" + pc_cmdline="$( append_options "${pc_cmdline}" "${OPTIONS_BACKUP} /backup/source" )" + ;; + + cleanup) + pc_cmdline="${pc_cmdline} cleanup --force" + pc_cmdline="$( append_options "${pc_cmdline}" "${OPTIONS_CLEAN}" )" + ;; + + rmfull) + pc_cmdline="${pc_cmdline} remove-older-than ${BACKUP_RETENTION_TIME} --force" + pc_cmdline="$( append_options "${pc_cmdline}" "${OPTIONS_RMFULL}" )" + ;; + + rmincr) + pc_cmdline="${pc_cmdline} remove-all-inc-of-but-n-full ${KEEP_NUM_FULL_CHAINS} --force" + pc_cmdline="$( append_options "${pc_cmdline}" "${OPTIONS_RMINCR}" )" + ;; + esac + + pc_cmdline="${pc_cmdline} ${BACKUP_TARGET}" + echo "${pc_cmdline}" +} + +print_cron_schedule() { + pcs_min="$( echo "${1}" | awk '{print $1}' )" + pcs_hour="$( echo "${1}" | awk '{print $2}' )" + pcs_day="$( echo "${1}" | awk '{print $3}' )" + pcs_month="$( echo "${1}" | awk '{print $4}' )" + pcs_weekday="$( echo "${1}" | awk '{print $5}' )" + pcs_command="${2}" + shift 2 + + printf '%-8s%-8s%-8s%-8s%-8s%s\n' "${pcs_min}" "${pcs_hour}" "${pcs_day}" "${pcs_month}" "${pcs_weekday}" "${pcs_command}" +} + +print_crontab() { + echo '# crontab generated for kiwi-backup' + printf '# generation time: '; date + echo '#' + + # don't split the '#' from 'min' + print_cron_schedule '#_min hour day month weekday' 'command' | tr '_' ' ' + + print_cron_schedule "${SCHEDULE_BACKUP}" "$( print_command backup )" + print_cron_schedule "${SCHEDULE_CLEANUP}" "$( print_command cleanup )" + print_cron_schedule "${SCHEDULE_RMFULL}" "$( print_command rmfull )" + print_cron_schedule "${SCHEDULE_RMINCR}" "$( print_command rmincr )" +} + +######## +# MAIN # +######## + + +if [ "${#}" -gt 0 ]; then + # run a command + case "${1}" in + print-crontab) + print_crontab + ;; + + print-backup|print-cleanup|print-rmfull|print-rmincr) + print_command "${1##*-}" + ;; + + # execute single command + backup|cleanup|rmfull|rmincr) + print_command "${1}" + cmd="$(print_command "${1}")" + ${cmd} + ;; + + *) + >&2 echo "Unknown command '${1}'." + exit 1 + ;; + esac + +else + # default run: replace crontab, then start crond + print_crontab | crontab - + crond -fl 8 +fi + +exit 0 \ No newline at end of file diff --git a/run.sh b/run.sh deleted file mode 100755 index d3a0a03..0000000 --- a/run.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/sh - -############# -# CONSTANTS # -############# - -env_exe="$(command -v env)" -ionice_exe="$(command -v ionice)" -duplicity_exe="$(command -v duplicity)" - -if [ -n "${GPG_KEY_ID}" ]; then - # gpg key given - env_changes="PASSPHRASE='${GPG_PASSPHRASE}'" - encrypt_opts="--encrypt-key='${GPG_KEY_ID}'" -else - # no key given - env_changes="" - encrypt_opts="--no-encryption" -fi - -############# -# FUNCTIONS # -############# - -trim_options() { - # if args are given, trim whitespace, then add a space in front - if [ -n "${1}" ]; then - echo " $( echo "${1}" | xargs )" - fi -} - -print_command() { - task="${1}" - shift 1 - - if [ -n "${env_changes}" ]; then - # should change environment - cmdline="${env_exe} ${env_changes} " - else - cmdline="" - fi - - cmdline="${cmdline}${ionice_exe} -c 3 ${duplicity_exe} ${encrypt_opts}" - - case "${task}" in - backup) - cmdline="${cmdline} --allow-source-mismatch --volsize '${BACKUP_VOLSIZE}' --full-if-older-than '${FULL_BACKUP_FREQUENCY}'" - cmdline="${cmdline}$( trim_options "${OPTIONS_BACKUP}" )" - cmdline="${cmdline} /backup/source" - ;; - - cleanup) - cmdline="${cmdline} cleanup --force" - cmdline="${cmdline}$( trim_options "${OPTIONS_CLEAN}" )" - ;; - - rmfull) - cmdline="${cmdline} remove-older-than '${BACKUP_RETENTION_TIME}' --force" - cmdline="${cmdline}$( trim_options "${OPTIONS_RMFULL}" )" - ;; - - rmincr) - cmdline="${cmdline} remove-all-inc-of-but-n-full '${KEEP_NUM_FULL_CHAINS}' --force" - cmdline="${cmdline}$( trim_options "${OPTIONS_RMINCR}" )" - ;; - esac - - cmdline="${cmdline} '${BACKUP_TARGET}'" - echo "${cmdline}" -} - -print_cron_schedule() { - min="$( echo "${1}" | cut -d' ' -f1 )" - hour="$( echo "${1}" | cut -d' ' -f2 )" - day="$( echo "${1}" | cut -d' ' -f3 )" - month="$( echo "${1}" | cut -d' ' -f4 )" - weekday="$( echo "${1}" | cut -d' ' -f5 )" - command="${2}" - - printf '%-8s%-8s%-8s%-8s%-8s%s' "${min}" "${hour}" "${day}" "${month}" "${weekday}" "${command}" -} - -print_cron_header() { - # don't split the '#' from 'min' - print_cron_schedule '#_min hour day month weekday' 'command' | tr '_' ' ' -} - -print_crontab() { - echo '# crontab generated for kiwi-backup' - printf '# generation time: '; date - echo '#' - echo "$( print_cron_header )" - echo "$( print_cron_schedule "${SCHEDULE_BACKUP}" "$( print_command backup )" )" - echo "$( print_cron_schedule "${SCHEDULE_CLEANUP}" "$( print_command cleanup )" )" - echo "$( print_cron_schedule "${SCHEDULE_RMFULL}" "$( print_command rmfull )" )" - echo "$( print_cron_schedule "${SCHEDULE_RMINCR}" "$( print_command rmincr )" )" -} - -######## -# MAIN # -######## - -if [ "${1}" = '-n' ]; then - # dry-run - print_crontab - exit 0 -fi - -# replace crontab, start crond -print_crontab | crontab - -crond -fl 8 -exit 0