Menu

[r10367]: / legacy / etc / rc.d / cron  Maximize  Restore  History

Download this file

317 lines (273 with data), 9.7 kB

#!/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"
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.