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

[SCM] Debian package checker branch, master, updated. 2.2.11-29-g22733cd



The following commit has been merged in the master branch:
commit f01e25f0cd77e2df4f3971c5dde1f1fec5c0f9dc
Author: Raphael Geissert <atomo64@gmail.com>
Date:   Tue Jun 16 14:44:50 2009 -0500

    Fix a bug where init scripts not being registered were not checked
    
    Some packages do not register their init scripts on the maintainer
    scripts, leading to lintian completely ignoring them when performing
    other checks.

diff --git a/checks/init.d b/checks/init.d
index 97bb780..f134ed0 100644
--- a/checks/init.d
+++ b/checks/init.d
@@ -151,116 +151,123 @@ for (keys %initd_postinst) {
     # check if file exists in package
     my $initd_file = "init.d/$_";
     if (-f $initd_file) {
-	# yes! check it...
-	open(IN, '<', $initd_file)
-	    or fail("cannot open init.d file $initd_file: $!");
-	my (%tag, %lsb);
-	while (defined(my $l = <IN>)) {
-	    if ($. eq 1 && $l =~ m,^#!\s*(/usr/[^\s]+),) {
-		tag "init.d-script-uses-usr-interpreter", "/etc/init.d/$_ $1";
-	    }
-	    if ($l =~ m/^\#\#\# BEGIN INIT INFO/) {
-		if ($lsb{BEGIN}) {
-		    tag "init.d-script-has-duplicate-lsb-section", "/etc/init.d/$_";
-		    next;
-		}
-		$lsb{BEGIN} = 1;
-		my $last;
+	checkinit($initd_file);
+    } else {
+	tag "init.d-script-not-included-in-package", "/etc/init.d/$_";
+    }
+}
 
-		# We have an LSB keyword section.  Parse it and save the data
-		# in %lsb for analysis.
-		while (defined(my $l = <IN>)) {
-		    if ($l =~ /^\#\#\# END INIT INFO/) {
-			$lsb{END} = 1;
-			last;
-		    } elsif ($l !~ /^\#/) {
-			tag "init.d-script-has-unterminated-lsb-section", "/etc/init.d/$_:$.";
-			last;
-		    } elsif ($l =~ /^\# ([a-zA-Z-]+):\s*(.*?)\s*$/) {
-			my $keyword = lc $1;
-			my $value = $2;
-			tag "init.d-script-has-duplicate-lsb-keyword", "/etc/init.d/$_:$. $keyword"
-			    if (defined $lsb{$keyword});
-			tag "init.d-script-has-unknown-lsb-keyword", "/etc/init.d/$_:$. $keyword"
-			    unless (defined ($lsb_keywords{$keyword}) || $keyword =~ /^x-/);
-			$lsb{$keyword} = $value || '';
-			$last = $keyword;
-		    } elsif ($l =~ /^\#(\t|  )/ && $last eq 'description') {
-			my $value = $l;
-			$value =~ s/^\#\s*//;
-			$lsb{description} .= ' ' . $value;
-		    } else {
-			tag "init.d-script-has-bad-lsb-line", "/etc/init.d/$_:$.";
-		    }
-		}
-	    }
+# files actually installed in /etc/init.d should match our list :-)
+opendir(INITD, "init.d") or fail("cannot read init.d directory: $!");
+for (readdir(INITD)) {
+    next if $_ eq '.' || $_ eq '..';
+    unless ($initd_postinst{$_}) {
+	tag "script-in-etc-init.d-not-registered-via-update-rc.d", "/etc/init.d/$_";
+	checkinit("init.d/$_");
+    }
+}
+closedir(INITD);
+
+}
 
-	    while ($l =~ s/^[^#]*?(start|stop|restart|force-reload)//o) {
-		$tag{$1} = 1;
+sub checkinit {
+    my ($initd_file) = @_;
+    # yes! check it...
+    open(IN, '<', $initd_file)
+	or fail("cannot open init.d file $initd_file: $!");
+    my (%tag, %lsb);
+    while (defined(my $l = <IN>)) {
+	if ($. eq 1 && $l =~ m,^#!\s*(/usr/[^\s]+),) {
+	    tag "init.d-script-uses-usr-interpreter", "/etc/init.d/$_ $1";
+	}
+	if ($l =~ m/^\#\#\# BEGIN INIT INFO/) {
+	    if ($lsb{BEGIN}) {
+		tag "init.d-script-has-duplicate-lsb-section", "/etc/init.d/$_";
+		next;
 	    }
-        }
-	close(IN);
+	    $lsb{BEGIN} = 1;
+	    my $last;
 
-	# Make sure all of the required keywords are present.
-	if (not $lsb{BEGIN}) {
-	    tag "init.d-script-missing-lsb-section", "/etc/init.d/$_";
-	} else {
-	    for my $keyword (keys %lsb_keywords) {
-		if ($lsb_keywords{$keyword} && !defined $lsb{$keyword}) {
-		    if ($keyword eq 'short-description') {
-			tag "init.d-script-missing-lsb-short-description", "/etc/init.d/$_";
-		    } else {
-			tag "init.d-script-missing-lsb-keyword", "/etc/init.d/$_ $keyword";
-		    }
+	    # We have an LSB keyword section.  Parse it and save the data
+	    # in %lsb for analysis.
+	    while (defined(my $l = <IN>)) {
+		if ($l =~ /^\#\#\# END INIT INFO/) {
+		    $lsb{END} = 1;
+		    last;
+		} elsif ($l !~ /^\#/) {
+		    tag "init.d-script-has-unterminated-lsb-section", "/etc/init.d/$_:$.";
+		    last;
+		} elsif ($l =~ /^\# ([a-zA-Z-]+):\s*(.*?)\s*$/) {
+		    my $keyword = lc $1;
+		    my $value = $2;
+		    tag "init.d-script-has-duplicate-lsb-keyword", "/etc/init.d/$_:$. $keyword"
+			if (defined $lsb{$keyword});
+		    tag "init.d-script-has-unknown-lsb-keyword", "/etc/init.d/$_:$. $keyword"
+			unless (defined ($lsb_keywords{$keyword}) || $keyword =~ /^x-/);
+		    $lsb{$keyword} = $value || '';
+		    $last = $keyword;
+		} elsif ($l =~ /^\#(\t|  )/ && $last eq 'description') {
+		    my $value = $l;
+		    $value =~ s/^\#\s*//;
+		    $lsb{description} .= ' ' . $value;
+		} else {
+		    tag "init.d-script-has-bad-lsb-line", "/etc/init.d/$_:$.";
 		}
 	    }
 	}
 
-	# Check the runlevels.
-	my %start;
-	if ($lsb{'default-start'}) {
-	    for my $runlevel (split (/\s+/, $lsb{'default-start'})) {
-		if ($runlevel =~ /^[sS0-6]$/) {
-		    $start{lc $runlevel} = 1;
+	while ($l =~ s/^[^#]*?(start|stop|restart|force-reload)//o) {
+	    $tag{$1} = 1;
+	}
+    }
+    close(IN);
+
+    # Make sure all of the required keywords are present.
+    if (not $lsb{BEGIN}) {
+	tag "init.d-script-missing-lsb-section", "/etc/init.d/$_";
+    } else {
+	for my $keyword (keys %lsb_keywords) {
+	    if ($lsb_keywords{$keyword} && !defined $lsb{$keyword}) {
+		if ($keyword eq 'short-description') {
+		    tag "init.d-script-missing-lsb-short-description", "/etc/init.d/$_";
 		} else {
-		    tag "init.d-script-has-bad-start-runlevel", "/etc/init.d/$_ $runlevel";
+		    tag "init.d-script-missing-lsb-keyword", "/etc/init.d/$_ $keyword";
 		}
 	    }
 	}
-	if ($lsb{'default-stop'}) {
-	    for my $runlevel (split (/\s+/, $lsb{'default-stop'})) {
-		if ($runlevel =~ /^[sS0-6]$/) {
-		    if ($start{$runlevel}) {
-			tag "init.d-script-has-conflicting-start-stop", "/etc/init.d/$_ $runlevel";
-		    }
-		    if ($runlevel =~ /[sS]/) {
-			tag "init-d-script-stops-in-s-runlevel", "/etc/init.d/$_";
-		    }
-		} else {
-		    tag "init.d-script-has-bad-stop-runlevel", "/etc/init.d/$_ $runlevel";
+    }
+
+    # Check the runlevels.
+    my %start;
+    if ($lsb{'default-start'}) {
+	for my $runlevel (split (/\s+/, $lsb{'default-start'})) {
+	    if ($runlevel =~ /^[sS0-6]$/) {
+		$start{lc $runlevel} = 1;
+	    } else {
+		tag "init.d-script-has-bad-start-runlevel", "/etc/init.d/$_ $runlevel";
+	    }
+	}
+    }
+    if ($lsb{'default-stop'}) {
+	for my $runlevel (split (/\s+/, $lsb{'default-stop'})) {
+	    if ($runlevel =~ /^[sS0-6]$/) {
+		if ($start{$runlevel}) {
+		    tag "init.d-script-has-conflicting-start-stop", "/etc/init.d/$_ $runlevel";
 		}
+		if ($runlevel =~ /[sS]/) {
+		    tag "init-d-script-stops-in-s-runlevel", "/etc/init.d/$_";
+		}
+	    } else {
+		tag "init.d-script-has-bad-stop-runlevel", "/etc/init.d/$_ $runlevel";
 	    }
 	}
-
-	# all tags included in file?
-	$tag{'start'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ start";
-	$tag{'stop'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ stop";
-	$tag{'restart'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ restart";
-	$tag{'force-reload'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ force-reload";
-    } else {
-	tag "init.d-script-not-included-in-package", "/etc/init.d/$_";
     }
-}
-
-# files actually installed in /etc/init.d should match our list :-)
-opendir(INITD, "init.d") or fail("cannot read init.d directory: $!");
-for (readdir(INITD)) {
-    next if $_ eq '.' || $_ eq '..';
-    tag "script-in-etc-init.d-not-registered-via-update-rc.d", "/etc/init.d/$_"
-	unless $initd_postinst{$_};
-}
-closedir(INITD);
 
+    # all tags included in file?
+    $tag{'start'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ start";
+    $tag{'stop'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ stop";
+    $tag{'restart'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ restart";
+    $tag{'force-reload'} or tag "init.d-script-does-not-implement-required-option", "/etc/init.d/$_ force-reload";
 }
 
 1;
diff --git a/t/tests/init.d-script-registration/debian/debian/install b/t/tests/init.d-script-registration/debian/debian/install
new file mode 100644
index 0000000..57fadcb
--- /dev/null
+++ b/t/tests/init.d-script-registration/debian/debian/install
@@ -0,0 +1 @@
+foo.in /etc/init.d/
diff --git a/t/tests/init.d-script-registration/debian/foo.in b/t/tests/init.d-script-registration/debian/foo.in
new file mode 100644
index 0000000..735d88e
--- /dev/null
+++ b/t/tests/init.d-script-registration/debian/foo.in
@@ -0,0 +1,14 @@
+#!/bin/sh -e
+
+case "$1" in
+    start)
+    ;;
+    stop)
+    ;;
+    reload)
+    ;;
+    restart|force-reload)
+    ;;
+    *)
+    ;;
+esac
diff --git a/t/tests/init.d-script-registration/desc b/t/tests/init.d-script-registration/desc
new file mode 100644
index 0000000..4674ad2
--- /dev/null
+++ b/t/tests/init.d-script-registration/desc
@@ -0,0 +1,5 @@
+Testname: init.d-script-registration
+Sequence: 6000
+Version: 1.0
+Description: Test tags related to the registration of init scripts
+Test-For: init.d-script-missing-lsb-section
\ No newline at end of file
diff --git a/t/tests/init.d-script-registration/tags b/t/tests/init.d-script-registration/tags
new file mode 100644
index 0000000..3adac56
--- /dev/null
+++ b/t/tests/init.d-script-registration/tags
@@ -0,0 +1,2 @@
+W: init.d-script-registration: init.d-script-missing-lsb-section /etc/init.d/foo.in
+W: init.d-script-registration: script-in-etc-init.d-not-registered-via-update-rc.d /etc/init.d/foo.in

-- 
Debian package checker


Reply to: