Revert "Merge branch 'dbus-switch-to-configuration'"

This seems to have combined badly with the systemd upgrade, we'll revert
for now and revisit after the 14.04 branch.

This reverts commit ad80532881119b642d63c7d126e46f4e26cdb0be, reversing
changes made to 1c5d3c78831b5d1aee3b46c2e5cabe7af14bc1d1.
This commit is contained in:
Shea Levy 2014-04-21 18:30:05 -04:00
parent 281126d7ee
commit 2a4282c811
2 changed files with 23 additions and 24 deletions

View File

@ -4,7 +4,6 @@ use strict;
use warnings; use warnings;
use File::Basename; use File::Basename;
use File::Slurp; use File::Slurp;
use Net::DBus;
use Sys::Syslog qw(:standard :macros); use Sys::Syslog qw(:standard :macros);
use Cwd 'abs_path'; use Cwd 'abs_path';
@ -63,18 +62,17 @@ syslog(LOG_NOTICE, "switching to system configuration $out");
# virtual console 1 and we restart the "tty1" unit. # virtual console 1 and we restart the "tty1" unit.
$SIG{PIPE} = "IGNORE"; $SIG{PIPE} = "IGNORE";
my $dbus = Net::DBus->find;
my $systemdService = $dbus->get_service('org.freedesktop.systemd1');
my $systemdManager = $systemdService->get_object('/org/freedesktop/systemd1');
sub getActiveUnits { sub getActiveUnits {
# FIXME: use D-Bus or whatever to query this, since parsing the
# output of list-units is likely to break.
my $lines = `LANG= @systemd@/bin/systemctl list-units --full`;
my $res = {}; my $res = {};
foreach my $unit (@{ $systemdManager->ListUnits() }) { foreach my $line (split '\n', $lines) {
$res->{$unit->[0]} = { chomp $line;
load => $unit->[2], last if $line eq "";
state => $unit->[3], $line =~ /^\*?\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s/ or next;
substate => $unit->[4] next if $1 eq "UNIT";
}; $res->{$1} = { load => $2, state => $3, substate => $4 };
} }
return $res; return $res;
} }
@ -299,7 +297,7 @@ foreach my $device (keys %$prevSwaps) {
if (scalar @unitsToStop > 0) { if (scalar @unitsToStop > 0) {
@unitsToStop = unique(@unitsToStop); @unitsToStop = unique(@unitsToStop);
print STDERR "stopping the following units: ", join(", ", sort(@unitsToStop)), "\n"; print STDERR "stopping the following units: ", join(", ", sort(@unitsToStop)), "\n";
$systemdManager->StopUnit($_, "replace") for @unitsToStop; system("@systemd@/bin/systemctl", "stop", "--", @unitsToStop); # FIXME: ignore errors?
} }
print STDERR "NOT restarting the following units: ", join(", ", sort(@unitsToSkip)), "\n" print STDERR "NOT restarting the following units: ", join(", ", sort(@unitsToSkip)), "\n"
@ -314,22 +312,21 @@ system("$out/activate", "$out") == 0 or $res = 2;
# Restart systemd if necessary. # Restart systemd if necessary.
if (abs_path("/proc/1/exe") ne abs_path("@systemd@/lib/systemd/systemd")) { if (abs_path("/proc/1/exe") ne abs_path("@systemd@/lib/systemd/systemd")) {
print STDERR "restarting systemd...\n"; print STDERR "restarting systemd...\n";
system("@systemd@/bin/systemctl", "daemon-reexec") == 0 or $res = 2;
$systemdManager->Reexecute();
} }
# Forget about previously failed services. # Forget about previously failed services.
$systemdManager->ResetFailed(); system("@systemd@/bin/systemctl", "reset-failed");
# Make systemd reload its units # Make systemd reload its units.
$systemdManager->Reload(); system("@systemd@/bin/systemctl", "daemon-reload") == 0 or $res = 3;
# Restart changed services (those that have to be restarted rather # Restart changed services (those that have to be restarted rather
# than stopped and started). # than stopped and started).
my @restart = unique(split('\n', read_file($restartListFile, err_mode => 'quiet') // "")); my @restart = unique(split('\n', read_file($restartListFile, err_mode => 'quiet') // ""));
if (scalar @restart > 0) { if (scalar @restart > 0) {
print STDERR "restarting the following units: ", join(", ", sort(@restart)), "\n"; print STDERR "restarting the following units: ", join(", ", sort(@restart)), "\n";
$systemdManager->Restart($_, "replace") for @restart; system("@systemd@/bin/systemctl", "restart", "--", @restart) == 0 or $res = 4;
unlink($restartListFile); unlink($restartListFile);
} }
@ -341,7 +338,7 @@ if (scalar @restart > 0) {
# systemd. # systemd.
my @start = unique("default.target", "timers.target", "sockets.target", split('\n', read_file($startListFile, err_mode => 'quiet') // "")); my @start = unique("default.target", "timers.target", "sockets.target", split('\n', read_file($startListFile, err_mode => 'quiet') // ""));
print STDERR "starting the following units: ", join(", ", sort(@start)), "\n"; print STDERR "starting the following units: ", join(", ", sort(@start)), "\n";
$systemdManager->StartUnit($_, "replace") for @start; system("@systemd@/bin/systemctl", "start", "--", @start) == 0 or $res = 4;
unlink($startListFile); unlink($startListFile);
# Reload units that need it. This includes remounting changed mount # Reload units that need it. This includes remounting changed mount
@ -349,12 +346,12 @@ unlink($startListFile);
my @reload = unique(split '\n', read_file($reloadListFile, err_mode => 'quiet') // ""); my @reload = unique(split '\n', read_file($reloadListFile, err_mode => 'quiet') // "");
if (scalar @reload > 0) { if (scalar @reload > 0) {
print STDERR "reloading the following units: ", join(", ", sort(@reload)), "\n"; print STDERR "reloading the following units: ", join(", ", sort(@reload)), "\n";
$systemdManager->ReloadUnit($_, "replace") for @reload; system("@systemd@/bin/systemctl", "reload", "--", @reload) == 0 or $res = 4;
unlink($reloadListFile); unlink($reloadListFile);
} }
# Signal dbus to reload its configuration. # Signal dbus to reload its configuration.
$systemdManager->ReloadUnit("dbus.service", "replace"); system("@systemd@/bin/systemctl", "reload", "dbus.service");
# Print failed and new units. # Print failed and new units.
my (@failed, @new, @restarting); my (@failed, @new, @restarting);
@ -365,9 +362,11 @@ while (my ($unit, $state) = each %{$activeNew}) {
} }
elsif ($state->{state} eq "auto-restart") { elsif ($state->{state} eq "auto-restart") {
# A unit in auto-restart state is a failure *if* it previously failed to start # A unit in auto-restart state is a failure *if* it previously failed to start
my $unit = $systemdManager->GetUnit($unit); my $lines = `@systemd@/bin/systemctl show '$unit'`;
my $info = {};
parseKeyValues($info, split("\n", $lines));
if ($unit->ExecMainStatus ne '0') { if ($info->{ExecMainStatus} ne '0') {
push @failed, $unit; push @failed, $unit;
} }
} }

View File

@ -109,7 +109,7 @@ let
configurationName = config.boot.loader.grub.configurationName; configurationName = config.boot.loader.grub.configurationName;
# Needed by switch-to-configuration. # Needed by switch-to-configuration.
perl = "${pkgs.perl}/bin/perl -I${pkgs.perlPackages.XMLTwig}/lib/perl5/site_perl -I${pkgs.perlPackages.XMLParser}/lib/perl5/site_perl -I${pkgs.perlPackages.NetDBus}/lib/perl5/site_perl -I${pkgs.perlPackages.FileSlurp}/lib/perl5/site_perl"; perl = "${pkgs.perl}/bin/perl -I${pkgs.perlPackages.FileSlurp}/lib/perl5/site_perl";
}; };