selftest: setup_dns_hub
authorStefan Metzmacher <metze@samba.org>
Tue, 6 Feb 2018 08:46:41 +0000 (09:46 +0100)
committerVolker Lendecke <vl@samba.org>
Tue, 15 Jan 2019 06:53:22 +0000 (07:53 +0100)
Start the central dns forwarder on interface 64

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
selftest/target/Samba.pm
selftest/target/Samba4.pm

index 4820f987fd73c096ef24cd1251134fac4608a0ce..3fe53f94a2c64f9c2d02eaa5882de52806e278fb 100644 (file)
@@ -427,6 +427,8 @@ sub get_interface($)
     $interfaces{"prockilldc"} = 46;
     $interfaces{"proclimitdc"} = 47;
 
+    $interfaces{"rootdnsforwarder"} = 64;
+
     # update lib/socket_wrapper/socket_wrapper.c
     #  #define MAX_WRAPPED_INTERFACES 64
     # if you wish to have more than 64 interfaces
index 87c9f7dc4f2a39aa5210eb7edcbba88270bc5000..44c7b46b12645ee7877e0ad8bcd4dbe2792b07a0 100755 (executable)
@@ -16,6 +16,7 @@ use SocketWrapper;
 use target::Samba;
 use target::Samba3;
 use Archive::Tar;
+use File::Path 'make_path';
 
 sub new($$$$$) {
        my ($classname, $bindir, $ldap, $srcdir, $server_maxtime) = @_;
@@ -329,6 +330,114 @@ sub mk_openldap($$)
        return ($slapd_conf_d, $pidfile);
 }
 
+sub setup_dns_hub_internal($$$)
+{
+       my ($self, $hostname, $prefix) = @_;
+       my $STDIN_READER;
+
+       unless(-d $prefix or make_path($prefix, 0777)) {
+               warn("Unable to create $prefix");
+               return undef;
+       }
+       my $prefix_abs = abs_path($prefix);
+
+       die ("prefix=''") if $prefix_abs eq "";
+       die ("prefix='/'") if $prefix_abs eq "/";
+
+       unless (system("rm -rf $prefix_abs/*") == 0) {
+               warn("Unable to clean up");
+       }
+
+       my $swiface = Samba::get_interface($hostname);
+
+       my $env = undef;
+       $env->{prefix} = $prefix;
+       $env->{prefix_abs} = $prefix_abs;
+
+       $env->{hostname} = $hostname;
+       $env->{swiface} = $swiface;
+
+       $env->{ipv4} = "127.0.0.$swiface";
+       $env->{ipv6} = sprintf("fd00:0000:0000:0000:0000:0000:5357:5f%02x", $swiface);
+
+       $env->{DNS_HUB_LOG} = "$prefix_abs/dns_hub.log";
+
+       $env->{RESOLV_CONF} = "$prefix_abs/resolv.conf";
+
+       open(RESOLV_CONF, ">$env->{RESOLV_CONF}");
+       print RESOLV_CONF "nameserver $env->{ipv4}\n";
+       print RESOLV_CONF "nameserver $env->{ipv6}\n";
+       close(RESOLV_CONF);
+
+       # use a pipe for stdin in the child processes. This allows
+       # those processes to monitor the pipe for EOF to ensure they
+       # exit when the test script exits
+       pipe($STDIN_READER, $env->{STDIN_PIPE});
+
+       print "STARTING rootdnsforwarder...\n";
+       my $pid = fork();
+       if ($pid == 0) {
+               # 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 STDERR, '>&STDOUT';
+
+               SocketWrapper::set_default_iface($swiface);
+               my $pcap_file = "$ENV{SOCKET_WRAPPER_PCAP_DIR}/env-$hostname$.pcap";
+               SocketWrapper::setup_pcap($pcap_file);
+
+               my @preargs = ();
+               my @args = ();
+               my @optargs = ();
+               if (!defined($ENV{PYTHON})) {
+                   push (@preargs, "env");
+                   push (@preargs, "python");
+               } else {
+                   push (@preargs, $ENV{PYTHON});
+               }
+               $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "python/samba/tests/dns_forwarder_helpers/dns_hub.py");
+               push (@args, "$self->{server_maxtime}");
+               push (@args, "$env->{ipv4}");
+               close($env->{STDIN_PIPE});
+               open STDIN, ">&", $STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
+
+               exec(@preargs, $ENV{MAKE_TEST_BINARY}, @args, @optargs)
+                       or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
+       }
+       $env->{SAMBA_PID} = $pid;
+       $env->{KRB5_CONFIG} = "${prefix_abs}/no_krb5.conf";
+       close($STDIN_READER);
+
+       print "DONE\n";
+       return $env;
+}
+
+sub setup_dns_hub
+{
+       my ($self, $prefix) = @_;
+
+       my $hostname = "rootdnsforwarder";
+
+       my $env = $self->setup_dns_hub_internal("$hostname", "$prefix/$hostname");
+
+       $self->{dns_hub_env} = $env;
+
+       return $env;
+}
+
+sub get_dns_hub_env($)
+{
+       my ($self, $prefix) = @_;
+
+       if (defined($self->{dns_hub_env})) {
+               return $self->{dns_hub_env};
+       }
+
+       die("get_dns_hub_env() not setup 'dns_hub_env'");
+       return undef;
+}
+
 sub setup_namespaces($$:$$)
 {
        my ($self, $localenv, $upn_array, $spn_array) = @_;