]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
selftest: Store fork-and-exec daemon info in a hashmap
authorTim Beale <timbeale@catalyst.net.nz>
Thu, 23 May 2019 01:45:49 +0000 (13:45 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 24 May 2019 03:19:17 +0000 (03:19 +0000)
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>
selftest/target/Samba3.pm
selftest/target/Samba4.pm

index dd14eaecb7298f0b78ff2af96b8588f34ad6c5f9..7a99740334cfccabf250c59a8a3771deeb083cd3 100755 (executable)
@@ -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;
index de35be0084a32e17bdebe56cc9d52ab6dc7131d5..ae0b849821db5a123441f526471f656f7baa80c2 100755 (executable)
@@ -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";