diff --git a/run.sh b/run.sh index d3a0a03..8a4c28c 100755 --- a/run.sh +++ b/run.sh @@ -4,10 +4,12 @@ # 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}'" @@ -22,91 +24,122 @@ fi # FUNCTIONS # ############# -trim_options() { - # if args are given, trim whitespace, then add a space in front - if [ -n "${1}" ]; then - echo " $( echo "${1}" | xargs )" +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() { - task="${1}" + pc_task="${1}" shift 1 + # if environment should be changed, call with "env" if [ -n "${env_changes}" ]; then - # should change environment - cmdline="${env_exe} ${env_changes} " + pc_cmdline="${env_exe} ${env_changes} " else - cmdline="" + pc_cmdline="" fi - cmdline="${cmdline}${ionice_exe} -c 3 ${duplicity_exe} ${encrypt_opts}" + pc_cmdline="${pc_cmdline}${ionice_exe} -c 3 ${duplicity_exe} ${encrypt_opts}" - case "${task}" in + case "${pc_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" + 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) - cmdline="${cmdline} cleanup --force" - cmdline="${cmdline}$( trim_options "${OPTIONS_CLEAN}" )" + pc_cmdline="${pc_cmdline} cleanup --force" + pc_cmdline="$( append_options "${pc_cmdline}" "${OPTIONS_CLEAN}" )" ;; rmfull) - cmdline="${cmdline} remove-older-than '${BACKUP_RETENTION_TIME}' --force" - cmdline="${cmdline}$( trim_options "${OPTIONS_RMFULL}" )" + pc_cmdline="${pc_cmdline} remove-older-than ${BACKUP_RETENTION_TIME} --force" + pc_cmdline="$( append_options "${pc_cmdline}" "${OPTIONS_RMFULL}" )" ;; rmincr) - cmdline="${cmdline} remove-all-inc-of-but-n-full '${KEEP_NUM_FULL_CHAINS}' --force" - cmdline="${cmdline}$( trim_options "${OPTIONS_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 - cmdline="${cmdline} '${BACKUP_TARGET}'" - echo "${cmdline}" + pc_cmdline="${pc_cmdline} ${BACKUP_TARGET}" + echo "${pc_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}" + 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' "${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 '_' ' ' + 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 '#' - 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 )" )" + + # 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 [ "${1}" = '-n' ]; then - # dry-run - print_crontab - exit 0 + +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 -# replace crontab, start crond -print_crontab | crontab - -crond -fl 8 -exit 0 +exit 0 \ No newline at end of file