summaryrefslogtreecommitdiff
path: root/selftest
diff options
context:
space:
mode:
authorTim Beale <timbeale@catalyst.net.nz>2019-05-23 13:45:49 +1200
committerAndrew Bartlett <abartlet@samba.org>2019-05-24 03:19:17 +0000
commitc79f0c197558e86fe4f9e27b0c4682441bb55b0b (patch)
tree09f6951947b6044cdeaf54e0bdc196b017707158 /selftest
parentad30fdc6ba28374b84dbe94af92c5694bff6f86e (diff)
downloadsamba-c79f0c197558e86fe4f9e27b0c4682441bb55b0b.tar.gz
selftest: Store fork-and-exec daemon info in a hashmap
This intermediary refactor adds a hashmap that stores the values needed to run each samba daemon. This adds a bit more code in the short term, but it basically means the code in 5 different places now becomes identical, and we can extract it out to a common function. The converting FULL_CMD from an array reference back to an array is a bit ugly, but we can clean this up a bit once the code is all in one place. Signed-off-by: Tim Beale <timbeale@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'selftest')
-rwxr-xr-xselftest/target/Samba3.pm73
-rwxr-xr-xselftest/target/Samba4.pm43
2 files changed, 79 insertions, 37 deletions
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index dd14eaecb72..7a99740334c 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -1270,35 +1270,44 @@ sub check_or_start($$$$$) {
my @full_cmd = $self->make_bin_cmd($binary, $env_vars,
$ENV{NMBD_OPTIONS}, $ENV{NMBD_VALGRIND},
$ENV{NMBD_DONT_LOG_STDOUT});
-
- unlink($env_vars->{NMBD_TEST_LOG});
+ my %daemon_ctx = (
+ NAME => "nmbd",
+ BINARY_PATH => $binary,
+ FULL_CMD => [ @full_cmd ],
+ LOG_FILE => $env_vars->{NMBD_TEST_LOG},
+ NO_RESOLV => 1,
+ );
+ if ($nmbd ne "yes") {
+ $daemon_ctx{SKIP_DAEMON} = 1;
+ }
+
+ unlink($daemon_ctx{LOG_FILE});
print "STARTING NMBD...";
my $pid = fork();
if ($pid == 0) {
- open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
+ open STDOUT, ">$daemon_ctx{LOG_FILE}";
open STDERR, '>&STDOUT';
SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
- my $skip_resolv_wrapper = 1;
- Samba::set_env_for_process("nmbd", $env_vars, $skip_resolv_wrapper);
+ Samba::set_env_for_process($daemon_ctx{NAME}, $env_vars, $daemon_ctx{NO_RESOLV});
- if ($nmbd ne "yes") {
+ if (defined($daemon_ctx{SKIP_DAEMON})) {
$SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
my $signame = shift;
- print("Skip nmbd received signal $signame");
+ print("Skip $daemon_ctx{NAME} received signal $signame");
exit 0;
};
sleep($self->{server_maxtime});
exit 0;
}
- $ENV{MAKE_TEST_BINARY} = $binary;
+ $ENV{MAKE_TEST_BINARY} = $daemon_ctx{BINARY_PATH};
close($env_vars->{STDIN_PIPE});
open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
- exec(@full_cmd)
+ exec(@{ $daemon_ctx{FULL_CMD} })
or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
}
$env_vars->{NMBD_TL_PID} = $pid;
@@ -1312,34 +1321,43 @@ sub check_or_start($$$$$) {
if (not defined($ENV{WINBINDD_DONT_LOG_STDOUT})) {
push(@full_cmd, "--stdout");
}
+ %daemon_ctx = (
+ NAME => "winbindd",
+ BINARY_PATH => $binary,
+ FULL_CMD => [ @full_cmd ],
+ LOG_FILE => $env_vars->{WINBINDD_TEST_LOG},
+ );
+ if ($winbindd ne "yes") {
+ $daemon_ctx{SKIP_DAEMON} = 1;
+ }
- unlink($env_vars->{WINBINDD_TEST_LOG});
+ unlink($daemon_ctx{LOG_FILE});
print "STARTING WINBINDD...";
$pid = fork();
if ($pid == 0) {
- open STDOUT, ">$env_vars->{WINBINDD_TEST_LOG}";
+ open STDOUT, ">$daemon_ctx{LOG_FILE}";
open STDERR, '>&STDOUT';
SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
- Samba::set_env_for_process("winbindd", $env_vars);
+ Samba::set_env_for_process($daemon_ctx{NAME}, $env_vars);
- if ($winbindd ne "yes") {
+ if (defined($daemon_ctx{SKIP_DAEMON})) {
$SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
my $signame = shift;
- print("Skip winbindd received signal $signame");
+ print("Skip $daemon_ctx{NAME} received signal $signame");
exit 0;
};
sleep($self->{server_maxtime});
exit 0;
}
- $ENV{MAKE_TEST_BINARY} = $binary;
+ $ENV{MAKE_TEST_BINARY} = $daemon_ctx{BINARY_PATH};
close($env_vars->{STDIN_PIPE});
open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
- exec(@full_cmd)
+ exec(@{ $daemon_ctx{FULL_CMD} })
or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
}
$env_vars->{WINBINDD_TL_PID} = $pid;
@@ -1350,34 +1368,43 @@ sub check_or_start($$$$$) {
@full_cmd = $self->make_bin_cmd($binary, $env_vars,
$ENV{SMBD_OPTIONS}, $ENV{SMBD_VALGRIND},
$ENV{SMBD_DONT_LOG_STDOUT});
+ %daemon_ctx = (
+ NAME => "smbd",
+ BINARY_PATH => $binary,
+ FULL_CMD => [ @full_cmd ],
+ LOG_FILE => $env_vars->{SMBD_TEST_LOG},
+ );
+ if ($smbd ne "yes") {
+ $daemon_ctx{SKIP_DAEMON} = 1;
+ }
- unlink($env_vars->{SMBD_TEST_LOG});
+ unlink($daemon_ctx{LOG_FILE});
print "STARTING SMBD...";
$pid = fork();
if ($pid == 0) {
- open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
+ open STDOUT, ">$daemon_ctx{LOG_FILE}";
open STDERR, '>&STDOUT';
SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
- Samba::set_env_for_process("smbd", $env_vars);
+ Samba::set_env_for_process($daemon_ctx{NAME}, $env_vars);
- if ($smbd ne "yes") {
+ if (defined($daemon_ctx{SKIP_DAEMON})) {
$SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
my $signame = shift;
- print("Skip smbd received signal $signame");
+ print("Skip $daemon_ctx{NAME} received signal $signame");
exit 0;
};
sleep($self->{server_maxtime});
exit 0;
}
- $ENV{MAKE_TEST_BINARY} = $binary;
+ $ENV{MAKE_TEST_BINARY} = $daemon_ctx{BINARY_PATH};
close($env_vars->{STDIN_PIPE});
open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
- exec(@full_cmd)
+ exec(@{ $daemon_ctx{FULL_CMD} })
or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
}
$env_vars->{SMBD_TL_PID} = $pid;
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index de35be0084a..ae0b849821d 100755
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -115,6 +115,7 @@ sub check_or_start($$$)
}
}
+ # build up the command to run samba
my @preargs = ();
my @optargs = ();
if (defined($ENV{SAMBA_OPTIONS})) {
@@ -127,9 +128,17 @@ sub check_or_start($$$)
if (defined($process_model)) {
push @optargs, ("-M", $process_model);
}
- my @full_cmd = (@preargs, Samba::bindir_path($self, "samba"), "-i",
+ my $binary = Samba::bindir_path($self, "samba");
+ my @full_cmd = (@preargs, $binary, "-i",
"--no-process-group", "--maximum-runtime=$self->{server_maxtime}",
$env_vars->{CONFIGURATION}, @optargs);
+ my %daemon_ctx = (
+ NAME => "samba",
+ BINARY_PATH => $binary,
+ FULL_CMD => [ @full_cmd ],
+ LOG_FILE => $env_vars->{SAMBA_TEST_LOG},
+ TEE_STDOUT => 1,
+ );
print "STARTING SAMBA...\n";
my $pid = fork();
@@ -137,13 +146,13 @@ sub check_or_start($$$)
# we want out from samba to go to the log file, but also
# to the users terminal when running 'make test' on the command
# line. This puts it on stderr on the terminal
- open STDOUT, "| tee $env_vars->{SAMBA_TEST_LOG} 1>&2";
+ open STDOUT, "| tee $daemon_ctx{LOG_FILE} 1>&2";
open STDERR, '>&STDOUT';
SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
# setup common samba env variables
- Samba::set_env_for_process("samba", $env_vars);
+ Samba::set_env_for_process($daemon_ctx{NAME}, $env_vars);
# setup additional env variables for s4
$ENV{RESOLV_CONF} = $env_vars->{RESOLV_CONF};
@@ -153,12 +162,12 @@ sub check_or_start($$$)
$ENV{KRB5_KDC_PROFILE} = $env_vars->{MITKDC_CONFIG};
}
- $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "samba");
+ $ENV{MAKE_TEST_BINARY} = $daemon_ctx{BINARY_PATH};
close($env_vars->{STDIN_PIPE});
open STDIN, ">&", $STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
- exec(@full_cmd) or die("Unable to start samba: $!");
+ exec(@{ $daemon_ctx{FULL_CMD} }) or die("Unable to start $daemon_ctx{BINARY_NAME}: $!");
}
$env_vars->{SAMBA_PID} = $pid;
print "DONE ($pid)\n";
@@ -382,7 +391,7 @@ sub setup_dns_hub_internal($$$)
$env->{SERVER_IP} = Samba::get_ipv4_addr($hostname);
$env->{SERVER_IPV6} = Samba::get_ipv6_addr($hostname);
-
+ $env->{SOCKET_WRAPPER_DEFAULT_IFACE} = Samba::get_interface($hostname);
$env->{DNS_HUB_LOG} = "$prefix_abs/dns_hub.log";
$env->{RESOLV_CONF} = "$prefix_abs/resolv.conf";
@@ -405,6 +414,14 @@ sub setup_dns_hub_internal($$$)
push (@args, "$env->{SERVER_IP}");
push (@args, Samba::realm_to_ip_mappings());
my @full_cmd = (@preargs, $binary, @args);
+ my %daemon_ctx = (
+ NAME => "dnshub",
+ BINARY_PATH => $binary,
+ FULL_CMD => [ @full_cmd ],
+ LOG_FILE => $env->{DNS_HUB_LOG},
+ TEE_STDOUT => 1,
+ PCAP_FILE => "$ENV{SOCKET_WRAPPER_PCAP_DIR}/env-$hostname$.pcap",
+ );
# use a pipe for stdin in the child processes. This allows
# those processes to monitor the pipe for EOF to ensure they
@@ -417,21 +434,19 @@ sub setup_dns_hub_internal($$$)
# we want out from samba to go to the log file, but also
# to the users terminal when running 'make test' on the command
# line. This puts it on stderr on the terminal
- open STDOUT, "| tee $env->{DNS_HUB_LOG} 1>&2";
+ open STDOUT, "| tee $daemon_ctx{LOG_FILE} 1>&2";
open STDERR, '>&STDOUT';
- my $swiface = Samba::get_interface($hostname);
- SocketWrapper::set_default_iface($swiface);
- my $pcap_file = "$ENV{SOCKET_WRAPPER_PCAP_DIR}/env-$hostname$.pcap";
- SocketWrapper::setup_pcap($pcap_file);
+ SocketWrapper::set_default_iface($env->{SOCKET_WRAPPER_DEFAULT_IFACE});
+ SocketWrapper::setup_pcap($daemon_ctx{PCAP_FILE});
- $ENV{MAKE_TEST_BINARY} = $binary;
+ $ENV{MAKE_TEST_BINARY} = $daemon_ctx{BINARY_PATH};
close($env->{STDIN_PIPE});
open STDIN, ">&", $STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
- exec(@full_cmd)
- or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
+ exec(@{ $daemon_ctx{FULL_CMD} })
+ or die("Unable to start $daemon_ctx{NAME}: $!");
}
$env->{SAMBA_PID} = $pid;
$env->{KRB5_CONFIG} = "$prefix_abs/no_krb5.conf";