View previous topic :: View next topic |
Author |
Message |
Rcomian Apprentice
Joined: 10 Jan 2004 Posts: 174 Location: Uk, Northwest
|
Posted: Sat Jun 17, 2006 9:24 pm Post subject: Automatically restarting services after an update |
|
|
Carrying on from this topic.
Using portage's new ability to add hooks into the functionality, we can restart services as part of the normal upgrade process with no additional commands. It's also a far more targetted affair, getting around a few of the problems I was finding in the original thread.
The following script should be saved as your "/etc/portage/bashrc" script. You'll need to merge in the functionality if you already have a bashrc of your own.
Notes:
When a package is being installed which installs a service into /etc/init.d/, this script checks to see if the service is running, and if it is, pauses it, and schedules it for a later restart. Pausing happens just before the files are installed. Restart happens just after. This means that the service is stopped for the minimal time possible, and also works for services which can't be restarted if the package has been reinstalled (eg, Tor).
If you have cfg-update installed, this script will use cfg-update to automatically merge all config files it can before restarting any services.
An optional reverse dependencies lookup will also restart any services which depend on the package being installed. This is currently very slow (it recursively calls equery), so it's not recommended to go above 1 or 2 levels of dependencies.
Code: | pre_pkg_preinst() {
echo "Stopping affected services"
blacklist="/etc/restart-services-blacklist"
tmp_svc_files=`tempfile`
equery f $CATEGORY/$PN | grep /etc/init.d/ > $tmp_svc_files
if [[ -n "$REVDEP_SCRIPT" && -f $REVDEP_SCRIPT ]]; then
echo "Finding services that may depend on " $CATEGORY/$PN
$REVDEP_SCRIPT $REVDEP_DEPTH $CATEGORY/$PN | xargs -n 1 equery f | grep /etc/init.d/ >>$tmp_svc_files
echo "Finished services search"
fi
# Make a default blacklist if one not already there
if [ ! -f $blacklist ]; then
echo /etc/init.d/xdm >> $blacklist
echo /etc/init.d/net >> $blacklist
echo /etc/init.d/local >> $blacklist
fi
tmp_svc_stop=`tempfile`
tmp_svc_start=`tempfile`
tmp_svc_boot=`tempfile`
ls -l /etc/runlevels/boot | sed "s/^\(.*\) -> \(.*\)$/\2/" >$tmp_svc_boot
ls -l /var/lib/init.d/started | grep -f $tmp_svc_files | sed "s/^\(.*\) -> \(.*\)$/\2 pause/" | grep -v -F -f $blacklist | grep -v -F -f $tmp_svc_boot >$tmp_svc_stop
ls -l /var/lib/init.d/started | grep -f $tmp_svc_files | sed "s/^\(.*\) -> \(.*\)$/\2 restart/" | grep -v -F -f $blacklist | grep -v -F -f $tmp_svc_boot >$tmp_svc_start
cat $tmp_svc_stop
bash $tmp_svc_stop
rm -Rf $tmp_svc_files
rm -Rf $tmp_svc_stop
rm -Rf $tmp_svc_boot
export tmp_svc_start
}
post_pkg_postinst() {
if [[ -f /usr/bin/cfg-update ]]; then
/usr/bin/cfg-update -ua
fi
cat $tmp_svc_start
chmod u+x $tmp_svc_start
tmp_svc_log=`tempfile`
bash -c $tmp_svc_start >$tmp_svc_log 2>&1
cat $tmp_svc_log
rm -Rf $tmp_svc_start
rm -Rf $tmp_svc_log
}
|
If you want to enable reverse dependencies (eg, re-installing "readline" will cause a restart in "mysql"), then save this script somewhere:
Code: | #!/bin/bash
#Make sure we haven't gone too deep
depth=`dc -e "$1 1 - p"`
if [[ $depth -lt 0 ]]; then
exit
fi
#Convert the inbound pkgspec to a full but non-versioned spec
pkg=`equery l $2 | grep -v '* installed packages' | sed "s/^\(.*\)-\([0123456789].*\)$/\1/"`
outfile=`tempfile`
if [[ -f /usr/bin/qdepends ]]; then
output=`qdepends -C -Q "$2" 2>/dev/null | sed "s/^\(.*\)-\([0123456789].*\)$/\1/"`
else
output=`equery d $pkg | sed "s/^\(.*\)-\([0123456789].*\)$/\1/"`
fi
if [[ "$output" != "" && "$output" != "$pkg" ]]; then
echo $output | xargs -n 1 echo >>$outfile
echo $output | xargs -n 1 $0 $depth >>$outfile
fi
sort -u $outfile
rm -Rf $outfile
|
Then add the following lines to your/etc/make.conf
Code: | REVDEP_SCRIPT="/root/revdep" #Path to your revdep script
REVDEP_DEPTH=1 # Number of levels deep. 1 means immediate dependencies. This gets very slow very quickly
|
Enjoy!
Update
The revdep script now uses the faster qdepends if it's available. Install portage-utils to get hold of that. Many thanks to synss for pointing that out.
Last edited by Rcomian on Tue Jun 20, 2006 9:05 pm; edited 1 time in total |
|
Back to top |
|
|
mudrii l33t
Joined: 26 Jun 2003 Posts: 789 Location: Singapore
|
Posted: Tue Jun 20, 2006 2:12 pm Post subject: |
|
|
Nice work
How about the dispach-config when new version is installed with modified config file ? _________________ www.gentoo.ro |
|
Back to top |
|
|
Rcomian Apprentice
Joined: 10 Jan 2004 Posts: 174 Location: Uk, Northwest
|
Posted: Tue Jun 20, 2006 8:11 pm Post subject: |
|
|
Thanks mudrii,
I didn't do a dispatch-conf option since it's interactive, and that means the user will have to be present during the entire ebuild - if you're updating hundreds of packages (as I have just done on the house server) then that a big chore (even bigger than sorting out all the packages that don't build).
For this reason I'm using cfg-update instead - it has an automatic mode that tries to do the sane thing where it can, which is a good compromise. My aim for this script is to be able to apply security updates automatically, so an interactive tool isn't much use.
If dispatch-conf has an automatic mode (I can't see anything about it in the man page) then of course it's an option. To use dispatch-conf, simply edit the script and replace each instance of "cfg-update" with "dispatch-conf", adding the appropriate command line options where needed (the man page says dispatch-conf doesn't have any). |
|
Back to top |
|
|
synss Apprentice
Joined: 08 Mar 2006 Posts: 282 Location: Dijon > Berlin > Tokyo > Nürnberg > München
|
Posted: Tue Jun 20, 2006 8:38 pm Post subject: |
|
|
Rcomian wrote: | This is currently very slow (it recursively calls equery), so it's not recommended to go above 1 or 2 levels of dependencies. |
Couldn't you use qdepends from app-portage/portage-utils? It is faster. _________________ Compress portage tree
Elog viewer
Autodetect swap |
|
Back to top |
|
|
Rcomian Apprentice
Joined: 10 Jan 2004 Posts: 174 Location: Uk, Northwest
|
Posted: Tue Jun 20, 2006 9:03 pm Post subject: |
|
|
synss:
Oh yes, I'll have some of that, thank you! |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|