summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authoredef <edef@edef.eu>2017-08-12 21:14:36 +0200
committeredef <edef@edef.eu>2018-05-03 20:19:23 +0200
commit54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6 (patch)
tree4ba10634ae2624f5cabeb4e7146e27ee34d63943 /nixos
parent542ef2b182dff9756abf782a650f80599c515e4a (diff)
downloadnixpkgs-54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6.tar
nixpkgs-54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6.tar.gz
nixpkgs-54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6.tar.bz2
nixpkgs-54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6.tar.lz
nixpkgs-54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6.tar.xz
nixpkgs-54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6.tar.zst
nixpkgs-54a13b07d5925c8e890e0d9aaa0842cd7ae0d8d6.zip
switch-to-configuration: use Net::DBus to retrieve the list of units
This resolves the FIXME, and opens up the possibility of using more of
the systemd DBus interface to make things more robust.
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/system/activation/switch-to-configuration.pl19
-rw-r--r--nixos/modules/system/activation/top-level.nix3
2 files changed, 11 insertions, 11 deletions
diff --git a/nixos/modules/system/activation/switch-to-configuration.pl b/nixos/modules/system/activation/switch-to-configuration.pl
index 87a4ab2a586..2ce04ed5342 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';
 
@@ -67,17 +68,15 @@ EOF
 $SIG{PIPE} = "IGNORE";
 
 sub getActiveUnits {
-    # FIXME: use D-Bus or whatever to query this, since parsing the
-    # output of list-units is likely to break.
-    # Use current version of systemctl binary before daemon is reexeced.
-    my $lines = `LANG= /run/current-system/sw/bin/systemctl list-units --full --no-legend`;
+    my $mgr = Net::DBus->system->get_service("org.freedesktop.systemd1")->get_object("/org/freedesktop/systemd1");
+    my $units = $mgr->ListUnitsByPatterns([], []);
     my $res = {};
-    foreach my $line (split '\n', $lines) {
-        chomp $line;
-        last if $line eq "";
-        $line =~ /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s/ or next;
-        next if $1 eq "UNIT";
-        $res->{$1} = { load => $2, state => $3, substate => $4 };
+    for my $item (@$units) {
+        my ($id, $description, $load_state, $active_state, $sub_state,
+            $following, $unit_path, $job_id, $job_type, $job_path) = @$item;
+        next unless $following eq '';
+        next if $job_id == 0 and $active_state eq 'inactive';
+        $res->{$id} = { load => $load_state, state => $active_state, substate => $sub_state };
     }
     return $res;
 }
diff --git a/nixos/modules/system/activation/top-level.nix b/nixos/modules/system/activation/top-level.nix
index 091a2e412ee..e2d1dd49ef0 100644
--- a/nixos/modules/system/activation/top-level.nix
+++ b/nixos/modules/system/activation/top-level.nix
@@ -127,7 +127,8 @@ 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 " + (concatMapStringsSep " " (lib: "-I${lib}/${pkgs.perl.libPrefix}") (with pkgs.perlPackages; [ FileSlurp NetDBus XMLParser XMLTwig ]));
   } else throw "\nFailed assertions:\n${concatStringsSep "\n" (map (x: "- ${x}") failed)}");
 
   # Replace runtime dependencies