diff options
author | Oliver Charles <ollie@ocharles.org.uk> | 2014-04-21 13:09:14 +0100 |
---|---|---|
committer | Oliver Charles <ollie@ocharles.org.uk> | 2014-04-21 13:09:14 +0100 |
commit | ad80532881119b642d63c7d126e46f4e26cdb0be (patch) | |
tree | 5aecf25569a8c93cdff003482d42416e2d6acd18 /nixos | |
parent | 1c5d3c78831b5d1aee3b46c2e5cabe7af14bc1d1 (diff) | |
parent | 42ae633445a72c4673b4abc3e214a2ddc8227724 (diff) | |
download | nixlib-ad80532881119b642d63c7d126e46f4e26cdb0be.tar nixlib-ad80532881119b642d63c7d126e46f4e26cdb0be.tar.gz nixlib-ad80532881119b642d63c7d126e46f4e26cdb0be.tar.bz2 nixlib-ad80532881119b642d63c7d126e46f4e26cdb0be.tar.lz nixlib-ad80532881119b642d63c7d126e46f4e26cdb0be.tar.xz nixlib-ad80532881119b642d63c7d126e46f4e26cdb0be.tar.zst nixlib-ad80532881119b642d63c7d126e46f4e26cdb0be.zip |
Merge branch 'dbus-switch-to-configuration'
Diffstat (limited to 'nixos')
-rw-r--r-- | nixos/modules/system/activation/switch-to-configuration.pl | 45 | ||||
-rw-r--r-- | nixos/modules/system/activation/top-level.nix | 2 |
2 files changed, 24 insertions, 23 deletions
diff --git a/nixos/modules/system/activation/switch-to-configuration.pl b/nixos/modules/system/activation/switch-to-configuration.pl index 4cea0c5910c4..25b5afe99da4 100644 --- a/nixos/modules/system/activation/switch-to-configuration.pl +++ b/nixos/modules/system/activation/switch-to-configuration.pl @@ -4,6 +4,7 @@ use strict; use warnings; use File::Basename; use File::Slurp; +use Net::DBus; use Sys::Syslog qw(:standard :macros); use Cwd 'abs_path'; @@ -62,17 +63,18 @@ syslog(LOG_NOTICE, "switching to system configuration $out"); # virtual console 1 and we restart the "tty1" unit. $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 { - # 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 = {}; - foreach my $line (split '\n', $lines) { - chomp $line; - last if $line eq ""; - $line =~ /^\*?\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s/ or next; - next if $1 eq "UNIT"; - $res->{$1} = { load => $2, state => $3, substate => $4 }; + foreach my $unit (@{ $systemdManager->ListUnits() }) { + $res->{$unit->[0]} = { + load => $unit->[2], + state => $unit->[3], + substate => $unit->[4] + }; } return $res; } @@ -297,7 +299,7 @@ foreach my $device (keys %$prevSwaps) { if (scalar @unitsToStop > 0) { @unitsToStop = unique(@unitsToStop); print STDERR "stopping the following units: ", join(", ", sort(@unitsToStop)), "\n"; - system("@systemd@/bin/systemctl", "stop", "--", @unitsToStop); # FIXME: ignore errors? + $systemdManager->StopUnit($_, "replace") for @unitsToStop; } print STDERR "NOT restarting the following units: ", join(", ", sort(@unitsToSkip)), "\n" @@ -312,21 +314,22 @@ system("$out/activate", "$out") == 0 or $res = 2; # Restart systemd if necessary. if (abs_path("/proc/1/exe") ne abs_path("@systemd@/lib/systemd/systemd")) { print STDERR "restarting systemd...\n"; - system("@systemd@/bin/systemctl", "daemon-reexec") == 0 or $res = 2; + + $systemdManager->Reexecute(); } # Forget about previously failed services. -system("@systemd@/bin/systemctl", "reset-failed"); +$systemdManager->ResetFailed(); -# Make systemd reload its units. -system("@systemd@/bin/systemctl", "daemon-reload") == 0 or $res = 3; +# Make systemd reload its units +$systemdManager->Reload(); # Restart changed services (those that have to be restarted rather # than stopped and started). my @restart = unique(split('\n', read_file($restartListFile, err_mode => 'quiet') // "")); if (scalar @restart > 0) { print STDERR "restarting the following units: ", join(", ", sort(@restart)), "\n"; - system("@systemd@/bin/systemctl", "restart", "--", @restart) == 0 or $res = 4; + $systemdManager->Restart($_, "replace") for @restart; unlink($restartListFile); } @@ -338,7 +341,7 @@ if (scalar @restart > 0) { # systemd. 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"; -system("@systemd@/bin/systemctl", "start", "--", @start) == 0 or $res = 4; +$systemdManager->StartUnit($_, "replace") for @start; unlink($startListFile); # Reload units that need it. This includes remounting changed mount @@ -346,12 +349,12 @@ unlink($startListFile); my @reload = unique(split '\n', read_file($reloadListFile, err_mode => 'quiet') // ""); if (scalar @reload > 0) { print STDERR "reloading the following units: ", join(", ", sort(@reload)), "\n"; - system("@systemd@/bin/systemctl", "reload", "--", @reload) == 0 or $res = 4; + $systemdManager->ReloadUnit($_, "replace") for @reload; unlink($reloadListFile); } # Signal dbus to reload its configuration. -system("@systemd@/bin/systemctl", "reload", "dbus.service"); +$systemdManager->ReloadUnit("dbus.service", "replace"); # Print failed and new units. my (@failed, @new, @restarting); @@ -362,11 +365,9 @@ while (my ($unit, $state) = each %{$activeNew}) { } elsif ($state->{state} eq "auto-restart") { # A unit in auto-restart state is a failure *if* it previously failed to start - my $lines = `@systemd@/bin/systemctl show '$unit'`; - my $info = {}; - parseKeyValues($info, split("\n", $lines)); + my $unit = $systemdManager->GetUnit($unit); - if ($info->{ExecMainStatus} ne '0') { + if ($unit->ExecMainStatus ne '0') { push @failed, $unit; } } diff --git a/nixos/modules/system/activation/top-level.nix b/nixos/modules/system/activation/top-level.nix index 7cdaecce198e..1600a1fb0104 100644 --- a/nixos/modules/system/activation/top-level.nix +++ b/nixos/modules/system/activation/top-level.nix @@ -109,7 +109,7 @@ let configurationName = config.boot.loader.grub.configurationName; # Needed by switch-to-configuration. - perl = "${pkgs.perl}/bin/perl -I${pkgs.perlPackages.FileSlurp}/lib/perl5/site_perl"; + 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"; }; |