FreeNAS Code
This project has moved to github - see https://github.com/freenas
Brought to you by:
cochard,
mattolander
#!/bin/sh # # $FreeBSD: src/etc/rc.d/cron,v 1.7.10.1.4.1 2009/04/15 03:14:26 kensmith Exp $ # # Modified by Volker Theile (votdev@gmx.de) # # PROVIDE: cron # REQUIRE: LOGIN cleanvar # BEFORE: securelevel # KEYWORD: shutdown . /etc/rc.subr . /etc/configxml.subr name="cron" rcvar="`set_rcvar`" load_rc_config "$name" # Defaults command="/usr/sbin/${name}" pidfile="/var/run/${name}.pid" cron_config=${cron_config:-"/etc/crontab"} cron_tabspath=${cron_tabspath:-"/var/cron/tabs"} cron_allow=${cron_allow:-"/var/cron/allow"} # Custom commands start_precmd="cron_mkconf" mkconf_cmd="cron_mkconf" extra_commands="mkconf" # crontab_allowuser [user] # Register user to allow them to execute cron jobs. crontab_allowuser() { local _user _user=$1 if [ "${_user}" != "root" ]; then echo "${_user}" >> ${cron_allow} # Remove duplicate entries in /var/cron/allow /usr/bin/sort -u ${cron_allow} -o ${cron_allow} fi } # crontab_addline [user] [data] # Write a job to the corresponding crontab. crontab_addline() { local _user _data _user=$1 _data=$2 if [ "${_user}" = "root" ]; then echo "${_data}" >> ${cron_config} else # Create user crontab if necessary if [ ! -e "${cron_tabspath}/${_user}" ]; then # Create /var/cron/tabs/xxx echo "SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log # #minute hour mday month wday who command #" > ${cron_tabspath}/${_user} fi # Write crontab line echo "${_data}" >> ${cron_tabspath}/${_user} fi } cron_mkconf() { local _index _user _data # Make sure /var/cron/tabs path exists [ ! -d "${cron_tabspath}" ] && mkdir "${cron_tabspath}" # Empty /var/cron/allow cat /dev/null > ${cron_allow} # Remove all existing user crontabs rm ${cron_tabspath}/* > /dev/null 2>&1 # Create /etc/crontab echo "SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log # #minute hour mday month wday who command #" > ${cron_config} # Time synchronization if [ 0 -lt `configxml_get_count "//system/ntp/enable"` ]; then _interval=`configxml_get "//system/ntp/updateinterval"` _mins=$(expr ${_interval} % 60) _hours=$(expr ${_interval} / 60) if [ "0" -ne "${_mins}" ]; then _mins="*/${_mins}" fi if [ "0" -eq "${_hours}" ]; then _hours="*" else _hours="*/${_hours}" fi echo "# Perform time synchronization via NTP." >> ${cron_config} echo "${_mins} ${_hours} * * * root /etc/rc.d/ntpdate restart" >> ${cron_config} fi # Auto Snapshot if [ 0 -lt `configxml_get_count "//zfs/autosnapshots"` ]; then echo "# autosnapshot" >> ${cron_config} echo "0 */1 * * * root /usr/local/sbin/autosnapshot >/dev/null 2>&1" >> ${cron_config} fi # RSYNC client _index=`configxml_get_count "//rsync/rsyncclient[enable]"` if [ 0 -lt ${_index} ]; then while [ ${_index} -gt 0 ] do # Get user _user=`configxml_get "//rsync/rsyncclient[enable][position()=${_index}]/who"` # Get the crontab data _data=`/usr/local/bin/xml sel -t -m "//rsync/rsyncclient[enable][position()=${_index}]" \ -i "all_mins[. = "0"]" -m minute -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_mins[. != "0"]" -o "*" -b \ -o " " \ -i "all_hours[. = "0"]" -m hour -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_hours[. != "0"]" -o "*" -b \ -o " " \ -i "all_days[. = "0"]" -m day -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_days[. != "0"]" -o "*" -b \ -o " " \ -i "all_months[. = "0"]" -m month -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_months[. != "0"]" -o "*" -b \ -o " " \ -i "all_weekdays[. = "0"]" -m weekday -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_weekdays[. != "0"]" -o "*" -b \ -o " " \ -i "who[. = 'root']" -v "concat(who,' ')" -b \ -v "concat('/var/run/rsync_client_',uuid,'.sh')" \ ${configxml_file} | /usr/local/bin/xml unesc` # Register user crontab_allowuser "${_user}" # Write the crontab data crontab_addline "${_user}" "${_data}" _index=$(( ${_index} - 1 )) done fi # RSYNC local _index=`configxml_get_count "//rsync/rsynclocal[enable]"` if [ 0 -lt ${_index} ]; then while [ ${_index} -gt 0 ] do # Get user _user=`configxml_get "//rsync/rsynclocal[enable][position()=${_index}]/who"` # Get the crontab data _data=`/usr/local/bin/xml sel -t -m "//rsync/rsynclocal[enable][position()=${_index}]" \ -i "all_mins[. = "0"]" -m minute -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_mins[. != "0"]" -o "*" -b \ -o " " \ -i "all_hours[. = "0"]" -m hour -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_hours[. != "0"]" -o "*" -b \ -o " " \ -i "all_days[. = "0"]" -m day -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_days[. != "0"]" -o "*" -b \ -o " " \ -i "all_months[. = "0"]" -m month -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_months[. != "0"]" -o "*" -b \ -o " " \ -i "all_weekdays[. = "0"]" -m weekday -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_weekdays[. != "0"]" -o "*" -b \ -o " " \ -i "who[. = 'root']" -v "concat(who,' ')" -b \ -v "concat('/var/run/rsync_local_',uuid,'.sh')" \ ${configxml_file} | /usr/local/bin/xml unesc` # Register user crontab_allowuser "${_user}" # Write the crontab data crontab_addline "${_user}" "${_data}" _index=$(( ${_index} - 1 )) done fi # Scheduled shutdown if [ 0 -lt `configxml_get_count "//shutdown/enable"` ]; then echo "# Perform scheduled shutdown." >> ${cron_config} /usr/local/bin/xml sel -t -m "//shutdown" \ -i "all_mins[. = "0"]" -m minute -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_mins[. != "0"]" -o "*" -b \ -o " " \ -i "all_hours[. = "0"]" -m hour -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_hours[. != "0"]" -o "*" -b \ -o " " \ -i "all_days[. = "0"]" -m day -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_days[. != "0"]" -o "*" -b \ -o " " \ -i "all_months[. = "0"]" -m month -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_months[. != "0"]" -o "*" -b \ -o " " \ -i "all_weekdays[. = "0"]" -m weekday -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_weekdays[. != "0"]" -o "*" -b \ -o " " \ -o "root /sbin/shutdown -p now" \ ${configxml_file} | /usr/local/bin/xml unesc >> ${cron_config} fi # Scheduled reboot if [ 0 -lt `configxml_get_count "//reboot/enable"` ]; then echo "# Perform scheduled reboot." >> ${cron_config} /usr/local/bin/xml sel -t -m "//reboot" \ -i "all_mins[. = "0"]" -m minute -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_mins[. != "0"]" -o "*" -b \ -o " " \ -i "all_hours[. = "0"]" -m hour -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_hours[. != "0"]" -o "*" -b \ -o " " \ -i "all_days[. = "0"]" -m day -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_days[. != "0"]" -o "*" -b \ -o " " \ -i "all_months[. = "0"]" -m month -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_months[. != "0"]" -o "*" -b \ -o " " \ -i "all_weekdays[. = "0"]" -m weekday -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_weekdays[. != "0"]" -o "*" -b \ -o " " \ -o "root /sbin/shutdown -r now" \ ${configxml_file} | /usr/local/bin/xml unesc >> ${cron_config} fi # Email status notification if [ 0 -lt `configxml_get_count "//statusreport/enable"` ]; then echo "# Perform email status report." >> ${cron_config} /usr/local/bin/xml sel -t -m "//statusreport" \ -i "all_mins[. = "0"]" -m minute -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_mins[. != "0"]" -o "*" -b \ -o " " \ -i "all_hours[. = "0"]" -m hour -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_hours[. != "0"]" -o "*" -b \ -o " " \ -i "all_days[. = "0"]" -m day -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_days[. != "0"]" -o "*" -b \ -o " " \ -i "all_months[. = "0"]" -m month -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_months[. != "0"]" -o "*" -b \ -o " " \ -i "all_weekdays[. = "0"]" -m weekday -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_weekdays[. != "0"]" -o "*" -b \ -o " " \ -o "root /etc/mail/sendreport" \ ${configxml_file} | /usr/local/bin/xml unesc >> ${cron_config} fi # Additional cron jobs _index=`configxml_get_count "//cron/job[enable]"` if [ 0 -lt ${_index} ]; then while [ ${_index} -gt 0 ] do # Get user _user=`configxml_get "//cron/job[enable][position()=${_index}]/who"` # Get the crontab data _data=`/usr/local/bin/xml sel -t -m "//cron/job[enable][position()=${_index}]" \ -i "all_mins[. = "0"]" -m minute -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_mins[. != "0"]" -o "*" -b \ -o " " \ -i "all_hours[. = "0"]" -m hour -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_hours[. != "0"]" -o "*" -b \ -o " " \ -i "all_days[. = "0"]" -m day -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_days[. != "0"]" -o "*" -b \ -o " " \ -i "all_months[. = "0"]" -m month -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_months[. != "0"]" -o "*" -b \ -o " " \ -i "all_weekdays[. = "0"]" -m weekday -i "position() > 1" -o "," -b -v "." -b -b \ -i "all_weekdays[. != "0"]" -o "*" -b \ -o " " \ -i "who[. = 'root']" -v "concat(who,' ')" -b \ -v command -n \ ${configxml_file} | /usr/local/bin/xml unesc` # Register user crontab_allowuser "${_user}" # Write the crontab data crontab_addline "${_user}" "${_data}" _index=$(( ${_index} - 1 )) done fi } load_rc_config $name if checkyesno cron_dst then cron_flags="$cron_flags -s" fi run_rc_command "$1"