Bug#767695: unblock: smcroute/2.0.0-4
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package smcroute
The package in smcroute is RC buggy (#766915: smcroute does not start).
adsb already added an "age-days 2 smcroute/2.0.0-3" hint on 2014-10-30, but I
just uploaded a fix for the autopkgtests, so at least the version number in the
hint needs to be updated. This is why I am contacting you.
The debdiff since the already hinted version is:
----------- 8>< -----------------------------
diff -Nru smcroute-2.0.0/debian/changelog smcroute-2.0.0/debian/changelog
--- smcroute-2.0.0/debian/changelog 2014-10-30 16:11:16.000000000 +0100
+++ smcroute-2.0.0/debian/changelog 2014-11-01 21:00:11.000000000 +0100
@@ -1,3 +1,11 @@
+smcroute (2.0.0-4) unstable; urgency=medium
+
+ * Fix autopkgtest: Add missing smcroute test dependency, missing comma, and
+ missing allow-stderr (Closes: #767592). Thanks to Martin Pitt
+ <martin.pitt@ubuntu.com> for providing the patch.
+
+ -- Micha Lenk <micha@debian.org> Sat, 01 Nov 2014 20:55:08 +0100
+
smcroute (2.0.0-3) unstable; urgency=medium
* Add Testsuite: autopkgtest to debian/control, on behalf of a traveling
diff -Nru smcroute-2.0.0/debian/tests/control smcroute-2.0.0/debian/tests/control
--- smcroute-2.0.0/debian/tests/control 2014-10-30 00:30:58.000000000 +0100
+++ smcroute-2.0.0/debian/tests/control 2014-11-01 21:00:11.000000000 +0100
@@ -1,3 +1,3 @@
Tests: daemon-init-scripts mr-cache-ipv4 mr-cache-ipv6
-Restrictions: needs-root isolation-machine
-Depends: libipc-system-simple-perl procps
+Restrictions: needs-root isolation-machine allow-stderr
+Depends: @, libipc-system-simple-perl, procps
----------- 8>< -----------------------------
The debdiff since the version 2.0.0-1 that is available in testing is attached.
If you agree, please pick from the following what ever hint you find most
appropriate (I would take the age-days hint):
unblock smcroute/2.0.0-4
age-days 2 smcroute/2.0.0-4
Thanks in advance,
Micha
diff -Nru smcroute-2.0.0/debian/changelog smcroute-2.0.0/debian/changelog
--- smcroute-2.0.0/debian/changelog 2014-10-03 10:56:12.000000000 +0200
+++ smcroute-2.0.0/debian/changelog 2014-11-01 21:00:11.000000000 +0100
@@ -1,3 +1,30 @@
+smcroute (2.0.0-4) unstable; urgency=medium
+
+ * Fix autopkgtest: Add missing smcroute test dependency, missing comma, and
+ missing allow-stderr (Closes: #767592). Thanks to Martin Pitt
+ <martin.pitt@ubuntu.com> for providing the patch.
+
+ -- Micha Lenk <micha@debian.org> Sat, 01 Nov 2014 20:55:08 +0100
+
+smcroute (2.0.0-3) unstable; urgency=medium
+
+ * Add Testsuite: autopkgtest to debian/control, on behalf of a traveling
+ Micha
+
+ -- Joachim Breitner <nomeata@debian.org> Thu, 30 Oct 2014 16:11:03 +0100
+
+smcroute (2.0.0-2) unstable; urgency=medium
+
+ * Delete debian/smcroute.dirs because package builds also without it.
+ * Install binaries to /usr/sbin to make init script working again
+ (Closes: #766915).
+ * Add patch 0001-Fix-issue-10-Loop-forever-on-command-if-daemon-not-r.patch
+ to fix hanging init script on stop in case the daemon isn't running.
+ * Add some Autopkgtests covering daemon start stop via System V init scripts,
+ addition and removal of static multicast routes.
+
+ -- Micha Lenk <micha@debian.org> Thu, 30 Oct 2014 00:27:59 +0100
+
smcroute (2.0.0-1) unstable; urgency=low
* New upstream version, does build again on FreeBSD (closes: #763381).
diff -Nru smcroute-2.0.0/debian/control smcroute-2.0.0/debian/control
--- smcroute-2.0.0/debian/control 2014-10-01 22:44:34.000000000 +0200
+++ smcroute-2.0.0/debian/control 2014-11-01 21:00:11.000000000 +0100
@@ -7,6 +7,7 @@
Homepage: http://troglobit.com/smcroute.html
Vcs-Browser: http://source.lenk.info/git/pkg-smcroute.git
Vcs-Git: git://source.lenk.info/git/pkg-smcroute.git
+Testsuite: autopkgtest
Package: smcroute
Architecture: any
diff -Nru smcroute-2.0.0/debian/patches/0001-Fix-issue-10-Loop-forever-on-command-if-daemon-not-r.patch smcroute-2.0.0/debian/patches/0001-Fix-issue-10-Loop-forever-on-command-if-daemon-not-r.patch
--- smcroute-2.0.0/debian/patches/0001-Fix-issue-10-Loop-forever-on-command-if-daemon-not-r.patch 1970-01-01 01:00:00.000000000 +0100
+++ smcroute-2.0.0/debian/patches/0001-Fix-issue-10-Loop-forever-on-command-if-daemon-not-r.patch 2014-11-01 21:00:11.000000000 +0100
@@ -0,0 +1,31 @@
+From: Joachim Nilsson <troglobit@gmail.com>
+Date: Mon, 27 Oct 2014 01:32:54 +0100
+Subject: [PATCH] Fix issue #10: Loop forever on command if daemon not running.
+Origin: https://github.com/troglobit/smcroute/commit/d6280e64b27d5a4bd7f37dac36b455f4ae5f9ab3
+Bug: https://github.com/troglobit/smcroute/issues/10
+
+Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
+---
+ smcroute.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/smcroute.c b/smcroute.c
+index 1aeb133..7bd3c72 100644
+--- a/smcroute.c
++++ b/smcroute.c
+@@ -573,10 +573,11 @@ int main(int argc, const char *argv[])
+ openlog(argv[0], LOG_PID, LOG_USER);
+
+ /* connect to daemon */
+- while (ipc_client_init()) {
++ while (ipc_client_init() && !result) {
+ switch (errno) {
+ case EACCES:
+ smclog(LOG_ERR, EACCES, "Need root privileges to connect to daemon");
++ result = 1;
+ break;
+
+ case ENOENT:
+--
+1.9.1
+
diff -Nru smcroute-2.0.0/debian/patches/series smcroute-2.0.0/debian/patches/series
--- smcroute-2.0.0/debian/patches/series 1970-01-01 01:00:00.000000000 +0100
+++ smcroute-2.0.0/debian/patches/series 2014-11-01 21:00:11.000000000 +0100
@@ -0,0 +1 @@
+0001-Fix-issue-10-Loop-forever-on-command-if-daemon-not-r.patch
diff -Nru smcroute-2.0.0/debian/rules smcroute-2.0.0/debian/rules
--- smcroute-2.0.0/debian/rules 2014-10-03 11:01:44.000000000 +0200
+++ smcroute-2.0.0/debian/rules 2014-11-01 21:00:11.000000000 +0100
@@ -8,6 +8,9 @@
%:
dh $@ --with autoreconf
+override_dh_auto_configure:
+ dh_auto_configure -- --bindir=/usr/sbin
+
override_dh_auto_install:
dh_auto_install
# delete smcroute.conf from /usr/share/doc/smcroute/ as this is also
diff -Nru smcroute-2.0.0/debian/tests/control smcroute-2.0.0/debian/tests/control
--- smcroute-2.0.0/debian/tests/control 1970-01-01 01:00:00.000000000 +0100
+++ smcroute-2.0.0/debian/tests/control 2014-11-01 21:00:11.000000000 +0100
@@ -0,0 +1,3 @@
+Tests: daemon-init-scripts mr-cache-ipv4 mr-cache-ipv6
+Restrictions: needs-root isolation-machine allow-stderr
+Depends: @, libipc-system-simple-perl, procps
diff -Nru smcroute-2.0.0/debian/tests/daemon-init-scripts smcroute-2.0.0/debian/tests/daemon-init-scripts
--- smcroute-2.0.0/debian/tests/daemon-init-scripts 1970-01-01 01:00:00.000000000 +0100
+++ smcroute-2.0.0/debian/tests/daemon-init-scripts 2014-11-01 21:00:11.000000000 +0100
@@ -0,0 +1,38 @@
+#! /usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+use IPC::System::Simple qw( capture $EXITVAL EXIT_ANY );
+
+use constant {
+ INIT_SCRIPT => '/etc/init.d/smcroute',
+};
+
+plan tests => 10;
+
+# Verify that smcroute is running
+my $initial_smcroute_pid = capture EXIT_ANY, 'pgrep', 'smcroute'; chomp $initial_smcroute_pid;
+is $EXITVAL, 0, "smcroute is running".( $EXITVAL ? '' : " (pid $initial_smcroute_pid)" );
+
+# Try to stop the daemon
+my $stop_output = capture EXIT_ANY, INIT_SCRIPT, 'stop';
+is $EXITVAL, 0, "stopping smcroute";
+my $smcroute_pid = capture EXIT_ANY, 'pgrep', 'smcroute'; chomp $smcroute_pid;
+is $EXITVAL, 1, "smcroute is really stopped".( $EXITVAL ? '' : " (pid $smcroute_pid)" );
+
+my $double_stop_output = capture EXIT_ANY, INIT_SCRIPT, 'stop';
+is $EXITVAL, 0, "stopping smcroute twice in a row";
+$smcroute_pid = capture EXIT_ANY, 'pgrep', 'smcroute'; chomp $smcroute_pid;
+is $EXITVAL, 1, "smcroute is really stopped".( $EXITVAL ? '' : " (pid $smcroute_pid)" );
+
+# Try to start the daemon again
+my $start_output = capture EXIT_ANY, INIT_SCRIPT, 'start';
+is $EXITVAL, 0, "starting smcroute";
+my $new_smcroute_pid = capture EXIT_ANY, 'pgrep', 'smcroute'; chomp $new_smcroute_pid;
+is $EXITVAL, 0, "smcroute is really running".( $EXITVAL ? '' : " (pid $new_smcroute_pid)" );
+isnt $new_smcroute_pid, $initial_smcroute_pid, "smcroute pid changed ($new_smcroute_pid != $initial_smcroute_pid)";
+
+my $double_start_output = capture EXIT_ANY, INIT_SCRIPT, 'start';
+is $EXITVAL, 0, "starting smcroute twice in a row";
+$smcroute_pid = capture EXIT_ANY, 'pgrep', 'smcroute'; chomp $smcroute_pid;
+is $EXITVAL, 0, "smcroute is really running".( $EXITVAL ? '' : " (pid $smcroute_pid)" );
diff -Nru smcroute-2.0.0/debian/tests/mr-cache-ipv4 smcroute-2.0.0/debian/tests/mr-cache-ipv4
--- smcroute-2.0.0/debian/tests/mr-cache-ipv4 1970-01-01 01:00:00.000000000 +0100
+++ smcroute-2.0.0/debian/tests/mr-cache-ipv4 2014-11-01 21:00:11.000000000 +0100
@@ -0,0 +1,87 @@
+#! /usr/bin/env perl
+use strict;
+use warnings;
+use Carp;
+use Test::More;
+use IPC::System::Simple qw( capture $EXITVAL EXIT_ANY );
+
+use constant {
+ VIF_TABLE => '/proc/net/ip_mr_vif',
+ MR_CACHE => '/proc/net/ip_mr_cache',
+ MC_SENDER => '10.0.0.1', # arbitrary IP address from private range
+ MC_GROUP => '224.0.1.20', # "any private experiment" (IANA)
+};
+
+# Check preconditions
+if (-e VIF_TABLE) {
+ plan tests => 9;
+} else {
+ plan skip_all => "Test irrelevant on systems without IPv4 multicast (file /proc/net/ip_mr_vif doesn't exist)";
+}
+
+# Verify that smcroute is running
+my $smcroute_pid = capture( EXIT_ANY, 'pgrep', 'smcroute' );
+chomp $smcroute_pid;
+is $EXITVAL, 0, "smcroute is running".( $EXITVAL ? '' : " (pid $smcroute_pid)" );
+
+# Get a valid multicast interface
+my @interfaces = get_multicast_interfaces();
+my $first_itf = $interfaces[0];
+ok @interfaces >= 1, "At least one multicast capable interface found: $first_itf"
+ or diag read_file(VIF_TABLE);
+
+# Verify that there are no multicast routes when we start
+my @routes = get_multicast_routes();
+is @routes, 0, "Multicast routing cache is empty"
+ or diag read_file(MR_CACHE);
+
+# Add a multicast route
+my $route_txt = MC_SENDER."->$first_itf->$first_itf->".MC_GROUP;
+my $output = capture( EXIT_ANY, 'smcroute', '-a', $first_itf, MC_SENDER, MC_GROUP, $first_itf);
+is $EXITVAL, 0, "adding multicast route $route_txt doesn't fail (return code: $EXITVAL)";
+is $output, '', "adding multicast route $route_txt doesn't generate any console output"
+ or diag "Unexpected output\n$output";
+@routes = get_multicast_routes();
+is @routes, 1, "Multicast routing cache now contains one entry";
+diag read_file(MR_CACHE);
+
+# Remove the multicast route again
+$output = capture( EXIT_ANY, 'smcroute', '-r', $first_itf, MC_SENDER, MC_GROUP);
+is $EXITVAL, 0, "removing multicast route $route_txt doesn't fail (return code: $EXITVAL)";
+is $output, '', "removing multicast route $route_txt doesn't generate any console output"
+ or diag "Unexpected output\n$output";
+@routes = get_multicast_routes();
+is @routes, 0, "Multicast routing cache is empty again"
+ or diag read_file(MR_CACHE);
+
+####################################################################################
+# sub routines
+
+sub get_multicast_interfaces {
+ my @vif = read_file(VIF_TABLE);
+ my @itf;
+ shift @vif; # skip table header
+ foreach (@vif) {
+ chomp;
+ s/^\s+//;
+ my @columns = split(/\s+/);
+ push @itf, $columns[1];
+ }
+ return @itf;
+}
+
+sub get_multicast_routes {
+ my @routes = read_file(MR_CACHE);
+ shift @routes; # skip table header
+ return @routes;
+}
+
+sub read_file {
+ my $filename = shift;
+ croak "no filename specified" unless $filename;
+ open my $fh, "<$filename"
+ or croak "failed to read file $filename: $!";
+ my @contents = <$fh>;
+ close $fh;
+ return wantarray ? @contents : "@contents";
+}
diff -Nru smcroute-2.0.0/debian/tests/mr-cache-ipv6 smcroute-2.0.0/debian/tests/mr-cache-ipv6
--- smcroute-2.0.0/debian/tests/mr-cache-ipv6 1970-01-01 01:00:00.000000000 +0100
+++ smcroute-2.0.0/debian/tests/mr-cache-ipv6 2014-11-01 21:00:11.000000000 +0100
@@ -0,0 +1,87 @@
+#! /usr/bin/env perl
+use strict;
+use warnings;
+use Carp;
+use Test::More;
+use IPC::System::Simple qw( capture $EXITVAL EXIT_ANY );
+
+use constant {
+ VIF_TABLE => '/proc/net/ip6_mr_vif',
+ MR_CACHE => '/proc/net/ip6_mr_cache',
+ MC_SENDER => 'fc00::1', # arbitrary IP address from private range
+ MC_GROUP => 'ff01:0:0:0:0:0:0:114', # "any private experiment" (IANA) with node-local scope
+};
+
+# Check preconditions
+if (-e VIF_TABLE) {
+ plan tests => 9;
+} else {
+ plan skip_all => "Test irrelevant on systems without IPv4 multicast (file /proc/net/ip_mr_vif doesn't exist)";
+}
+
+# Verify that smcroute is running
+my $smcroute_pid = capture( EXIT_ANY, 'pgrep', 'smcroute' );
+chomp $smcroute_pid;
+is $EXITVAL, 0, "smcroute is running".( $EXITVAL ? '' : " (pid $smcroute_pid)" );
+
+# Get a valid multicast interface
+my @interfaces = get_multicast_interfaces();
+my $first_itf = $interfaces[0];
+ok @interfaces >= 1, "At least one multicast capable interface found: $first_itf"
+ or diag read_file(VIF_TABLE);
+
+# Verify that there are no multicast routes when we start
+my @routes = get_multicast_routes();
+is @routes, 0, "Multicast routing cache is empty"
+ or diag read_file(MR_CACHE);
+
+# Add a multicast route
+my $route_txt = MC_SENDER."->$first_itf->$first_itf->".MC_GROUP;
+my $output = capture( EXIT_ANY, 'smcroute', '-a', $first_itf, MC_SENDER, MC_GROUP, $first_itf);
+is $EXITVAL, 0, "adding multicast route $route_txt doesn't fail (return code: $EXITVAL)";
+is $output, '', "adding multicast route $route_txt doesn't generate any console output"
+ or diag "Unexpected output\n$output";
+@routes = get_multicast_routes();
+is @routes, 1, "Multicast routing cache now contains one entry";
+diag read_file(MR_CACHE);
+
+# Remove the multicast route again
+$output = capture( EXIT_ANY, 'smcroute', '-r', $first_itf, MC_SENDER, MC_GROUP);
+is $EXITVAL, 0, "removing multicast route $route_txt doesn't fail (return code: $EXITVAL)";
+is $output, '', "removing multicast route $route_txt doesn't generate any console output"
+ or diag "Unexpected output\n$output";
+@routes = get_multicast_routes();
+is @routes, 0, "Multicast routing cache is empty again"
+ or diag read_file(MR_CACHE);
+
+####################################################################################
+# sub routines
+
+sub get_multicast_interfaces {
+ my @vif = read_file(VIF_TABLE);
+ my @itf;
+ shift @vif; # skip table header
+ foreach (@vif) {
+ chomp;
+ s/^\s+//;
+ my @columns = split(/\s+/);
+ push @itf, $columns[1];
+ }
+ return @itf;
+}
+
+sub get_multicast_routes {
+ my @routes = read_file(MR_CACHE);
+ shift @routes; # skip table header
+ return @routes;
+}
+
+sub read_file {
+ my $filename = shift;
+ croak "no filename specified" unless $filename;
+ open my $fh, "<$filename"
+ or croak "failed to read file $filename: $!";
+ my @contents = <$fh>;
+ close $fh;
+ return wantarray ? @contents : "@contents";
+}
Reply to: