98cce35041
into a NixOS module (modules/system/activation/top-level.nix - couldn't think of a better name). The top-level derivation is returned in config.system.build.system. * Inlined system.sh in top-level.nix so that we don't have to pass everything through environment variables. svn path=/nixos/branches/modular-nixos/; revision=15740
100 lines
3 KiB
Bash
100 lines
3 KiB
Bash
#! @shell@
|
|
|
|
set -e
|
|
export PATH=/empty
|
|
for i in @path@; do PATH=$PATH:$i/bin:$i/sbin; done
|
|
action="$1"
|
|
|
|
if ! test -e /etc/NIXOS; then
|
|
echo "This is not a NixOS installation (/etc/NIXOS) is missing!"
|
|
exit 1
|
|
fi
|
|
|
|
if test -z "$action"; then
|
|
cat <<EOF
|
|
Usage: $0 [switch|boot|test]
|
|
|
|
switch: make the configuration the boot default and activate now
|
|
boot: make the configuration the boot default
|
|
test: activate the configuration, but don't make it the boot default
|
|
EOF
|
|
exit 1
|
|
fi
|
|
|
|
if test "$action" = "switch" -o "$action" = "boot"; then
|
|
if test -n "@grubDevice@"; then
|
|
mkdir -m 0700 -p /boot/grub
|
|
@grubMenuBuilder@ @out@
|
|
if test "$NIXOS_INSTALL_GRUB" = 1; then
|
|
@grub@/sbin/grub-install "@grubDevice@" --no-floppy --recheck
|
|
fi
|
|
else
|
|
echo "Warning: don't know how to make this configuration bootable; please set \`boot.grubDevice'." 1>&2
|
|
fi
|
|
fi
|
|
|
|
if test "$action" = "switch" -o "$action" = "test"; then
|
|
|
|
oldVersion=$(cat /var/run/current-system/upstart-interface-version 2> /dev/null || echo 0)
|
|
newVersion=$(cat @out@/upstart-interface-version 2> /dev/null || echo 0)
|
|
|
|
if test "$oldVersion" -ne "$newVersion"; then
|
|
cat <<EOF
|
|
Warning: the new NixOS configuration has an Upstart version that is
|
|
incompatible with the current version. The new configuration won't
|
|
take effect until you reboot the system.
|
|
EOF
|
|
exit 1
|
|
fi
|
|
|
|
oldEvents=$(readlink -f /etc/event.d || true)
|
|
newEvents=$(readlink -f @out@/etc/event.d)
|
|
|
|
#echo "old: $oldEvents"
|
|
#echo "new: $newEvents"
|
|
|
|
stopJob() {
|
|
local job=$1
|
|
initctl stop "$job"
|
|
while ! initctl status "$job" 2>&1 | grep -q "(stop) waiting"; do
|
|
echo "waiting for $job to stop..."
|
|
sleep 1
|
|
done
|
|
}
|
|
|
|
# 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..."
|
|
stopJob $event
|
|
fi
|
|
done
|
|
|
|
# Activate the new configuration (i.e., update /etc, make
|
|
# accounts, and so on).
|
|
echo "activating the configuration..."
|
|
@out@/activate @out@
|
|
|
|
# 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
|
|
|
|
# Hack: skip the sys-* and ctrl-alt-delete events.
|
|
# Another hack: don't restart the X server (that would kill all the clients).
|
|
if echo "$event" | grep -q "^sys-\|^ctrl-\|^xserver\|^dbus"; then continue; fi
|
|
|
|
if ! test -e "$oldEvents/$event"; then
|
|
echo "starting $event..."
|
|
initctl start "$event"
|
|
elif test "$(readlink "$oldEvents/$event")" != "$(readlink "$newEvents/$event")"; then
|
|
echo "restarting $event..."
|
|
stopJob $event
|
|
initctl start "$event"
|
|
fi
|
|
done
|
|
fi
|