[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[lintian] 01/05: Reorder systemd checks



This is an automated email from the git hooks/post-receive script.

nthykier pushed a commit to branch master
in repository lintian.

commit cb81402f80c3ec0e4b396e85ed50916e96043c67
Author: Felipe Sateler <fsateler@debian.org>
Date:   Sat Jun 27 16:32:42 2015 -0300

    Reorder systemd checks
    
    This reorder groups most checks inside the corresponding check_*
    
    [nthykier: fix a case of "Mixed high and low-precedence booleans"]
    
    Signed-off-by: Niels Thykier <niels@thykier.net>
---
 checks/systemd.pm | 138 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 78 insertions(+), 60 deletions(-)

diff --git a/checks/systemd.pm b/checks/systemd.pm
index d36cf65..1411322 100644
--- a/checks/systemd.pm
+++ b/checks/systemd.pm
@@ -37,81 +37,64 @@ use Lintian::Util qw(fail lstrip rstrip);
 sub run {
     my (undef, undef, $info) = @_;
 
-    # Figure out whether the maintainer of this package did any effort to
-    # make the package work with systemd. If not, we will not warn in case
-    # of an init script that has no systemd equivalent, for example.
-    my $ships_systemd_file = any { m,/systemd/, } $info->sorted_index;
-
-    # An array of names which are provided by the service files.
-    # This includes Alias= directives, so after parsing
-    # NetworkManager.service, it will contain NetworkManager and
-    # network-manager.
-    my @systemd_targets;
-
+    # non-service checks
     for my $file ($info->sorted_index) {
         if ($file =~ m,^etc/tmpfiles\.d/.*\.conf$,) {
             tag 'systemd-tmpfiles.d-outside-usr-lib', $file;
         }
-        if ($file =~ m,^etc/systemd/system/.*\.service$,) {
-            tag 'systemd-service-file-outside-lib', $file;
-        }
-        if ($file =~ m,^usr/lib/systemd/system/.*\.service$,) {
-            tag 'systemd-service-file-outside-lib', $file;
-        }
-        if ($file =~ m,/systemd/system/.*\.service$,) {
-            check_systemd_service_file($info, $file);
-            for my $name (extract_service_file_names($info, $file)) {
-                push @systemd_targets, $name;
-            }
-        }
     }
 
-    my @init_scripts = grep { m,^etc/init\.d/.+, } $info->sorted_index;
+    my @init_scripts = get_init_scripts($info);
+    my @service_files = get_systemd_service_files($info);
 
-    # Verify that each init script includes /lib/lsb/init-functions,
-    # because that is where the systemd diversion happens.
-    for my $init_script (@init_scripts) {
-        check_init_script($info, $init_script);
-    }
+    # A hash of names reference which are provided by the service files.
+    # This includes Alias= directives, so after parsing
+    # NetworkManager.service, it will contain NetworkManager and
+    # network-manager.
+    my $services = get_systemd_service_names($info);
 
-    @init_scripts = map { basename($_) } @init_scripts;
+    for my $script (@init_scripts) {
+        check_init_script($info, $script, $services);
+    }
 
-    if ($ships_systemd_file) {
-        for my $init_script (@init_scripts) {
-            tag 'systemd-no-service-for-init-script', $init_script
-              unless any { m/\Q$init_script\E\.service/ } @systemd_targets;
-        }
+    for my $service (@service_files) {
+        check_systemd_service_file($info, $service);
     }
 
     check_maintainer_scripts($info);
     return;
 }
 
+sub get_init_scripts {
+    my ($info) = @_;
+    my @ignore = ('README','skeleton','rc','rcS',);
+    my @scripts;
+    if (my $initd_path = $info->index_resolved_path('etc/init.d/')) {
+        for my $init_script ($initd_path->children) {
+            next if any { $_ eq $init_script->basename } @ignore;
+            next
+              if $init_script->is_symlink
+              && $init_script->link eq '/lib/init/upstart-job';
+
+            push(@scripts, $init_script);
+        }
+    }
+    return @scripts;
+}
+
+# Verify that each init script includes /lib/lsb/init-functions,
+# because that is where the systemd diversion happens.
 sub check_init_script {
-    my ($info, $file) = @_;
+    my ($info, $file, $services) = @_;
     my $basename = $file->basename;
     my $lsb_source_seen;
 
-    # Couple of special cases we don't care about...
-    return
-         if $basename eq 'README'
-      or $basename eq 'skeleton'
-      or $basename eq 'rc'
-      or $basename eq 'rcS';
-
-    if ($file->is_symlink) {
-        # We cannot test upstart-jobs
-        return if $file->link eq '/lib/init/upstart-job';
-    }
-
     if (!$file->is_regular_file) {
         unless ($file->is_open_ok) {
             tag 'init-script-is-not-a-file', $file;
             return;
         }
-
     }
-
     my $fh = $file->open;
     while (<$fh>) {
         lstrip;
@@ -127,15 +110,57 @@ sub check_init_script {
     }
     close($fh);
 
-    if (!$lsb_source_seen) {
-        tag 'init.d-script-does-not-source-init-functions', $file;
-    }
+    tag 'init.d-script-does-not-source-init-functions', $file
+      unless $lsb_source_seen;
+    # Only tag if the maintainer of this package did any effort to
+    # make the package work with systemd.
+    tag 'systemd-no-service-for-init-script', $basename
+      if (%{$services} and not $services->{$basename});
     return;
 }
 
+sub get_systemd_service_files {
+    my ($info) = @_;
+
+    return grep { m,/systemd/system/.*\.service$, } $info->sorted_index;
+}
+
+sub get_systemd_service_names {
+    my ($info) = @_;
+    my %services;
+
+    my $safe_add_service = sub {
+        my ($name, $file) = @_;
+        if (exists $services{$name}) {
+            # should add a tag here
+            return;
+        }
+        $services{$name} = 1;
+    };
+
+    for my $file (get_systemd_service_files($info)) {
+        my $name = $file->basename;
+        $name =~ s/\.service$//;
+        $safe_add_service->($name, $file);
+
+        my @aliases
+          = extract_service_file_values($info, $file, 'Install', 'Alias');
+
+        for my $alias (@aliases) {
+            $safe_add_service->($alias, $file);
+        }
+    }
+    return \%services;
+}
+
 sub check_systemd_service_file {
     my ($info, $file) = @_;
 
+    tag 'systemd-service-file-outside-lib', $file
+      if ($file =~ m,^etc/systemd/system/,);
+    tag 'systemd-service-file-outside-lib', $file
+      if ($file =~ m,^usr/lib/systemd/system/,);
+
     my @values = extract_service_file_values($info, $file, 'Unit', 'After');
     my @obsolete = grep { /^(?:syslog|dbus)\.target$/ } @values;
     tag 'systemd-service-file-refers-to-obsolete-target', $file, $_
@@ -236,13 +261,6 @@ sub extract_service_file_values {
     return @values;
 }
 
-sub extract_service_file_names {
-    my ($info, $file) = @_;
-
-    my @aliases= extract_service_file_values($info, $file, 'Install', 'Alias');
-    return (basename($file), @aliases);
-}
-
 sub check_maintainer_scripts {
     my ($info) = @_;
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/lintian/lintian.git


Reply to: