s4 smbd standard tests: limit forked processes
[amitay/samba.git] / selftest / target / Samba4.pm
index c2e9fdb827699849aee2f704c4e813d3db5d2db7..c54942b61fd0cf5e69a2919917fad7468ed0eaa0 100755 (executable)
@@ -592,6 +592,16 @@ sub provision_raw_prepare($$$$$$$$$$$$)
        return $ctx;
 }
 
+sub has_option
+{
+       my ($self, $keyword, @options_list) = @_;
+
+       # convert the options-list to a hash-map for easy keyword lookup
+       my %options_dict = map { $_ => 1 } @options_list;
+
+       return exists $options_dict{$keyword};
+}
+
 #
 # Step1 creates the basic configuration
 #
@@ -616,6 +626,13 @@ sub provision_raw_step1($$)
        my $crlfile = "$ctx->{tlsdir}/crl.pem";
        $crlfile = "" unless -e ${crlfile};
 
+       # work out which file server to use. Default to source3 smbd (s3fs),
+       # unless the source4 NTVFS (smb) file server has been specified
+       my $services = "-smb +s3fs";
+       if ($self->has_option("--use-ntvfs", @{$ctx->{provision_options}})) {
+               $services = "+smb -s3fs";
+       }
+
        print CONFFILE "
 [global]
        netbios name = $ctx->{netbiosname}
@@ -639,7 +656,7 @@ sub provision_raw_step1($$)
        panic action = $RealBin/gdb_backtrace \%d
        wins support = yes
        server role = $ctx->{server_role}
-       server services = +echo +smb -s3fs
+       server services = +echo $services
         dcerpc endpoint servers = +winreg +srvsvc
        notify:inotify = false
        ldb:nosync = true
@@ -966,8 +983,6 @@ sub provision($$$$$$$$$$)
 
        if (defined($extra_provision_options)) {
                push (@{$ctx->{provision_options}}, @{$extra_provision_options});
-       } else {
-               push (@{$ctx->{provision_options}}, "--use-ntvfs");
        }
 
        $ctx->{share} = "$ctx->{prefix_abs}/share";
@@ -1133,6 +1148,7 @@ rpc_server:tcpip = no
        if ($more_conf) {
                $extra_smb_conf = $extra_smb_conf . $more_conf . "\n";
        }
+       my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "member server",
                                   $hostname,
@@ -1142,7 +1158,8 @@ rpc_server:tcpip = no
                                   "locMEMpass3",
                                   $dcvars->{SERVER_IP},
                                   $dcvars->{SERVER_IPV6},
-                                  $extra_smb_conf, "", undef);
+                                  $extra_smb_conf, "",
+                                  $extra_provision_options);
        unless ($ret) {
                return undef;
        }
@@ -1210,6 +1227,7 @@ sub provision_rpc_proxy($$$)
 
 ";
 
+       my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "member server",
                                   "localrpcproxy",
@@ -1219,7 +1237,8 @@ sub provision_rpc_proxy($$$)
                                   "locRPCproxypass4",
                                   $dcvars->{SERVER_IP},
                                   $dcvars->{SERVER_IPV6},
-                                  $extra_smbconf_options, "", undef);
+                                  $extra_smbconf_options, "",
+                                  $extra_provision_options);
        unless ($ret) {
                return undef;
        }
@@ -1570,6 +1589,7 @@ sub provision_ad_dc_ntvfs($$)
        dsdb group change notification = true
        server schannel = auto
        ";
+       my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "domain controller",
                                   "localdc",
@@ -1581,7 +1601,7 @@ sub provision_ad_dc_ntvfs($$)
                                   undef,
                                   $extra_conf_options,
                                   "",
-                                  undef);
+                                  $extra_provision_options);
        unless ($ret) {
                return undef;
        }
@@ -1611,7 +1631,7 @@ sub provision_fl2000dc($$)
        spnego:simulate_w2k=yes
        ntlmssp_server:force_old_spnego=yes
 ";
-       my $extra_provision_options = undef;
+       my $extra_provision_options = ["--use-ntvfs"];
        # This environment uses plain text secrets
        # i.e. secret attributes are not encrypted on disk.
        # This allows testing of the --plaintext-secrets option for
@@ -1658,6 +1678,7 @@ sub provision_fl2003dc($$$)
        my $extra_conf_options = "allow dns updates = nonsecure and secure
        dcesrv:header signing = no
        dns forwarder = 127.0.0.$swiface1 127.0.0.$swiface2";
+       my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "domain controller",
                                   "dc6",
@@ -1669,7 +1690,7 @@ sub provision_fl2003dc($$$)
                                   undef,
                                   $extra_conf_options,
                                   "",
-                                  undef);
+                                  $extra_provision_options);
        unless (defined $ret) {
                return undef;
        }
@@ -1713,6 +1734,7 @@ sub provision_fl2008r2dc($$$)
 
        print "PROVISIONING DC WITH FOREST LEVEL 2008r2...\n";
         my $extra_conf_options = "ldap server require strong auth = no";
+       my $extra_provision_options = ["--use-ntvfs"];
        my $ret = $self->provision($prefix,
                                   "domain controller",
                                   "dc7",
@@ -1724,7 +1746,7 @@ sub provision_fl2008r2dc($$$)
                                   undef,
                                   $extra_conf_options,
                                   "",
-                                  undef);
+                                  $extra_provision_options);
        unless (defined $ret) {
                return undef;
        }
@@ -1896,7 +1918,6 @@ sub provision_ad_dc($$$$$$)
        $password_hash_gpg_key_ids = "" unless defined($config_h->{HAVE_GPGME});
 
        my $extra_smbconf_options = "
-        server services = -smb +s3fs
         xattr_tdb:file = $prefix_abs/statedir/xattr.tdb
 
        dbwrap_tdb_mutexes:* = yes
@@ -2024,7 +2045,7 @@ sub provision_chgdcpass($$)
        my ($self, $prefix) = @_;
 
        print "PROVISIONING CHGDCPASS...\n";
-       my $extra_provision_options = undef;
+       my $extra_provision_options = ["--use-ntvfs"];
        # This environment disallows the use of this password
        # (and also removes the default AD complexity checks)
        my $unacceptable_password = "widk3Dsle32jxdBdskldsk55klASKQ";
@@ -2207,6 +2228,7 @@ sub check_env($$)
        renamedc             => ["backupfromdc"],
        offlinebackupdc      => ["backupfromdc"],
        labdc                => ["backupfromdc"],
+       proclimitdc          => [],
 
        none                 => [],
 );
@@ -2667,6 +2689,44 @@ sub setup_preforkrestartdc
        return $env;
 }
 
+#
+# ad_dc test environment used solely to test standard process model connection
+# process limits. As the limit is set artificially low it should not be used
+# for other tests.
+sub setup_proclimitdc
+{
+       my ($self, $path) = @_;
+
+       # If we didn't build with ADS, pretend this env was never available
+       if (not $self->{target3}->have_ads()) {
+              return "UNKNOWN";
+       }
+
+       my $env = $self->provision_ad_dc(
+               $path,
+               "proclimitdc",
+               "PROCLIMITDOM",
+               "proclimit.samba.example.com",
+               "max smbd processes = 20");
+       unless ($env) {
+               return undef;
+       }
+
+       $env->{NSS_WRAPPER_MODULE_SO_PATH} = undef;
+       $env->{NSS_WRAPPER_MODULE_FN_PREFIX} = undef;
+
+       if (not defined($self->check_or_start($env, "standard"))) {
+           return undef;
+       }
+
+       my $upn_array = ["$env->{REALM}.upn"];
+       my $spn_array = ["$env->{REALM}.spn"];
+
+       $self->setup_namespaces($env, $upn_array, $spn_array);
+
+       return $env;
+}
+
 # Sets up a DC that's solely used to do a domain backup from. We then use the
 # backupfrom-DC to create the restore-DC - this proves that the backup/restore
 # process will create a Samba DC that will actually start up.
@@ -2795,7 +2855,8 @@ sub restore_backup_file
 # (without actually doing a 'domain join')
 sub prepare_dc_testenv
 {
-       my ($self, $prefix, $dcname, $domain, $realm, $password) = @_;
+       my ($self, $prefix, $dcname, $domain, $realm,
+               $password, $conf_options) = @_;
 
        my $ctx = $self->provision_raw_prepare($prefix, "domain controller",
                                               $dcname,
@@ -2816,6 +2877,7 @@ sub prepare_dc_testenv
        push(@{$ctx->{directories}}, "$ctx->{share}");
 
        $ctx->{smb_conf_extra_options} = "
+       $conf_options
        max xmit = 32K
        server max protocol = SMB2
 
@@ -2858,10 +2920,16 @@ sub setup_restoredc
        my ($self, $prefix, $dcvars) = @_;
        print "Preparing RESTORE DC...\n";
 
+       # we arbitrarily designate the restored DC as having SMBv1 disabled
+       my $extra_conf = "
+       server min protocol = SMB2
+       client min protocol = SMB2";
+
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "restoredc",
                                                    $dcvars->{DOMAIN},
                                                    $dcvars->{REALM},
-                                                   $dcvars->{PASSWORD});
+                                                   $dcvars->{PASSWORD},
+                                                   $extra_conf);
 
        # create a backup of the 'backupfromdc'
        my $backupdir = File::Temp->newdir();
@@ -2902,7 +2970,7 @@ sub setup_renamedc
        my $realm = "renamedom.samba.example.com";
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "renamedc",
                                                    "RENAMEDOMAIN", $realm,
-                                                   $dcvars->{PASSWORD});
+                                                   $dcvars->{PASSWORD}, "");
 
        # create a backup of the 'backupfromdc' which renames the domain
        my $backupdir = File::Temp->newdir();
@@ -2949,7 +3017,7 @@ sub setup_offlinebackupdc
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "offlinebackupdc",
                                                    $dcvars->{DOMAIN},
                                                    $dcvars->{REALM},
-                                                   $dcvars->{PASSWORD});
+                                                   $dcvars->{PASSWORD}, "");
 
        # create an offline backup of the 'backupfromdc' target
        my $backupdir = File::Temp->newdir();
@@ -2993,7 +3061,7 @@ sub setup_labdc
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, "labdc",
                                                    "LABDOMAIN",
                                                    "labdom.samba.example.com",
-                                                   $dcvars->{PASSWORD});
+                                                   $dcvars->{PASSWORD}, "");
 
        # create a backup of the 'backupfromdc' which renames the domain and uses
        # the --no-secrets option to scrub any sensitive info
@@ -3099,7 +3167,7 @@ sub setup_customdc
 
        # create a placeholder directory and smb.conf, as well as the env vars.
        my ($env, $ctx) = $self->prepare_dc_testenv($prefix, $dc_name,
-                                                   $domain, $realm, $password);
+                                                   $domain, $realm, $password, "");
 
        # restore the specified backup file to populate the testenv
        my $restore_dir = abs_path($prefix);