#! @perl@ use strict; use warnings; use File::Basename; use File::Slurp; use Cwd 'abs_path'; my $action = shift @ARGV; if (!defined $action || ($action ne "switch" && $action ne "boot" && $action ne "test")) { print STDERR < 'quiet') // ""; my $newVersion = read_file("@out@/init-interface-version"); if ($newVersion ne $oldVersion) { print STDERR <{$1} = { load => $2, state => $3, substate => $4 }; } return $res; } # Stop all services that no longer exist or have changed in the new # configuration. # FIXME: handle template units (e.g. getty@.service). my $active = getActiveUnits; foreach my $unitFile (glob "/etc/systemd/system/*") { next unless -f "$unitFile"; my $unit = basename $unitFile; my $state = $active->{$unit}; if (defined $state && ($state->{state} eq "active" || $state->{state} eq "activating")) { my $newUnitFile = "@out@/etc/systemd/system/$unit"; if (! -e $newUnitFile) { print STDERR "stopping obsolete unit ‘$unit’...\n"; system("@systemd@/bin/systemctl", "stop", $unit); # FIXME: ignore errors? } elsif (abs_path($unitFile) ne abs_path($newUnitFile)) { print STDERR "stopping changed unit ‘$unit’...\n"; system("@systemd@/bin/systemctl", "stop", $unit); # FIXME: ignore errors? } } } # Activate the new configuration (i.e., update /etc, make accounts, # and so on). my $res = 0; print STDERR "activating the configuration...\n"; system("@out@/activate", "@out@") == 0 or $res = 2; # FIXME: Re-exec systemd if necessary. # Make systemd reload its units. system("@systemd@/bin/systemctl", "daemon-reload") == 0 or $res = 3; # Start all units required by the default target. This should start # all changed units we stopped above as well as any new dependencies. print STDERR "starting default target...\n"; system("@systemd@/bin/systemctl", "start", "default.target") == 0 or $res = 3; # Signal dbus to reload its configuration. system("@systemd@/bin/systemctl", "reload", "dbus.service"); exit $res;