pyldb: avoid segfault when adding an element with no name
[kai/samba-autobuild/.git] / selftest / target / Samba.pm
index 324e1bfb90dd1f31cf43670216c2bc06bd4afc82..38b38669dac95e61f07c06270535aade6422eb28 100644 (file)
@@ -25,6 +25,9 @@ sub new($$$$$) {
 %Samba::ENV_DEPS = (%Samba3::ENV_DEPS, %Samba4::ENV_DEPS);
 our %ENV_DEPS;
 
+%Samba::ENV_DEPS_POST = (%Samba3::ENV_DEPS_POST, %Samba4::ENV_DEPS_POST);
+our %ENV_DEPS_POST;
+
 %Samba::ENV_TARGETS = (
        (map { $_ => "Samba3" } keys %Samba3::ENV_DEPS),
        (map { $_ => "Samba4" } keys %Samba4::ENV_DEPS),
@@ -59,6 +62,8 @@ sub setup_env($$$)
                return $target->{vars}->{$envname};
        }
 
+       $target->{vars}->{$envname} = "";
+
        my @dep_vars;
        foreach(@{$ENV_DEPS{$envname}}) {
                my $vars = $self->setup_env($_, $path);
@@ -87,6 +92,13 @@ sub setup_env($$$)
        $target->{vars}->{$envname} = $env;
        $target->{vars}->{$envname}->{target} = $target;
 
+       foreach(@{$ENV_DEPS_POST{$envname}}) {
+               my $vars = $self->setup_env($_, $path);
+               if (not defined($vars)) {
+                       return undef;
+               }
+       }
+
        return $env;
 }
 
@@ -401,6 +413,7 @@ sub realm_to_ip_mappings
                'backupdom.samba.example.com'     => 'backupfromdc',
                'renamedom.samba.example.com'     => 'renamedc',
                'labdom.samba.example.com'        => 'labdc',
+               'schema.samba.example.com'        => 'liveupgrade1dc',
                'samba.example.com'               => 'localdc',
        );
 
@@ -437,7 +450,9 @@ sub get_interface($)
                localnt4dc9       => 9,
                # 10 is spare
 
-               # 11-16 used by selftest.pl for client interfaces
+               # 11-16 are used by selftest.pl for the client.conf. Most tests only
+               # use the first .11 IP. However, some tests (like winsreplication) rely
+               # on the client having multiple IPs.
                client            => 11,
 
                addc_no_nss       => 17,
@@ -471,9 +486,13 @@ sub get_interface($)
                customdc          => 45,
                prockilldc        => 46,
                proclimitdc       => 47,
+               liveupgrade1dc    => 48,
+               liveupgrade2dc    => 49,
 
                rootdnsforwarder  => 64,
 
+               # Note: that you also need to update dns_hub.py when adding a new
+               # multi-DC testenv
                # update lib/socket_wrapper/socket_wrapper.c
                #  #define MAX_WRAPPED_INTERFACES 64
                # if you wish to have more than 64 interfaces
@@ -488,9 +507,15 @@ sub get_interface($)
 
 sub get_ipv4_addr
 {
-       (my $hostname) = @_;
+       my ($hostname, $iface_num) = @_;
        my $swiface = Samba::get_interface($hostname);
 
+       # Handle testenvs with multiple different addresses, i.e. IP multihoming.
+       # Currently only the selftest client has multiple IPv4 addresses.
+       if (defined($iface_num)) {
+               $swiface += $iface_num;
+       }
+
        return "127.0.0.$swiface";
 }
 
@@ -502,6 +527,29 @@ sub get_ipv6_addr
        return sprintf("fd00:0000:0000:0000:0000:0000:5357:5f%02x", $swiface);
 }
 
+# returns the 'interfaces' setting for smb.conf, i.e. the IPv4/IPv6
+# addresses for testenv
+sub get_interfaces_config
+{
+       my ($hostname, $num_ips) = @_;
+       my $interfaces = "";
+
+       # We give the client.conf multiple different IPv4 addresses.
+       # All other testenvs generally just have one IPv4 address.
+       if (! defined($num_ips)) {
+               $num_ips = 1;
+       }
+       for (my $i = 0; $i < $num_ips; $i++) {
+               my $ipv4_addr = Samba::get_ipv4_addr($hostname, $i);
+               $interfaces .= "$ipv4_addr/8 ";
+       }
+
+       my $ipv6_addr = Samba::get_ipv6_addr($hostname);
+       $interfaces .= "$ipv6_addr/64";
+
+       return $interfaces;
+}
+
 sub cleanup_child($$)
 {
     my ($pid, $name) = @_;
@@ -532,4 +580,121 @@ sub random_domain_sid()
        return $domain_sid;
 }
 
+my @exported_envvars = (
+       # domain stuff
+       "DOMAIN",
+       "DNSNAME",
+       "REALM",
+       "DOMSID",
+
+       # stuff related to a trusted domain
+       "TRUST_SERVER",
+       "TRUST_USERNAME",
+       "TRUST_PASSWORD",
+       "TRUST_DOMAIN",
+       "TRUST_REALM",
+       "TRUST_DOMSID",
+
+       # domain controller stuff
+       "DC_SERVER",
+       "DC_SERVER_IP",
+       "DC_SERVER_IPV6",
+       "DC_NETBIOSNAME",
+       "DC_NETBIOSALIAS",
+
+       # server stuff
+       "SERVER",
+       "SERVER_IP",
+       "SERVER_IPV6",
+       "NETBIOSNAME",
+       "NETBIOSALIAS",
+       "SAMSID",
+
+       # only use these 2 as a last resort. Some tests need to test both client-
+       # side and server-side. In this case, run as default client, ans access
+       # server's smb.conf as needed, typically using:
+       #  param.LoadParm(filename_for_non_global_lp=os.environ['SERVERCONFFILE'])
+       "SERVERCONFFILE",
+       "DC_SERVERCONFFILE",
+
+       # user stuff
+       "USERNAME",
+       "USERID",
+       "PASSWORD",
+       "DC_USERNAME",
+       "DC_PASSWORD",
+
+       # UID/GID for rfc2307 mapping tests
+       "UID_RFC2307TEST",
+       "GID_RFC2307TEST",
+
+       # misc stuff
+       "KRB5_CONFIG",
+       "KRB5CCNAME",
+       "SELFTEST_WINBINDD_SOCKET_DIR",
+       "NMBD_SOCKET_DIR",
+       "LOCAL_PATH",
+       "DNS_FORWARDER1",
+       "DNS_FORWARDER2",
+       "RESOLV_CONF",
+       "UNACCEPTABLE_PASSWORD",
+       "LOCK_DIR",
+       "SMBD_TEST_LOG",
+
+       # nss_wrapper
+       "NSS_WRAPPER_PASSWD",
+       "NSS_WRAPPER_GROUP",
+       "NSS_WRAPPER_HOSTS",
+       "NSS_WRAPPER_HOSTNAME",
+       "NSS_WRAPPER_MODULE_SO_PATH",
+       "NSS_WRAPPER_MODULE_FN_PREFIX",
+
+       # resolv_wrapper
+       "RESOLV_WRAPPER_CONF",
+       "RESOLV_WRAPPER_HOSTS",
+);
+
+sub exported_envvars_str
+{
+       my ($testenv_vars) = @_;
+       my $out = "";
+
+       foreach (@exported_envvars) {
+               next unless defined($testenv_vars->{$_});
+               $out .= $_."=".$testenv_vars->{$_}."\n";
+       }
+
+       return $out;
+}
+
+sub clear_exported_envvars
+{
+       foreach (@exported_envvars) {
+               delete $ENV{$_};
+       }
+}
+
+sub export_envvars
+{
+       my ($testenv_vars) = @_;
+
+       foreach (@exported_envvars) {
+               if (defined($testenv_vars->{$_})) {
+                       $ENV{$_} = $testenv_vars->{$_};
+               } else {
+                       delete $ENV{$_};
+               }
+       }
+}
+
+sub export_envvars_to_file
+{
+       my ($filepath, $testenv_vars) = @_;
+       my $env_str = exported_envvars_str($testenv_vars);
+
+       open(FILE, "> $filepath");
+       print FILE "$env_str";
+       close(FILE);
+}
+
 1;