On Wed, Jan 12, 2011 at 11:09 PM, Seth Vidal <[email protected]>wrote:
> - add patch from Marko Myllynen <[email protected]> to make the random > wait behave a bit better > - update spec file for correct deps > --- > etc/0yum.cron | 141 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > etc/Makefile | 7 +++ > etc/yum-cron | 102 ++++++++++++++++++++++++++++++++++++ > etc/yum-cron.sysconf | 58 ++++++++++++++++++++ > etc/yum-daily.yum | 3 + > etc/yum-weekly.yum | 4 ++ > yum.spec | 84 +++++++++++++++++++++++++++++- > 7 files changed, 396 insertions(+), 3 deletions(-) > create mode 100755 etc/0yum.cron > create mode 100755 etc/yum-cron > create mode 100644 etc/yum-cron.sysconf > create mode 100644 etc/yum-daily.yum > create mode 100644 etc/yum-weekly.yum > > diff --git a/etc/0yum.cron b/etc/0yum.cron > new file mode 100755 > index 0000000..0cfaa4b > --- /dev/null > +++ b/etc/0yum.cron > @@ -0,0 +1,141 @@ > +#!/bin/bash > + > +# Only run if this flag file is set (by /etc/rc.d/init.d/yum-cron) > +if [ ! -f /var/lock/subsys/yum-cron ]; then > + exit 0 > +fi > + > +DAILYSCRIPT=/etc/yum/yum-daily.yum > +WEEKLYSCRIPT=/etc/yum/yum-weekly.yum > +LOCKDIR=/var/lock/yum-cron.lock > +LOCKFILE=$LOCKDIR/pidfile > +TSLOCK=$LOCKDIR/ts.lock > + > +# Grab config settings > +if [ -f /etc/sysconfig/yum-cron ]; then > + source /etc/sysconfig/yum-cron > +fi > +# set default for SYSTEMNAME > +[ -z "$SYSTEMNAME" ] && SYSTEMNAME=$(hostname) > + > +# Only run on certain days of the week > +dow=`date +%w` > +DAYS_OF_WEEK=${DAYS_OF_WEEK:-0123456} > +if [ "${DAYS_OF_WEEK/$dow/}" == "${DAYS_OF_WEEK}" ]; then > + exit 0 > +fi > + > +# if DOWNLOAD_ONLY is set then we force CHECK_ONLY too. > +# Gotta check before one can download! > +if [ "$DOWNLOAD_ONLY" == "yes" ]; then > + CHECK_ONLY=yes > +fi > + > +YUMTMP=$(mktemp /var/run/yum-cron.XXXXXX) > +touch $YUMTMP > +[ -x /sbin/restorecon ] && /sbin/restorecon $YUMTMP > + > +# Random wait function > +random_wait() { > + sleep $(( $RANDOM % ($RANDOMWAIT * 60) + 1 )) > +} > + > +# Note - the lockfile code doesn't try and use YUMTMP to email messages > nicely. > +# Too many ways to die, this gets handled by normal cron error mailing. > +# Try mkdir for the lockfile, will test for and make it in one atomic > action > +if mkdir $LOCKDIR 2>/dev/null; then > + # store the current process ID in there so we can check for staleness > later > + echo "$$" >"${LOCKFILE}" > + # and clean up locks and tempfile if the script exits or is killed > + trap "{ rm -f $LOCKFILE $TSLOCK; rmdir $LOCKDIR 2>/dev/null; rm -f > $YUMTMP; exit 255; }" INT TERM EXIT > +else > + # lock failed, check if process exists. First, if there's no PID file > + # in the lock directory, something bad has happened, we can't know the > + # process name, so clean up the old lockdir and restart > + if [ ! -f $LOCKFILE ]; then > + rmdir $LOCKDIR 2>/dev/null > + echo "yum-cron: no lock PID, clearing and restarting myself" >&2 > + exec $0 "$@" > + fi > + OTHERPID="$(cat "${LOCKFILE}")" > + # if cat wasn't able to read the file anymore, another instance probably > is > + # about to remove the lock -- exit, we're *still* locked > + if [ $? != 0 ]; then > + echo "yum-cron: lock failed, PID ${OTHERPID} is active" >&2 > + exit 0 > + fi > + if ! kill -0 $OTHERPID &>/dev/null; then > + # lock is stale, remove it and restart > + echo "yum-cron: removing stale lock of nonexistant PID ${OTHERPID}" > >&2 > + rm -rf "${LOCKDIR}" > + echo "yum-cron: restarting myself" >&2 > + exec $0 "$@" > + else > + # Remove stale (more than a day old) lockfiles > + find $LOCKDIR -type f -name 'pidfile' -amin +1440 -exec rm -rf > $LOCKDIR \; > + # if it's still there, it wasn't too old, bail > + if [ -f $LOCKFILE ]; then > + # lock is valid and OTHERPID is active - exit, we're locked! > + echo "yum-cron: lock failed, PID ${OTHERPID} is active" >&2 > + exit 0 > + else > + # lock was invalid, restart > + echo "yum-cron: removing stale lock belonging to stale PID > ${OTHERPID}" >&2 > + echo "yum-cron: restarting myself" >&2 > + exec $0 "$@" > + fi > + fi > +fi > + > +# Then check for updates and/or do them, as configured > +{ > + # First, if this is CLEANDAY, do so > + CLEANDAY=${CLEANDAY:-0} > + if [ ! "${CLEANDAY/$dow/}" == "${CLEANDAY}" ]; then > + /usr/bin/yum $YUM_PARAMETER -e ${ERROR_LEVEL:-0} -d > ${DEBUG_LEVEL:-0} -y shell $WEEKLYSCRIPT > + fi > + > + # Now continue to do the real work > + if [ "$CHECK_ONLY" == "yes" ]; then > + random_wait > + touch $TSLOCK > + /usr/bin/yum $YUM_PARAMETER -e 0 -d 0 -y check-update 1> /dev/null > 2>&1 > + case $? in > + 1) exit 1;; > + 100) echo "New updates available for host `/bin/hostname`"; > + /usr/bin/yum $YUM_PARAMETER -e ${ERROR_LEVEL:-0} -d > ${DEBUG_LEVEL:-0} -y -C check-update > + if [ "$DOWNLOAD_ONLY" == "yes" ]; then > + /usr/bin/yum $YUM_PARAMETER -e ${ERROR_LEVEL:-0} -d > ${DEBUG_LEVEL:-0} -y --downloadonly update > + echo "Updates downloaded, use \"yum -C update\" manually to > install them." > + fi > + ;; > + esac > + elif [ "$CHECK_FIRST" == "yes" ]; then > + # Don't run if we can't access the repos > + random_wait > + touch $TSLOCK > + /usr/bin/yum $YUM_PARAMETER -e 0 -d 0 check-update 2>&- > + case $? in > + 1) exit 1;; > + 100) /usr/bin/yum $YUM_PARAMETER -e ${ERROR_LEVEL:-0} -d > ${DEBUG_LEVEL:-0} -y update yum > + /usr/bin/yum $YUM_PARAMETER -e ${ERROR_LEVEL:-0} -d > ${DEBUG_LEVEL:-0} -y shell $DAILYSCRIPT > + ;; > + esac > + else > + random_wait > + touch $TSLOCK > + /usr/bin/yum $YUM_PARAMETER -e ${ERROR_LEVEL:-0} -d ${DEBUG_LEVEL:-0} > -y update yum > + /usr/bin/yum $YUM_PARAMETER -e ${ERROR_LEVEL:-0} -d ${DEBUG_LEVEL:-0} > -y shell $DAILYSCRIPT > + fi > +} >> $YUMTMP 2>&1 > + > +if [ ! -z "$MAILTO" ] && [ -x /bin/mail ]; then > +# if MAILTO is set, use mail command (ie better than standard mail with > cron output) > + [ -s "$YUMTMP" ] && mail -s "System update: $SYSTEMNAME" $MAILTO < > $YUMTMP > +else > +# default behavior is to use cron's internal mailing of output from > cron-script > + cat $YUMTMP > +fi > +rm -f $YUMTMP > + > +exit 0 > diff --git a/etc/Makefile b/etc/Makefile > index a512cdf..29a7f95 100644 > --- a/etc/Makefile > +++ b/etc/Makefile > @@ -29,3 +29,10 @@ install: > > mkdir -p $(DESTDIR)/etc/bash_completion.d > install -m 644 yum.bash $(DESTDIR)/etc/bash_completion.d > + mkdir -p $(DESTDIR)/etc/cron.daily > + mkdir -p $(DESTDIR)/etc/sysconfig/ > + install -D -m 755 0yum.cron $(DESTDIR)/etc/cron.daily/0yum.cron > + install -D -m 755 yum-cron $(DESTDIR)/etc/rc.d/init.d/yum-cron > + install -D -m 644 yum-daily.yum $(YUMETC)/yum-daily.yum > + install -D -m 644 yum-weekly.yum $(YUMETC)/yum-weekly.yum > + install -D -m 644 yum-cron.sysconf > $(DESTDIR)/etc/sysconfig/yum-cron > diff --git a/etc/yum-cron b/etc/yum-cron > new file mode 100755 > index 0000000..63c5ec0 > --- /dev/null > +++ b/etc/yum-cron > @@ -0,0 +1,102 @@ > +#!/bin/bash > +# > +# yum-cron This shell script enables the automatic use of YUM > +# > +# Author: Seth Vidal <[email protected]> > +# > +# chkconfig: - 50 01 > +# > +# description: Enable daily run of yum, a program updater. > +# processname: yum-cron > +# config: /etc/yum/yum-daily.yum > +# > + > +# source function library > +. /etc/rc.d/init.d/functions > + > +test -f /etc/sysconfig/yum-cron && . /etc/sysconfig/yum-cron > + > +lockfile=/var/lock/subsys/yum-cron > +tslock=/var/lock/yum-cron.lock/ts.lock > +yumcronpid=/var/lock/yum-cron.lock/pidfile > + > +RETVAL=0 > + > +start() { > + echo -n $"Enabling nightly yum update: " > + touch "$lockfile" && success || failure > + RETVAL=$? > + echo > +} > + > +stop() { > + echo -n $"Disabling nightly yum update: " > + if [ -f "$yumcronpid" -a "$SERVICE_WAITS" = "yes" ]; then > + yum_done=0 > + if [ ! -f $tslock ]; then > + # No transaction yet in progress, just kill it > + kill `cat $yumcronpid > /dev/null 2>&1` > /dev/null 2>&1 > + yum_done=1 > + fi > + if [ $yum_done -eq 0 ]; then > + echo -n $"Waiting for yum " > + if [ -z "$SERVICE_WAIT_TIME" ]; then > + SERVICE_WAIT_TIME=300 > + fi > + start=`date +%s` > + end=`expr $start + $SERVICE_WAIT_TIME` > + while [ `date +%s` -le $end ] > + do > + sleep 5 > + if [ ! -f "$tslock" ]; then > + yum_done=1 > + break > + fi > + done > + if [ $yum_done -eq 1 ]; then > + echo -n " ok " > + else > + echo -n " failed " > + fi > + fi > + fi > + rm -f "$lockfile" && success || failure > + RETVAL=$? > + echo > +} > + > +restart() { > + stop > + start > +} > + > +case "$1" in > + start) > + start > + ;; > + stop) > + stop > + ;; > + restart|force-reload) > + restart > + ;; > + reload) > + ;; > + condrestart) > + [ -f "$lockfile" ] && restart > + ;; > + status) > + if [ -f $lockfile ]; then > + echo $"Nightly yum update is enabled." > + RETVAL=0 > + else > + echo $"Nightly yum update is disabled." > + RETVAL=3 > + fi > + ;; > + *) > + echo $"Usage: $0 > {start|stop|status|restart|reload|force-reload|condrestart}" > + exit 1 > +esac > + > +exit $RETVAL > diff --git a/etc/yum-cron.sysconf b/etc/yum-cron.sysconf > new file mode 100644 > index 0000000..930341c > --- /dev/null > +++ b/etc/yum-cron.sysconf > @@ -0,0 +1,58 @@ > +# Pass any given paramter to yum, as run in all the scripts invoked > +# by this package. Be aware that this is global, and yum is invoked in > +# several modes by these scripts for which your own parameter might not > +# be appropriate > +YUM_PARAMETER= > + > +# Don't install, just check (valid: yes|no) > +CHECK_ONLY=no > + > +# Check to see if you can reach the repos before updating (valid: yes|no) > +CHECK_FIRST=no > + > +# Don't install, just check and download (valid: yes|no) > +# Implies CHECK_ONLY=yes (gotta check first to see what to download) > +DOWNLOAD_ONLY=no > + > +# Error level, practical range 0-10, 0 means print only critical errors > which > +# you must be told, 1 means print all errors, even ones that are not > important > +# Level 0 is the default > +# ERROR_LEVEL=0 > + > +# Debug level, practical range 0-10, higher number means more output > +# Level 1 is a useful level if you want to see what's been done and > +# don't want to read /var/log/yum.log > +# Level 0 is the default > +# DEBUG_LEVEL=1 > + > +# randomwait is used by yum to wait random time > +# default is 60 so yum waits random time from 1 to 60 minutes > +# the value must not be zero > +RANDOMWAIT="60" > + > +# if MAILTO is set and the mail command is available, the mail command > +# is used to deliver yum output > + > +# by default MAILTO is unset, so crond mails the output by itself > +# example: MAILTO=root > +MAILTO= > + > +# you may set SYSTEMNAME if you want your yum emails tagged differently > +# default is output of hostname command > +# this variable is used only if MAILTO is set too > +#SYSTEMNAME="" > + > +# you may set DAYS_OF_WEEK to the days of the week you want to run > +# default is every day > +#DAYS_OF_WEEK="0123456" > + > +# which day should it do cleanup on? defaults to 0 (Sunday). If this day > isn't in the > +# DAYS_OF_WEEK above, it'll never happen > +CLEANDAY="0" > + > +# set to yes to make the yum-cron service to wait for transactions to > complete > +SERVICE_WAITS=yes > + > +# set maximum time period (in seconds) for the yum-cron service to wait > for > +# transactions to complete. The default is 300 seconds (5 minutes) > +SERVICE_WAIT_TIME=300 > diff --git a/etc/yum-daily.yum b/etc/yum-daily.yum > new file mode 100644 > index 0000000..5d4e874 > --- /dev/null > +++ b/etc/yum-daily.yum > @@ -0,0 +1,3 @@ > +update > +ts run > +exit > diff --git a/etc/yum-weekly.yum b/etc/yum-weekly.yum > new file mode 100644 > index 0000000..c60fa08 > --- /dev/null > +++ b/etc/yum-weekly.yum > @@ -0,0 +1,4 @@ > +clean packages > +clean expire-cache > +ts run > +exit > diff --git a/yum.spec b/yum.spec > index 4d2ad2f..1f8b3ee 100644 > --- a/yum.spec > +++ b/yum.spec > @@ -19,7 +19,6 @@ Requires: urlgrabber >= 3.9.2 > Requires: yum-metadata-parser >= 1.1.0 > Requires: python-iniparse > Requires: pygpgme > -Prereq: /sbin/chkconfig, /sbin/service, coreutils > Conflicts: rpm >= 5-0 > # Zif is a re-implementation of yum in C, however: > # > @@ -59,13 +58,31 @@ Group: Applications/System > Requires: yum = %{version}-%{release} > Requires: dbus-python > Requires: pygobject2 > -Prereq: /sbin/chkconfig > -Prereq: /sbin/service > +Requires(preun): /sbin/chkconfig > +Requires(preun): /sbin/service > +Requires(postun): /sbin/chkconfig > +Requires(postun): /sbin/service > + > > %description updatesd > yum-updatesd provides a daemon which checks for available updates and > can notify you when they are available via email, syslog or dbus. > > + > +%package cron > +Summary: Files needed to run yum updates as a cron job > +Group: System Environment/Base > +Requires: yum >= 3.0 vixie-cron crontabs yum-downloadonly findutils > +Requires(post): /sbin/chkconfig > +Requires(post): /sbin/service > +Requires(preun): /sbin/chkconfig > +Requires(preun): /sbin/service > +Requires(postun): /sbin/service > + > +%description cron > +These are the files needed to run yum updates as a cron job. > +Install this package if you want auto yum updates nightly via cron. > + > %prep > %setup -q > > @@ -103,6 +120,50 @@ if [ $1 = 0 ]; then > fi > exit 0 > > + > +%post cron > +# Make sure chkconfig knows about the service > +/sbin/chkconfig --add yum-cron > +# if an upgrade: > +if [ "$1" -ge "1" ]; then > +# if there's a /etc/rc.d/init.d/yum file left, assume that there was an > +# older instance of yum-cron which used this naming convention. Clean > +# it up, do a conditional restart > + if [ -f /etc/init.d/yum ]; then > +# was it on? > + /sbin/chkconfig yum > + RETVAL=$? > + if [ $RETVAL = 0 ]; then > +# if it was, stop it, then turn on new yum-cron > + /sbin/service yum stop 1> /dev/null 2>&1 > + /sbin/service yum-cron start 1> /dev/null 2>&1 > + /sbin/chkconfig yum-cron on > + fi > +# remove it from the service list > + /sbin/chkconfig --del yum > + fi > +fi > +exit 0 > + > +%preun cron > +# if this will be a complete removeal of yum-cron rather than an upgrade, > +# remove the service from chkconfig control > +if [ $1 = 0 ]; then > + /sbin/chkconfig --del yum-cron > + /sbin/service yum-cron stop 1> /dev/null 2>&1 > +fi > +exit 0 > + > +%postun cron > +# If there's a yum-cron package left after uninstalling one, do a > +# conditional restart of the service > +if [ "$1" -ge "1" ]; then > + /sbin/service yum-cron condrestart 1> /dev/null 2>&1 > +fi > +exit 0 > + > + > + > %files -f %{name}.lang > %defattr(-, root, root) > %doc README AUTHORS COPYING TODO INSTALL ChangeLog PLUGINS > @@ -128,6 +189,19 @@ exit 0 > %{_mandir}/man*/yum.* > %{_mandir}/man*/yum-shell* > > + > +%files cron > +%defattr(-,root,root) > +%doc COPYING > +%{_sysconfdir}/cron.daily/0yum.cron > +%{_sysconfdir}/yum/yum-daily.yum > +%{_sysconfdir}/yum/yum-weekly.yum > +%{_sysconfdir}/rc.d/init.d/yum-cron > +%config(noreplace) %{_sysconfdir}/sysconfig/yum-cron > + > + > + > + > %files updatesd > %defattr(-, root, root) > %config(noreplace) %{_sysconfdir}/yum/yum-updatesd.conf > @@ -138,6 +212,10 @@ exit 0 > %{_mandir}/man*/yum-updatesd* > > %changelog > +* Wed Jan 12 2011 Seth Vidal <skvidal at fedoraproject.org> > +- put yum-cron back into yum and make the subpkg. Thanks To Alec Habig for > + maintaining this so well for so long. > + > * Fri Jul 30 2010 Seth Vidal <skvidal at fedoraproject.org> > - 3.2.28 > > -- > 1.7.2.3 > > _______________________________________________ > Yum-devel mailing list > [email protected] > http://lists.baseurl.org/mailman/listinfo/yum-devel ACK
_______________________________________________ Yum-devel mailing list [email protected] http://lists.baseurl.org/mailman/listinfo/yum-devel
