Hi Niels, Thanks again for the review.
> Apologies, I had assumed you had run the test suite, so it turns out > there are a few more remarks. Mea culpa. As an "excuse" I had received your previous instructions on the the testsuite, perlcritic, etc. but after I had written this patch… but I should have run it regardlness. > * There are test failures with the patch (presumably the tests needs > updating). > - At least init.d-* and legacy-scripts had failures Fixed. > - For legacy tests, just add the tag to "tags" and move on. For the > rest, please up date them so they do not emit the tag if reasonably > possible. Fixed…although I err'd on adding the tag in some places instead of a control file simply to add the Depends. > * There are perlcritic warnings (boolean operator precedence mixing) Fixed. > * There are unescaped "<" or ">" in the tag description, which should > be escaped with < or > (like HTML). Odds are it is just the > dependency relation. Fixed. Updated patch attached: commit c09ecd4c2a776461d68ce9449e95169348cb79a4 Author: Chris Lamb <la...@debian.org> Date: Sat Oct 1 16:05:06 2016 +0100 Check scripts using init-functions without lsb-base Depends. Emit a tag for initscripts that source the /lib/lsb/init-functions utility functions without declaring the corresponding dependency on lsb-base (>= 3.0-6). Closes: #838997 Signed-off-by: Chris Lamb <la...@debian.org> checks/init.d.desc | 6 ++ checks/init.d.pm | 12 +++- .../files-bad-perm-owner/debian/debian/control.in | 2 +- t/tests/init.d-general/debian/debian/control.in | 6 +- t/tests/init.d-lsb-depends/debian/debian/init | 71 ++++++++++++++++++++++ t/tests/init.d-lsb-depends/desc | 4 ++ t/tests/init.d-lsb-depends/tags | 1 + .../init.d-lsb-headers/debian/debian/control.in | 16 ++--- t/tests/init.d-script-registration/tags | 1 + t/tests/legacy-scripts/tags | 1 + t/tests/scripts-calls-init-script/tags | 1 + t/tests/systemd-general/tags | 1 + Regards, -- ,''`. : :' : Chris Lamb `. `'` la...@debian.org / chris-lamb.co.uk `-
From c09ecd4c2a776461d68ce9449e95169348cb79a4 Mon Sep 17 00:00:00 2001 From: Chris Lamb <la...@debian.org> Date: Sat, 1 Oct 2016 16:05:06 +0100 Subject: [PATCH] Check scripts using init-functions without lsb-base Depends. Emit a tag for initscripts that source the /lib/lsb/init-functions utility functions without declaring the corresponding dependency on lsb-base (>= 3.0-6). Closes: #838997 Signed-off-by: Chris Lamb <la...@debian.org> --- checks/init.d.desc | 6 ++ checks/init.d.pm | 12 +++- .../files-bad-perm-owner/debian/debian/control.in | 2 +- t/tests/init.d-general/debian/debian/control.in | 6 +- t/tests/init.d-lsb-depends/debian/debian/init | 71 ++++++++++++++++++++++ t/tests/init.d-lsb-depends/desc | 4 ++ t/tests/init.d-lsb-depends/tags | 1 + .../init.d-lsb-headers/debian/debian/control.in | 16 ++--- t/tests/init.d-script-registration/tags | 1 + t/tests/legacy-scripts/tags | 1 + t/tests/scripts-calls-init-script/tags | 1 + t/tests/systemd-general/tags | 1 + 12 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 t/tests/init.d-lsb-depends/debian/debian/init create mode 100644 t/tests/init.d-lsb-depends/desc create mode 100644 t/tests/init.d-lsb-depends/tags diff --git a/checks/init.d.desc b/checks/init.d.desc index ce33ba5..5b19b3a 100644 --- a/checks/init.d.desc +++ b/checks/init.d.desc @@ -370,3 +370,9 @@ Info: The given init script declares a dependency on the totally broken. Ref: https://wiki.debian.org/LSBInitScripts +Tag: init.d-script-needs-depends-on-lsb-base +Severity: important +Certainty: possible +Info: The given init script sources the <tt>/lib/lsb/init-functions</tt> utility + functions without declaring the corresponding dependency on lsb-base + (>= 3.0-6). diff --git a/checks/init.d.pm b/checks/init.d.pm index f91afa1..7b0fa7d 100644 --- a/checks/init.d.pm +++ b/checks/init.d.pm @@ -198,7 +198,7 @@ sub run { # Check if file exists in package and check the script for # other issues if it was included in the package. - check_init($initd_path); + check_init($initd_path, $info); } return unless $initd_dir and $initd_dir->is_dir; @@ -222,7 +222,7 @@ sub run { # coverage in the first pass. unless ($initd_postinst{$script->basename}) { tag $tagname, $script; - check_init($script); + check_init($script, $info); } } @@ -230,7 +230,7 @@ sub run { } sub check_init { - my ($initd_path) = @_; + my ($initd_path, $info) = @_; # In an upstart system, such as Ubuntu, init scripts are symlinks to # upstart-job. It doesn't make sense to check the syntax of upstart-job, @@ -321,6 +321,12 @@ sub check_init { while ($l =~ s/^[^\#]*?(start|stop|restart|force-reload|status)//o) { $tag{$1} = 1; } + + if ($l =~ m{^\s*\.\s+/lib/lsb/init-functions} + && !$info->relation('strong')->implies('lsb-base (>= 3.0-6)')) { + tag 'init.d-script-needs-depends-on-lsb-base', + $initd_path, "(line $.)"; + } } close($fd); diff --git a/t/tests/files-bad-perm-owner/debian/debian/control.in b/t/tests/files-bad-perm-owner/debian/debian/control.in index 0286455..60b27bc 100644 --- a/t/tests/files-bad-perm-owner/debian/debian/control.in +++ b/t/tests/files-bad-perm-owner/debian/debian/control.in @@ -7,7 +7,7 @@ Build-Depends: {$build_depends} Package: binary Architecture: all -Depends: $\{misc:Depends\}, +Depends: $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} This is a test package designed to exercise some feature or tag of Lintian. It is part of the Lintian test suite and may do very odd diff --git a/t/tests/init.d-general/debian/debian/control.in b/t/tests/init.d-general/debian/debian/control.in index 7bd9f10..2b08fe1 100644 --- a/t/tests/init.d-general/debian/debian/control.in +++ b/t/tests/init.d-general/debian/debian/control.in @@ -7,7 +7,7 @@ Build-Depends: {$build_depends} Package: {$source} Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} This is a test package designed to exercise some feature or tag of Lintian. It is part of the Lintian test suite and may do very odd @@ -15,7 +15,7 @@ Description: {$description} Package: {$source}-bugs Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- bugs Test some simple bugs in the check . @@ -35,7 +35,7 @@ Description: {$description} -- bad script interpreter Package: {$source}-sourcing-without-test Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- sourcing without test Test a check for . /etc/default/foo without checking the existence of the file beforehand. diff --git a/t/tests/init.d-lsb-depends/debian/debian/init b/t/tests/init.d-lsb-depends/debian/debian/init new file mode 100644 index 0000000..48d4cde --- /dev/null +++ b/t/tests/init.d-lsb-depends/debian/debian/init @@ -0,0 +1,71 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: init.d-lsb-depends +# Required-Start: $syslog $remote_fs +# Required-Stop: $syslog $remote_fs +# Should-Start: $local_fs +# Should-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: init.d-lsb-depends +# Description: init.d-lsb-depends +### END INIT INFO + + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/bin/init.d-lsb-depends +NAME=init.d-lsb-depends +DESC=init.d-lsb-depends + +RUNDIR=/var/run/redis +PIDFILE=$RUNDIR/init.d-lsb-depends.pid + +test -x $DAEMON || exit 0 + +if [ -r /etc/default/$NAME ] +then + . /etc/default/$NAME +fi + +. /lib/lsb/init-functions + +set -e + +case "$1" in + start) + echo -n "Starting $DESC: " + if start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON + then + echo "$NAME." + else + echo "failed" + fi + ;; + stop) + echo -n "Stopping $DESC: " + if start-stop-daemon --stop --retry --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON + then + echo "$NAME." + else + echo "failed" + fi + rm -f $PIDFILE + sleep 1 + ;; + + restart|force-reload) + ${0} stop + ${0} start + ;; + + status) + status_of_proc -p ${PIDFILE} ${DAEMON} ${NAME} + ;; + + *) + echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload|status}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/t/tests/init.d-lsb-depends/desc b/t/tests/init.d-lsb-depends/desc new file mode 100644 index 0000000..e0f6565 --- /dev/null +++ b/t/tests/init.d-lsb-depends/desc @@ -0,0 +1,4 @@ +Testname: init.d-lsb-depends +Version: 1.0 +Description: Test for packages missing dependencies on lsb-base +Test-For: init.d-script-needs-depends-on-lsb-base diff --git a/t/tests/init.d-lsb-depends/tags b/t/tests/init.d-lsb-depends/tags new file mode 100644 index 0000000..21e92fd --- /dev/null +++ b/t/tests/init.d-lsb-depends/tags @@ -0,0 +1 @@ +E: init.d-lsb-depends: init.d-script-needs-depends-on-lsb-base etc/init.d/init.d-lsb-depends (line 30) diff --git a/t/tests/init.d-lsb-headers/debian/debian/control.in b/t/tests/init.d-lsb-headers/debian/debian/control.in index f1246ab..fd2f749 100644 --- a/t/tests/init.d-lsb-headers/debian/debian/control.in +++ b/t/tests/init.d-lsb-headers/debian/debian/control.in @@ -7,7 +7,7 @@ Build-Depends: {$build_depends} Package: {$source} Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} This is a test package designed to exercise some feature or tag of Lintian. It is part of the Lintian test suite and may do very odd @@ -15,7 +15,7 @@ Description: {$description} Package: {$source}-parsing Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- headers parsing This is a test package designed to exercise the parsing of init scripts by Lintian. It is part of the Lintian test suite and may do very odd @@ -23,7 +23,7 @@ Description: {$description} -- headers parsing Package: {$source}-remote Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- using /usr files This is a test package designed to exercise the checking of init scripts by Lintian. It is part of the Lintian test suite and may do very odd @@ -31,7 +31,7 @@ Description: {$description} -- using /usr files Package: {$source}-length Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- breaking length assumptions Test package designed to exercise the checking of init scripts by Lintian. It is part of the Lintian test suite and may do @@ -39,7 +39,7 @@ Description: {$description} -- breaking length assumptions Package: {$source}-local Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- using /var files This is another test package designed to exercise the checking of init scripts by Lintian. It is part of the Lintian test suite and may do @@ -47,7 +47,7 @@ Description: {$description} -- using /var files Package: {$source}-missing Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- missing runlevels This is yet another test package designed to exercise the checking of init scripts by Lintian. It is part of the Lintian test suite and may @@ -55,7 +55,7 @@ Description: {$description} -- missing runlevels Package: {$source}-virtual Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- virtual facilities Test package to exercise the virtual facilities in init.d scripts checks by lintian. It is part of the Lintian test suite and may @@ -63,7 +63,7 @@ Description: {$description} -- virtual facilities Package: {$source}-all Architecture: {$architecture} -Depends: $\{shlibs:Depends\}, $\{misc:Depends\} +Depends: $\{shlibs:Depends\}, $\{misc:Depends\}, lsb-base (>= 3.0-6) Description: {$description} -- all virtual facilities Test package designed to exercise the checking of virtual all facilities in init.d scripts checks by lintian. diff --git a/t/tests/init.d-script-registration/tags b/t/tests/init.d-script-registration/tags index 3562d6c..2ed0722 100644 --- a/t/tests/init.d-script-registration/tags +++ b/t/tests/init.d-script-registration/tags @@ -1,4 +1,5 @@ E: init.d-script-registration: init-script-is-not-a-file etc/init.d/bar +E: init.d-script-registration: init.d-script-needs-depends-on-lsb-base etc/init.d/foo.in (line 3) 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/bar W: init.d-script-registration: script-in-etc-init.d-not-registered-via-update-rc.d etc/init.d/foo.in diff --git a/t/tests/legacy-scripts/tags b/t/tests/legacy-scripts/tags index 3f2854c..0436902 100644 --- a/t/tests/legacy-scripts/tags +++ b/t/tests/legacy-scripts/tags @@ -10,6 +10,7 @@ E: scripts: init.d-script-does-not-implement-required-option etc/init.d/lsb-brok E: scripts: init.d-script-does-not-implement-required-option etc/init.d/lsb-broken restart E: scripts: init.d-script-has-duplicate-lsb-section etc/init.d/lsb-broken E: scripts: init.d-script-has-unterminated-lsb-section etc/init.d/lsb-broken:15 +E: scripts: init.d-script-needs-depends-on-lsb-base etc/init.d/skeleton (line 40) E: scripts: missing-dep-for-interpreter jruby => jruby | jruby1.0 | jruby1.1 | jruby1.2 (usr/bin/jruby-broken) E: scripts: missing-dep-for-interpreter lefty => graphviz (usr/bin/lefty-foo) E: scripts: package-installs-python-bytecode usr/lib/python2.3/site-packages/test.pyc diff --git a/t/tests/scripts-calls-init-script/tags b/t/tests/scripts-calls-init-script/tags index f1cbd81..efa3050 100644 --- a/t/tests/scripts-calls-init-script/tags +++ b/t/tests/scripts-calls-init-script/tags @@ -1 +1,2 @@ +E: scripts-calls-init-script: init.d-script-needs-depends-on-lsb-base etc/init.d/self-invoke (line 12) E: scripts-calls-init-script: maintainer-script-calls-init-script-directly postinst:5 diff --git a/t/tests/systemd-general/tags b/t/tests/systemd-general/tags index 3d9bb5d..fb59e2c 100644 --- a/t/tests/systemd-general/tags +++ b/t/tests/systemd-general/tags @@ -1,4 +1,5 @@ E: systemd-general: init-script-is-not-a-file etc/init.d/fifo-pipe-as-init +E: systemd-general: init.d-script-needs-depends-on-lsb-base etc/init.d/systemd-aliasd (line 35) E: systemd-general: service-file-is-not-a-file etc/systemd/system/fifo-pipe-as-init.service E: systemd-general: service-key-has-whitespace etc/systemd/system/test.service at line 3 E: systemd-general: service-key-has-whitespace usr/lib/systemd/system/test.service at line 3 -- 2.9.3