* When runtime switching to a new configuration, stop/start/restart

Upstart jobs as appropriate.  I.e., if a job exists in the old but
  not the new configuration, stop it; if it exists in the new but not
  the old, start it; and most interesting, if it exists in both but
  its store paths differ, restart it.  So the purely functional model
  combined cryptographic hashing allows us to precisely identify how
  two configurations differ from each other 

svn path=/nixos/trunk/; revision=7385
This commit is contained in:
Eelco Dolstra 2006-12-18 16:27:56 +00:00
parent 84f1e01646
commit 37c17d7601
2 changed files with 45 additions and 3 deletions

View File

@ -2,7 +2,7 @@
set -e
export PATH=/empty
for i in @path@; do PATH=$PATH:$i/bin; done
for i in @path@; do PATH=$PATH:$i/bin:$i/sbin; done
action="$1"
if ! test -e /etc/NIXOS; then
@ -34,9 +34,44 @@ if test "$action" = "switch" -o "$action" = "boot"; then
fi
if test "$action" = "switch" -o "$action" = "test"; then
oldEvents=$(readlink -f /etc/event.d || true)
newEvents=$(readlink -f @out@/etc/event.d)
echo "old: $oldEvents"
echo "new: $newEvents"
# Stop all services that are not in the new Upstart
# configuration.
for event in $(cd $oldEvents && ls); do
if ! test -e "$newEvents/$event"; then
echo "stopping $event..."
initctl stop "$event"
fi
done
# Activate the new configuration (i.e., update /etc, make
# accounts, and so on).
echo "Activating the configuration..."
@out@/activate
kill -TERM 1 # make Upstart reload its events
# Make Upstart reload its events. !!! Should wait until it has
# finished processing its stop events.
kill -TERM 1
# Start all new services and restart all changed services.
for event in $(cd $newEvents && ls); do
if ! test -e "$oldEvents/$event"; then
echo "starting $event..."
initctl start "$event"
elif test "$(readlink "$oldEvents/$event")" != "$(readlink "$newEvents/$event")"; then
echo "restarting $event..."
initctl stop "$event"
initctl start "$event"
else
echo "unchanged $event"
fi
done
fi
sync

View File

@ -242,7 +242,14 @@ rec {
kernel = pkgs.kernel + "/vmlinuz";
initrd = initialRamdisk + "/initrd";
# Most of these are needed by grub-install.
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep pkgs.findutils pkgs.diffutils];
path = [
pkgs.coreutils
pkgs.gnused
pkgs.gnugrep
pkgs.findutils
pkgs.diffutils
pkgs.upstart # for initctl
];
};