summary refs log tree commit diff
diff options
context:
space:
mode:
authorJanne Heß <janne@hess.ooo>2022-03-13 20:33:56 +0100
committerJanne Heß <janne@hess.ooo>2022-03-20 13:04:23 +0100
commit85874efcb01fe6266c78761900b2c526cf929cd3 (patch)
tree0f70b014a8d542717a76ee32c39a65ae07241730
parent9c494b57732076fd01ba7a1c8ac0f228285c43c9 (diff)
downloadnixpkgs-85874efcb01fe6266c78761900b2c526cf929cd3.tar
nixpkgs-85874efcb01fe6266c78761900b2c526cf929cd3.tar.gz
nixpkgs-85874efcb01fe6266c78761900b2c526cf929cd3.tar.bz2
nixpkgs-85874efcb01fe6266c78761900b2c526cf929cd3.tar.lz
nixpkgs-85874efcb01fe6266c78761900b2c526cf929cd3.tar.xz
nixpkgs-85874efcb01fe6266c78761900b2c526cf929cd3.tar.zst
nixpkgs-85874efcb01fe6266c78761900b2c526cf929cd3.zip
nixos/switch-to-configuration: Make perlcritic happy
-rwxr-xr-xnixos/modules/system/activation/switch-to-configuration.pl102
1 files changed, 56 insertions, 46 deletions
diff --git a/nixos/modules/system/activation/switch-to-configuration.pl b/nixos/modules/system/activation/switch-to-configuration.pl
index 5532cfe6afe..9e5b760434a 100755
--- a/nixos/modules/system/activation/switch-to-configuration.pl
+++ b/nixos/modules/system/activation/switch-to-configuration.pl
@@ -1,8 +1,5 @@
 #! @perl@/bin/perl
 
-## no critic(CodeLayout::ProhibitParensWithBuiltins)
-## no critic(ValuesAndExpressions::ProhibitInterpolationOfLiterals, Variables::ProhibitPunctuationVars)
-
 use strict;
 use warnings;
 use Config::IniFiles;
@@ -11,7 +8,15 @@ use File::Basename;
 use File::Slurp qw(read_file write_file edit_file);
 use Net::DBus;
 use Sys::Syslog qw(:standard :macros);
-use Cwd "abs_path";
+use Cwd qw(abs_path);
+
+## no critic(ControlStructures::ProhibitDeepNests)
+## no critic(ErrorHandling::RequireCarping)
+## no critic(CodeLayout::ProhibitParensWithBuiltins)
+## no critic(Variables::ProhibitPunctuationVars, Variables::RequireLocalizedPunctuationVars)
+## no critic(InputOutput::RequireCheckedSyscalls, InputOutput::RequireBracedFileHandleWithPrint, InputOutput::RequireBriefOpen)
+## no critic(ValuesAndExpressions::ProhibitNoisyQuotes, ValuesAndExpressions::ProhibitMagicNumbers, ValuesAndExpressions::ProhibitEmptyQuotes, ValuesAndExpressions::ProhibitInterpolationOfLiterals)
+## no critic(RegularExpressions::ProhibitEscapedMetacharacters)
 
 # System closure path to switch to
 my $out = "@out@";
@@ -53,7 +58,7 @@ if ("@localeArchive@" ne "") {
 }
 
 if (!defined($action) || ($action ne "switch" && $action ne "boot" && $action ne "test" && $action ne "dry-activate")) {
-    print STDERR <<EOF;
+    print STDERR <<"EOF";
 Usage: $0 [switch|boot|test]
 
 switch:       make the configuration the boot default and activate now
@@ -66,7 +71,7 @@ EOF
 
 # This is a NixOS installation if it has /etc/NIXOS or a proper
 # /etc/os-release.
-if (!-f "/etc/NIXOS" && (read_file("/etc/os-release", err_mode => "quiet") // "") !~ /ID="?nixos"?/s) {
+if (!-f "/etc/NIXOS" && (read_file("/etc/os-release", err_mode => "quiet") // "") !~ /^ID="?nixos"?/msx) {
     die("This is not a NixOS installation!\n");
 }
 
@@ -95,10 +100,10 @@ my $cur_init_interface_version = read_file("/run/current-system/init-interface-v
 my $new_init_interface_version = read_file("$out/init-interface-version");
 
 if ($new_init_interface_version ne $cur_init_interface_version) {
-    print STDERR <<EOF;
+    print STDERR <<'EOF';
 Warning: the new NixOS configuration has an ‘init’ that is
 incompatible with the current configuration.  The new configuration
-won\'t take effect until you reboot the system.
+won't take effect until you reboot the system.
 EOF
     exit(100);
 }
@@ -114,9 +119,9 @@ sub get_active_units {
     my $mgr = Net::DBus->system->get_service("org.freedesktop.systemd1")->get_object("/org/freedesktop/systemd1");
     my $units = $mgr->ListUnitsByPatterns([], []);
     my $res = {};
-    for my $item (@$units) {
+    for my $item (@{$units}) {
         my ($id, $description, $load_state, $active_state, $sub_state,
-            $following, $unit_path, $job_id, $job_type, $job_path) = @$item;
+            $following, $unit_path, $job_id, $job_type, $job_path) = @{$item};
         if ($following ne "") {
             next;
         }
@@ -138,7 +143,7 @@ sub unit_is_active {
     if (scalar(@{$units}) == 0) {
         return 0;
     }
-    my $active_state = $units->[0]->[3]; ## no critic (ValuesAndExpressions::ProhibitMagicNumbers)
+    my $active_state = $units->[0]->[3];
     return $active_state eq "active" || $active_state eq "activating";
 }
 
@@ -152,11 +157,11 @@ sub parse_fstab {
     my ($fss, $swaps);
     foreach my $line (read_file($filename, err_mode => "quiet")) {
         chomp($line);
-        $line =~ s/^\s*#.*//;
-        if ($line =~ /^\s*$/) {
+        $line =~ s/^\s*\#.*//msx;
+        if ($line =~ /^\s*$/msx) {
             next;
         }
-        my @xs = split(/ /, $line);
+        my @xs = split(/\s+/msx, $line);
         if ($xs[2] eq "swap") {
             $swaps->{$xs[0]} = { options => $xs[3] // "" };
         } else {
@@ -238,7 +243,7 @@ sub parse_systemd_bool {
 
     my @values = @{$unit_config->{$section_name}{$bool_name} // []};
     # Return default if value is not set
-    if (scalar(@values) lt 1 || not defined($values[-1])) {
+    if ((scalar(@values) < 1) || (not defined($values[-1]))) {
         return $default;
     }
     # If value is defined multiple times, use the last definition
@@ -254,6 +259,7 @@ sub record_unit {
     if ($action ne "dry-activate") {
         write_file($fn, { append => 1 }, "$unit\n");
     }
+    return;
 }
 
 # The opposite of record_unit, removes a unit name from a file
@@ -262,6 +268,7 @@ sub unrecord_unit {
     if ($action ne "dry-activate") {
         edit_file(sub { s/^$unit\n//msx }, $fn);
     }
+    return;
 }
 
 # Compare the contents of two unit files and return whether the unit
@@ -273,7 +280,7 @@ sub unrecord_unit {
 # - 0 if the units are equal
 # - 1 if the units are different and a restart action is required
 # - 2 if the units are different and a reload action is required
-sub compare_units {
+sub compare_units { ## no critic(Subroutines::ProhibitExcessComplexity)
     my ($cur_unit, $new_unit) = @_;
     my $ret = 0;
     # Keys to ignore in the [Unit] section
@@ -348,7 +355,7 @@ sub compare_units {
                 return 1;
             }
         }
-        # A key was introduced that was missing in the previos unit
+        # A key was introduced that was missing in the previous unit
         if (%ini_cmp) {
             if ($section_name eq "Unit") {
                 foreach my $ini_key (keys(%ini_cmp)) {
@@ -365,7 +372,7 @@ sub compare_units {
             }
         };
     }
-    # A section was introduced that was missing in the previos unit
+    # A section was introduced that was missing in the previous unit
     if (%section_cmp) {
         if (%section_cmp == 1 and defined($section_cmp{"Unit"})) {
             foreach my $ini_key (keys(%{$new_unit->{"Unit"}})) {
@@ -385,21 +392,21 @@ sub compare_units {
 
 # Called when a unit exists in both the old systemd and the new system and the units
 # differ. This figures out of what units are to be stopped, restarted, reloaded, started, and skipped.
-sub handle_modified_unit {
+sub handle_modified_unit { ## no critic(Subroutines::ProhibitManyArgs, Subroutines::ProhibitExcessComplexity)
     my ($unit, $base_name, $new_unit_file, $new_unit_info, $active_cur, $units_to_stop, $units_to_start, $units_to_reload, $units_to_restart, $units_to_skip) = @_;
 
-    if ($unit eq "sysinit.target" || $unit eq "basic.target" || $unit eq "multi-user.target" || $unit eq "graphical.target" || $unit =~ /\.path$/ || $unit =~ /\.slice$/) {
+    if ($unit eq "sysinit.target" || $unit eq "basic.target" || $unit eq "multi-user.target" || $unit eq "graphical.target" || $unit =~ /\.path$/msx || $unit =~ /\.slice$/msx) {
         # Do nothing.  These cannot be restarted directly.
 
         # Slices and Paths don't have to be restarted since
         # properties (resource limits and inotify watches)
         # seem to get applied on daemon-reload.
-    } elsif ($unit =~ /\.mount$/) {
+    } elsif ($unit =~ /\.mount$/msx) {
         # Reload the changed mount unit to force a remount.
         # FIXME: only reload when Options= changed, restart otherwise
         $units_to_reload->{$unit} = 1;
         record_unit($reload_list_file, $unit);
-    } elsif ($unit =~ /\.socket$/) {
+    } elsif ($unit =~ /\.socket$/msx) {
         # FIXME: do something?
         # Attempt to fix this: https://github.com/NixOS/nixpkgs/pull/141192
         # Revert of the attempt: https://github.com/NixOS/nixpkgs/pull/147609
@@ -415,7 +422,7 @@ sub handle_modified_unit {
         } else {
             # It doesn't make sense to stop and start non-services because
             # they can't have ExecStop=
-            if (!parse_systemd_bool(\%new_unit_info, "Service", "X-StopIfChanged", 1) || $unit !~ /\.service$/) {
+            if (!parse_systemd_bool(\%new_unit_info, "Service", "X-StopIfChanged", 1) || $unit !~ /\.service$/msx) {
                 # This unit should be restarted instead of
                 # stopped and started.
                 $units_to_restart->{$unit} = 1;
@@ -430,8 +437,8 @@ sub handle_modified_unit {
                 # socket unit(s) as well, and restart the
                 # socket(s) instead of the service.
                 my $socket_activated = 0;
-                if ($unit =~ /\.service$/) {
-                    my @sockets = split(/ /, join(" ", @{$new_unit_info{Service}{Sockets} // []}));
+                if ($unit =~ /\.service$/msx) {
+                    my @sockets = split(/\s+/msx, join(" ", @{$new_unit_info{Service}{Sockets} // []}));
                     if (scalar(@sockets) == 0) {
                         @sockets = ("$base_name.socket");
                     }
@@ -482,6 +489,7 @@ sub handle_modified_unit {
             }
         }
     }
+    return;
 }
 
 # Figure out what units need to be stopped, started, restarted or reloaded.
@@ -490,13 +498,13 @@ my (%units_to_stop, %units_to_skip, %units_to_start, %units_to_restart, %units_t
 my %units_to_filter; # units not shown
 
 %units_to_start = map { $_ => 1 }
-    split("\n", read_file($start_list_file, err_mode => "quiet") // "");
+    split(/\n/msx, read_file($start_list_file, err_mode => "quiet") // "");
 
 %units_to_restart = map { $_ => 1 }
-    split("\n", read_file($restart_list_file, err_mode => "quiet") // "");
+    split(/\n/msx, read_file($restart_list_file, err_mode => "quiet") // "");
 
 %units_to_reload = map { $_ => 1 }
-    split("\n", read_file($reload_list_file, err_mode => "quiet") // "");
+    split(/\n/msx, read_file($reload_list_file, err_mode => "quiet") // "");
 
 my $active_cur = get_active_units();
 while (my ($unit, $state) = each(%{$active_cur})) {
@@ -506,14 +514,14 @@ while (my ($unit, $state) = each(%{$active_cur})) {
     my $new_unit_file = "$out/etc/systemd/system/$base_unit";
 
     # Detect template instances.
-    if (!-e $cur_unit_file && !-e $new_unit_file && $unit =~ /^(.*)@[^\.]*\.(.*)$/) {
+    if (!-e $cur_unit_file && !-e $new_unit_file && $unit =~ /^(.*)@[^\.]*\.(.*)$/msx) {
       $base_unit = "$1\@.$2";
       $cur_unit_file = "/etc/systemd/system/$base_unit";
       $new_unit_file = "$out/etc/systemd/system/$base_unit";
     }
 
     my $base_name = $base_unit;
-    $base_name =~ s/\.[a-z]*$//;
+    $base_name =~ s/\.[[:lower:]]*$//msx;
 
     if (-e $cur_unit_file && ($state->{state} eq "active" || $state->{state} eq "activating")) {
         if (! -e $new_unit_file || abs_path($new_unit_file) eq "/dev/null") {
@@ -523,7 +531,7 @@ while (my ($unit, $state) = each(%{$active_cur})) {
             }
         }
 
-        elsif ($unit =~ /\.target$/) {
+        elsif ($unit =~ /\.target$/msx) {
             my %new_unit_info = parse_unit($new_unit_file);
 
             # Cause all active target units to be restarted below.
@@ -578,7 +586,7 @@ sub path_to_unit_name {
     # Use current version of systemctl binary before daemon is reexeced.
     open(my $cmd, "-|", "$cur_systemd/systemd-escape", "--suffix=mount", "-p", $path)
         or die "Unable to escape $path!\n";
-    my $escaped = join("", <$cmd>);
+    my $escaped = do { local $/ = undef; <$cmd> };
     chomp($escaped);
     close($cmd) or die("Unable to close systemd-escape pipe");
     return $escaped;
@@ -591,7 +599,7 @@ sub path_to_unit_name {
 # unit checking code above.
 my ($cur_fss, $cur_swaps) = parse_fstab("/etc/fstab");
 my ($new_fss, $new_swaps) = parse_fstab("$out/etc/fstab");
-foreach my $mount_point (keys(%$cur_fss)) {
+foreach my $mount_point (keys(%{$cur_fss})) {
     my $cur = $cur_fss->{$mount_point};
     my $new = $new_fss->{$mount_point};
     my $unit = path_to_unit_name($mount_point);
@@ -611,7 +619,7 @@ foreach my $mount_point (keys(%$cur_fss)) {
 }
 
 # Also handles swap devices.
-foreach my $device (keys(%$cur_swaps)) {
+foreach my $device (keys(%{$cur_swaps})) {
     my $cur = $cur_swaps->{$device};
     my $new = $new_swaps->{$device};
     if (!defined($new)) {
@@ -670,19 +678,19 @@ if ($action eq "dry-activate") {
     system("$out/dry-activate", "$out");
 
     # Handle the activation script requesting the restart or reload of a unit.
-    foreach (split("\n", read_file($dry_restart_by_activation_file, err_mode => "quiet") // "")) {
+    foreach (split(/\n/msx, read_file($dry_restart_by_activation_file, err_mode => "quiet") // "")) {
         my $unit = $_;
         my $base_unit = $unit;
         my $new_unit_file = "$out/etc/systemd/system/$base_unit";
 
         # Detect template instances.
-        if (!-e $new_unit_file && $unit =~ /^(.*)@[^\.]*\.(.*)$/) {
+        if (!-e $new_unit_file && $unit =~ /^(.*)@[^\.]*\.(.*)$/msx) {
           $base_unit = "$1\@.$2";
           $new_unit_file = "$out/etc/systemd/system/$base_unit";
         }
 
         my $base_name = $base_unit;
-        $base_name =~ s/\.[a-z]*$//;
+        $base_name =~ s/\.[[:lower:]]*$//msx;
 
         # Start units if they were not active previously
         if (not defined($active_cur->{$unit})) {
@@ -694,7 +702,7 @@ if ($action eq "dry-activate") {
     }
     unlink($dry_restart_by_activation_file);
 
-    foreach (split("\n", read_file($dry_reload_by_activation_file, err_mode => "quiet") // "")) {
+    foreach (split(/\n/msx, read_file($dry_reload_by_activation_file, err_mode => "quiet") // "")) {
         my $unit = $_;
 
         if (defined($active_cur->{$unit}) and not $units_to_restart{$unit} and not $units_to_stop{$unit}) {
@@ -742,19 +750,19 @@ print STDERR "activating the configuration...\n";
 system("$out/activate", "$out") == 0 or $res = 2;
 
 # Handle the activation script requesting the restart or reload of a unit.
-foreach (split("\n", read_file($restart_by_activation_file, err_mode => "quiet") // "")) {
+foreach (split(/\n/msx, read_file($restart_by_activation_file, err_mode => "quiet") // "")) {
     my $unit = $_;
     my $base_unit = $unit;
     my $new_unit_file = "$out/etc/systemd/system/$base_unit";
 
     # Detect template instances.
-    if (!-e $new_unit_file && $unit =~ /^(.*)@[^\.]*\.(.*)$/) {
+    if (!-e $new_unit_file && $unit =~ /^(.*)@[^\.]*\.(.*)$/msx) {
       $base_unit = "$1\@.$2";
       $new_unit_file = "$out/etc/systemd/system/$base_unit";
     }
 
     my $base_name = $base_unit;
-    $base_name =~ s/\.[a-z]*$//;
+    $base_name =~ s/\.[[:lower:]]*$//msx;
 
     # Start units if they were not active previously
     if (not defined($active_cur->{$unit})) {
@@ -768,7 +776,7 @@ foreach (split("\n", read_file($restart_by_activation_file, err_mode => "quiet")
 # We can remove the file now because it has been propagated to the other restart/reload files
 unlink($restart_by_activation_file);
 
-foreach (split("\n", read_file($reload_by_activation_file, err_mode => "quiet") // "")) {
+foreach (split(/\n/msx, read_file($reload_by_activation_file, err_mode => "quiet") // "")) {
     my $unit = $_;
 
     if (defined($active_cur->{$unit}) and not $units_to_restart{$unit} and not $units_to_stop{$unit}) {
@@ -794,9 +802,9 @@ system("$new_systemd/bin/systemctl", "reset-failed");
 system("$new_systemd/bin/systemctl", "daemon-reload") == 0 or $res = 3;
 
 # Reload user units
-open(my $list_active_users, "-|", "$new_systemd/bin/loginctl", "list-users", "--no-legend");
+open(my $list_active_users, "-|", "$new_systemd/bin/loginctl", "list-users", "--no-legend") || die("Unable to call loginctl");
 while (my $f = <$list_active_users>) {
-    if ($f !~ /^\s*(?<uid>\d+)\s+(?<user>\S+)/) {
+    if ($f !~ /^\s*(?<uid>\d+)\s+(?<user>\S+)/msx) {
         next;
     }
     my ($uid, $name) = ($+{uid}, $+{user});
@@ -808,7 +816,7 @@ while (my $f = <$list_active_users>) {
            "$new_systemd/bin/systemctl --user start nixos-activation.service");
 }
 
-close($list_active_users);
+close($list_active_users) || die("Unable to close the file handle to loginctl");
 
 # Set the new tmpfiles
 print STDERR "setting up tmpfiles\n";
@@ -873,7 +881,9 @@ while (my ($unit, $state) = each(%{$active_new})) {
 
     if ($state->{substate} eq "auto-restart") {
         # A unit in auto-restart substate is a failure *if* it previously failed to start
-        my $main_status = `$new_systemd/bin/systemctl show --value --property=ExecMainStatus '$unit'`;
+        open(my $main_status_fd, "-|", "$new_systemd/bin/systemctl", "show", "--value", "--property=ExecMainStatus", $unit) || die("Unable to call 'systemctl show'");
+        my $main_status = do { local $/ = undef; <$main_status_fd> };
+        close($main_status_fd) || die("Unable to close 'systemctl show' fd");
         chomp($main_status);
 
         if ($main_status ne "0") {