#!/bin/bash do { #//////////////////////////////////// # DietPi-Cron: # #//////////////////////////////////// # Created by Daniel Knight / daniel.knight@dietpi.com / dietpi.com # #//////////////////////////////////// # # Info: # - Menu system that allows users to change the start dates/times for all cron jobs. # # Usage: # - /DietPi/dietpi/dietpi-cron #//////////////////////////////////// #Import DietPi-Globals --------------------------------------------------------------- source /DietPi/dietpi/func/dietpi-globals G_CHECK_ROOT_USER export G_PROGRAM_NAME='DietPi-Cron' #Import DietPi-Globals --------------------------------------------------------------- #///////////////////////////////////////////////////////////////////////////////////// #Globals #///////////////////////////////////////////////////////////////////////////////////// setglobal PROGRAM_NAME = '"DietPi-Cron'" setglobal TARGETMENUID = '0' setglobal PREVIOUS_MENU_SELECTION = '"cron.hourly'" setglobal OPTION = '0' setglobal CHOICE = '0' setglobal aCRON_TIME = ''() setglobal aDAY_OF_THE_WEEK_TEXT = '( '"Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday" ) proc Read_Cron_Times{ #hourly_min aCRON_TIME[0]=$[cat /etc/crontab | grep -m1 'cron.hourly' | awk '{print $1}] #daily_min / daily_hour aCRON_TIME[1]=$[cat /etc/crontab | grep -m1 'cron.daily' | awk '{print $1}] aCRON_TIME[2]=$[cat /etc/crontab | grep -m1 'cron.daily' | awk '{print $2}] #weekly_min / weekly_hour / weekly_day_of_week aCRON_TIME[3]=$[cat /etc/crontab | grep -m1 'cron.weekly' | awk '{print $1}] aCRON_TIME[4]=$[cat /etc/crontab | grep -m1 'cron.weekly' | awk '{print $2}] aCRON_TIME[5]=$[cat /etc/crontab | grep -m1 'cron.weekly' | awk '{print $5}] #monthly_min / monthly_hour / monthly_day_of_month aCRON_TIME[6]=$[cat /etc/crontab | grep -m1 'cron.monthly' | awk '{print $1}] aCRON_TIME[7]=$[cat /etc/crontab | grep -m1 'cron.monthly' | awk '{print $2}] aCRON_TIME[8]=$[cat /etc/crontab | grep -m1 'cron.monthly' | awk '{print $3}] #Check for valid ints for ((i=0; i<${#aCRON_TIME[@]}; i++)) do if [[ ${aCRON_TIME[$i]} =~ ^-?[0-9]+$ ]]; then echo "valid" &> /dev/null else #override aCRON_TIME[$i]=1 fi done } proc Write_Cron_Times{ cat << """ > /etc/crontab #Please use dietpi-cron to change cron start times SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command $(aCRON_TIME[0]) * * * * root cd / && run-parts --report /etc/cron.hourly $(aCRON_TIME[1]) $(aCRON_TIME[2]) * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) $(aCRON_TIME[3]) $(aCRON_TIME[4]) * * $(aCRON_TIME[5]) root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) $(aCRON_TIME[6]) $(aCRON_TIME[7]) $(aCRON_TIME[8]) * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) """ > /etc/crontab #Please use dietpi-cron to change cron start times SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command ${aCRON_TIME[0]} * * * * root cd / && run-parts --report /etc/cron.hourly ${aCRON_TIME[1]} ${aCRON_TIME[2]} * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) ${aCRON_TIME[3]} ${aCRON_TIME[4]} * * ${aCRON_TIME[5]} root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) ${aCRON_TIME[6]} ${aCRON_TIME[7]} ${aCRON_TIME[8]} * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) _EOF_ } proc Input_Cron_Minute{ var input_value = $1 var min_value = '0' var max_value = '59' setglobal OPTION = $[whiptail --inputbox "Please enter a value for MINUTE:\n - Valid range ($min_value - $max_value)" 9 50 $input_value --title "Set Minute" !3 > !1 !1 > !2 !2 > !3] setglobal CHOICE = $Status if sh-expr ' $CHOICE == 0 ' { #Valid input? if [[ $OPTION =~ ^-?[0-9]+$ ]] && sh-expr ' $OPTION >= $min_value ' && sh-expr ' $OPTION <= $max_value ' { set input_value = $OPTION } else { Info_Input_Not_Valid_Integer } } return $input_value } proc Input_Cron_Hour{ var input_value = $1 var min_value = '0' var max_value = '23' setglobal OPTION = $[whiptail --inputbox "Please enter a value for HOUR (24h):\n - Valid range ($min_value - $max_value)" 9 50 $input_value --title "Set Hour" !3 > !1 !1 > !2 !2 > !3] setglobal CHOICE = $Status if sh-expr ' $CHOICE == 0 ' { #Valid input? if [[ $OPTION =~ ^-?[0-9]+$ ]] && sh-expr ' $OPTION >= $min_value ' && sh-expr ' $OPTION <= $max_value ' { set input_value = $OPTION } else { Info_Input_Not_Valid_Integer } } return $input_value } proc Input_Cron_DayOfWeek{ var input_value = $1 var min_value = '1' var max_value = '7' setglobal OPTION = $[whiptail --title "Day of the Week" --menu "Please select a day of the week." --cancel-button "Cancel" --default-item $input_value 15 45 7 \ "1" $(aDAY_OF_THE_WEEK_TEXT[0]) \ "2" $(aDAY_OF_THE_WEEK_TEXT[1]) \ "3" $(aDAY_OF_THE_WEEK_TEXT[2]) \ "4" $(aDAY_OF_THE_WEEK_TEXT[3]) \ "5" $(aDAY_OF_THE_WEEK_TEXT[4]) \ "6" $(aDAY_OF_THE_WEEK_TEXT[5]) \ "7" $(aDAY_OF_THE_WEEK_TEXT[6]) !3 > !1 !1 > !2 !2 > !3] if sh-expr ' $CHOICE == 0 ' { set input_value = $OPTION } return $input_value } proc Input_Cron_DayOfMonth{ var input_value = $1 var min_value = '1' var max_value = '28' setglobal OPTION = $[whiptail --inputbox "Please enter a value for DAY of the MONTH:\n - Valid range ($min_value - $max_value)\n - eg: 11 = the 11th day of month" 10 50 $input_value --title "Set Day of Month" !3 > !1 !1 > !2 !2 > !3] setglobal CHOICE = $Status if sh-expr ' $CHOICE == 0 ' { #Valid input? if [[ $OPTION =~ ^-?[0-9]+$ ]] && sh-expr ' $OPTION >= $min_value ' && sh-expr ' $OPTION <= $max_value ' { set input_value = $OPTION } else { Info_Input_Not_Valid_Integer } } return $input_value } proc Info_Input_Not_Valid_Integer{ whiptail --title "Invalid Value" --msgbox "$OPTION is an invalid value." --backtitle $WHIP_BACKTITLE 9 60 } proc Menu_Exit{ whiptail --title "Exit $PROGRAM_NAME?" --yesno "Exit $PROGRAM_NAME?" --backtitle $PROGRAM_NAME --yes-button "Ok" --no-button "Back" --defaultno 9 55 setglobal CHOICE = $Status if sh-expr ' $CHOICE == 0 ' { #exit setglobal TARGETMENUID = '-1' } else { #Return to Main Menu setglobal TARGETMENUID = '0' } } proc Menu_Main{ setglobal OPTION = $[whiptail --title $PROGRAM_NAME --menu "This program allows you to change the date and times for starting each cron job.\n\n- Example:\nIf you set cron.daily to 22 hours and 20 minutes, all scripts in /etc/cron.daily/* will be run at 10:20pm" --cancel-button "Exit" --default-item $PREVIOUS_MENU_SELECTION --backtitle $PROGRAM_NAME 18 70 5 \ "cron.hourly" "Every Hour at $(aCRON_TIME[0]) Minutes" \ "cron.daily" "Every Day at $(aCRON_TIME[2]) Hours and $(aCRON_TIME[1]) Minutes" \ "cron.weekly" "Every $(aDAY_OF_THE_WEEK_TEXT[$(( ${aCRON_TIME[5]} - 1))]) at $(aCRON_TIME[4]) Hours and $(aCRON_TIME[3]) Minutes" \ "cron.monthly" "On Day $(aCRON_TIME[8]) of the month at $(aCRON_TIME[7]) Hours and $(aCRON_TIME[6]) Minutes" \ "Apply" "Saves your cron start times and restarts service." !3 > !1 !1 > !2 !2 > !3] setglobal CHOICE = $Status if sh-expr ' $CHOICE == 0 ' { setglobal PREVIOUS_MENU_SELECTION = $OPTION match $OPTION { with "cron.hourly" Input_Cron_Minute $(aCRON_TIME[0]) aCRON_TIME[0]=$Status with "cron.daily" Input_Cron_Hour $(aCRON_TIME[2]) aCRON_TIME[2]=$Status Input_Cron_Minute $(aCRON_TIME[1]) aCRON_TIME[1]=$Status with "cron.weekly" Input_Cron_DayOfWeek $(aCRON_TIME[5]) aCRON_TIME[5]=$Status Input_Cron_Hour $(aCRON_TIME[4]) aCRON_TIME[4]=$Status Input_Cron_Minute $(aCRON_TIME[3]) aCRON_TIME[3]=$Status with "cron.monthly" Input_Cron_DayOfMonth $(aCRON_TIME[8]) aCRON_TIME[8]=$Status Input_Cron_Hour $(aCRON_TIME[7]) aCRON_TIME[7]=$Status Input_Cron_Minute $(aCRON_TIME[6]) aCRON_TIME[6]=$Status with "Apply" Write_Cron_Times #restart service systemctl restart cron #inform user whiptail --title "Completed" --msgbox "Your Cron start times have been saved and applied." 9 60 } } else { #Exit Menu_Exit } } #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// #Get current values Read_Cron_Times #----------------------------------------------------------------------------------- #Start Menu while sh-expr ' $TARGETMENUID > -1 ' { #Clear Screen buffer clear if sh-expr ' $TARGETMENUID == 0 ' { Menu_Main } } #----------------------------------------------------------------------------------- #delete[] unset aDAY_OF_THE_WEEK_TEXT unset aCRON_TIME #----------------------------------------------------------------------------------- exit #----------------------------------------------------------------------------------- }