diff options
author | Tim Beale <timbeale@catalyst.net.nz> | 2019-05-23 13:45:49 +1200 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2019-05-24 03:19:17 +0000 |
commit | c79f0c197558e86fe4f9e27b0c4682441bb55b0b (patch) | |
tree | 09f6951947b6044cdeaf54e0bdc196b017707158 /selftest | |
parent | ad30fdc6ba28374b84dbe94af92c5694bff6f86e (diff) | |
download | samba-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-x | selftest/target/Samba3.pm | 73 | ||||
-rwxr-xr-x | selftest/target/Samba4.pm | 43 |
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"; |