r22305: fix make test using a absolute path for
[samba.git] / source4 / script / tests / Samba4.pm
1 #!/usr/bin/perl
2 # Bootstrap Samba and run a number of tests against it.
3 # Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@samba.org>
4 # Published under the GNU GPL, v3 or later.
5
6 package Samba4;
7
8 use strict;
9 use Cwd qw(abs_path);
10 use FindBin qw($RealBin);
11 use POSIX;
12
13 sub new($$$$) {
14         my ($classname, $bindir, $ldap, $setupdir) = @_;
15         my $self = { 
16                 vars => {}, 
17                 ldap => $ldap, 
18                 bindir => $bindir, 
19                 setupdir => $setupdir 
20         };
21         bless $self;
22         return $self;
23 }
24
25 sub slapd_start($$)
26 {
27         my $count = 0;
28         my ($self, $env_vars) = @_;
29
30         my $uri = $env_vars->{LDAP_URI};
31
32         # running slapd in the background means it stays in the same process group, so it can be
33         # killed by timelimit
34         if ($self->{ldap} eq "fedora") {
35                 system("$ENV{FEDORA_DS_PREFIX}/sbin/ns-slapd -D $env_vars->{FEDORA_DS_DIR} -d0 -i $env_vars->{FEDORA_DS_PIDFILE}> $env_vars->{LDAPDIR}/logs 2>&1 &");
36         } elsif ($self->{ldap} eq "openldap") {
37                 my $oldpath = $ENV{PATH};
38                 $ENV{PATH} = "/usr/local/sbin:/usr/sbin:/sbin:$ENV{PATH}";
39                 system("slapd -d0 -f $env_vars->{SLAPD_CONF} -h $uri > $env_vars->{LDAPDIR}/logs 2>&1 &");
40                 $ENV{PATH} = $oldpath;
41         }
42         while (system("$self->{bindir}/ldbsearch -H $uri -s base -b \"\" supportedLDAPVersion > /dev/null") != 0) {
43                 $count++;
44                 if ($count > 10) {
45                     $self->slapd_stop($env_vars);
46                     return 0;
47                 }
48                 sleep(1);
49         }
50         return 1;
51 }
52
53 sub slapd_stop($$)
54 {
55         my ($self, $envvars) = @_;
56         if ($self->{ldap} eq "fedora") {
57                 system("$envvars->{LDAPDIR}/slapd-samba4/stop-slapd");
58         } elsif ($self->{ldap} eq "openldap") {
59                 open(IN, "<$envvars->{OPENLDAP_PIDFILE}") or 
60                         die("unable to open slapd pid file: $envvars->{OPENLDAP_PIDFILE}");
61                 kill 9, <IN>;
62                 close(IN);
63         }
64 }
65
66 sub check_or_start($$$) 
67 {
68         my ($self, $env_vars, $max_time) = @_;
69         return 0 if ( -p $env_vars->{SMBD_TEST_FIFO});
70
71         unlink($env_vars->{SMBD_TEST_FIFO});
72         POSIX::mkfifo($env_vars->{SMBD_TEST_FIFO}, 0700);
73         unlink($env_vars->{SMBD_TEST_LOG});
74         
75         print "STARTING SMBD... ";
76         my $pid = fork();
77         if ($pid == 0) {
78                 open STDIN, $env_vars->{SMBD_TEST_FIFO};
79                 open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
80                 open STDERR, '>&STDOUT';
81                 
82                 SocketWrapper::set_default_iface(1);
83                 
84                 # Start slapd before smbd, but with the fifo on stdin
85                 if (defined($self->{ldap})) {
86                     $self->slapd_start($env_vars) or 
87                         die("couldn't start slapd");
88                     
89                     print "LDAP PROVISIONING...";
90                     $self->provision_ldap($env_vars);
91                 }
92                 
93                 my $valgrind = "";
94                 if (defined($ENV{SMBD_VALGRIND})) {
95                     $valgrind = $ENV{SMBD_VALGRIND};
96                 } 
97
98                 $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG}; 
99
100                 my $optarg = "";
101                 if (defined($max_time)) {
102                         $optarg = "--maximum-runtime=$max_time ";
103                 }
104                 my $ret = system("$valgrind $self->{bindir}/smbd $optarg $env_vars->{CONFIGURATION} -M single -i --leak-report-full");
105                 if ($? == -1) {
106                         print "Unable to start smbd: $ret: $!\n";
107                         exit 1;
108                 }
109                 unlink($env_vars->{SMBD_TEST_FIFO});
110                 my $exit = $? >> 8;
111                 if ( $ret == 0 ) {
112                         print "smbd exits with status $exit\n";
113                 } elsif ( $ret & 127 ) {
114                         print "smbd got signal ".($ret & 127)." and exits with $exit!\n";
115                 } else {
116                         $ret = $? >> 8;
117                         print "smbd failed with status $exit!\n";
118                 }
119                 exit $exit;
120         }
121         print "DONE\n";
122
123         open(DATA, ">$env_vars->{SMBD_TEST_FIFO}");
124
125         return $pid;
126 }
127
128 sub wait_for_start($$)
129 {
130         my ($self, $testenv_vars) = @_;
131         # give time for nbt server to register its names
132         print "delaying for nbt name registration\n";
133
134         # This will return quickly when things are up, but be slow if we 
135         # need to wait for (eg) SSL init 
136         system("bin/nmblookup $testenv_vars->{CONFIGURATION} $testenv_vars->{SERVER}");
137         system("bin/nmblookup $testenv_vars->{CONFIGURATION} -U $testenv_vars->{SERVER} $testenv_vars->{SERVER}");
138         system("bin/nmblookup $testenv_vars->{CONFIGURATION} $testenv_vars->{SERVER}");
139         system("bin/nmblookup $testenv_vars->{CONFIGURATION} -U $testenv_vars->{SERVER} $testenv_vars->{NETBIOSNAME}");
140         system("bin/nmblookup $testenv_vars->{CONFIGURATION} $testenv_vars->{NETBIOSNAME}");
141         system("bin/nmblookup $testenv_vars->{CONFIGURATION} -U $testenv_vars->{SERVER} $testenv_vars->{NETBIOSNAME}");
142         system("bin/nmblookup $testenv_vars->{CONFIGURATION} $testenv_vars->{NETBIOSNAME}");
143         system("bin/nmblookup $testenv_vars->{CONFIGURATION} -U $testenv_vars->{SERVER} $testenv_vars->{NETBIOSNAME}");
144 }
145
146 sub write_ldb_file($$$)
147 {
148         my ($self, $file, $ldif) = @_;
149
150         open(LDIF, "|$self->{bindir}/ldbadd -H $file >/dev/null");
151         print LDIF $ldif;
152         return close(LDIF);
153 }
154
155 sub add_wins_config($$)
156 {
157         my ($self, $privatedir) = @_;
158
159         return $self->write_ldb_file("$privatedir/wins_config.ldb", "
160 dn: name=TORTURE_6,CN=PARTNERS
161 objectClass: wreplPartner
162 name: TORTURE_6
163 address: 127.0.0.6
164 pullInterval: 0
165 pushChangeCount: 0
166 type: 0x3
167 ");
168 }
169
170 sub mk_fedora($$$$$$)
171 {
172         my ($self, $ldapdir, $basedn, $root, $password, $privatedir, $configuration) = @_;
173
174         mkdir($ldapdir);
175
176         my $fedora_ds_inf = "$ldapdir/fedorads.inf";
177         my $fedora_ds_initial_ldif = "$ldapdir/fedorads-initial.ldif";
178
179         #Make the subdirectory be as fedora DS would expect
180         my $fedora_ds_dir = "$ldapdir/slapd-samba4";
181
182         my $pidfile = "$fedora_ds_dir/logs/slapd-samba4.pid";
183
184         open(CONF, ">$fedora_ds_inf");
185         print CONF "
186 [General]
187 SuiteSpotUserID = $root
188 FullMachineName=   localhost
189 ServerRoot=   $ldapdir
190
191 [slapd]
192 ldapifilepath=$ldapdir/ldapi
193 Suffix= $basedn
194 RootDN= cn=Manager,$basedn
195 RootDNPwd= $password
196 ServerIdentifier= samba4
197 InstallLdifFile=$fedora_ds_initial_ldif
198
199 inst_dir= $fedora_ds_dir
200 config_dir= $fedora_ds_dir
201 schema_dir= $fedora_ds_dir/schema
202 lock_dir= $fedora_ds_dir/lock
203 log_dir= $fedora_ds_dir/logs
204 run_dir= $fedora_ds_dir/logs
205 db_dir= $fedora_ds_dir/db
206 bak_dir= $fedora_ds_dir/bak
207 tmp_dir= $fedora_ds_dir/tmp
208 ldif_dir= $fedora_ds_dir/ldif
209 cert_dir= $fedora_ds_dir
210
211 start_server= 0
212 ";
213         close(CONF);
214
215         open(LDIF, ">$fedora_ds_initial_ldif");
216         print LDIF "
217 # These entries need to be added to get the container for the 
218 # provision to be aimed at.
219
220 dn: cn=\"dc=$basedn\",cn=mapping tree,cn=config
221 objectclass: top
222 objectclass: extensibleObject
223 objectclass: nsMappingTree
224 nsslapd-state: backend
225 nsslapd-backend: userData
226 cn: $basedn
227
228 dn: cn=userData,cn=ldbm database,cn=plugins,cn=config
229 objectclass: extensibleObject
230 objectclass: nsBackendInstance
231 nsslapd-suffix: $basedn
232 ";
233         close(LDIF);
234
235         system("perl $ENV{FEDORA_DS_PREFIX}/bin/ds_newinst.pl $fedora_ds_inf >&2") == 0 or return 0;
236
237         foreach(<$fedora_ds_dir/schema/*>) {
238                 unlink unless (/00core.*/);
239         }
240
241         open(LDIF, ">>$fedora_ds_dir/dse.ldif");
242         print LDIF "dn: cn=bitwise,cn=plugins,cn=config
243 objectClass: top
244 objectClass: nsSlapdPlugin
245 objectClass: extensibleObject
246 cn: bitwise
247 nsslapd-pluginPath: $ENV{FEDORA_DS_PREFIX}/lib/fedora-ds/plugins/libbitwise-plugin.so
248 nsslapd-pluginInitfunc: bitwise_init
249 nsslapd-pluginType: matchingRule
250 nsslapd-pluginEnabled: on
251 nsslapd-pluginId: bitwise
252 nsslapd-pluginVersion: 1.1.0a3
253 nsslapd-pluginVendor: Fedora Project
254 nsslapd-pluginDescription: Allow bitwise matching rules
255 ";
256         close(LDIF);
257
258         system("$self->{bindir}/ad2oLschema $configuration -H $privatedir/sam.ldb --option=convert:target=fedora-ds -I $self->{setupdir}/schema-map-fedora-ds-1.0 -O $fedora_ds_dir/schema/99_ad.ldif >&2");
259
260         return ($fedora_ds_dir, $pidfile);
261 }
262
263 sub mk_openldap($$$$$$$$)
264 {
265         my ($self, $ldapdir, $basedn, $password, $privatedir, $dnsname, $configuration, $provision_options) = @_;
266
267         my $slapd_conf = "$ldapdir/slapd.conf";
268         my $pidfile = "$ldapdir/slapd.pid";
269         my $modconf = "$ldapdir/modules.conf";
270
271         mkdir($_) foreach ($ldapdir, "$ldapdir/db", "$ldapdir/db/bdb-logs", 
272                 "$ldapdir/db/tmp");
273
274         open(CONF, ">$slapd_conf");
275         print CONF "
276 loglevel 0
277
278 include $ldapdir/ad.schema
279
280 pidfile         $pidfile
281 argsfile        $ldapdir/slapd.args
282 sasl-realm $dnsname
283 access to * by * write
284
285 allow update_anon
286
287 authz-regexp
288           uid=([^,]*),cn=$dnsname,cn=digest-md5,cn=auth
289           ldap:///$basedn??sub?(samAccountName=\$1)
290
291 authz-regexp
292           uid=([^,]*),cn=([^,]*),cn=digest-md5,cn=auth
293           ldap:///$basedn??sub?(samAccountName=\$1)
294
295 include $modconf
296
297 defaultsearchbase \"$basedn\"
298
299 backend         bdb
300 database        bdb
301 suffix          \"$basedn\"
302 rootdn          \"cn=Manager,$basedn\"
303 rootpw          $password
304 directory       $ldapdir/db
305 index           objectClass eq
306 index           samAccountName eq
307 index name eq
308 index objectSid eq
309 index objectCategory eq
310 index member eq
311 index uidNumber eq
312 index gidNumber eq
313 index unixName eq
314 index privilege eq
315 index nCName eq pres
316 index lDAPDisplayName eq
317 index subClassOf eq
318 index dnsRoot eq
319 index nETBIOSName eq pres
320
321 #syncprov is stable in OpenLDAP 2.3, and available in 2.2.  
322 #We only need this for the contextCSN attribute anyway....
323 overlay syncprov
324 syncprov-checkpoint 100 10
325 syncprov-sessionlog 100
326 ";
327
328         close(CONF);
329
330         open(CONF, ">$ldapdir/db/DB_CONFIG");
331         print CONF "
332 #
333         # Set the database in memory cache size.
334         #
335         set_cachesize   0       524288        0
336         
337         
338         #
339         # Set database flags (this is a test environment, we don't need to fsync()).
340         #               
341         set_flags       DB_TXN_NOSYNC
342         
343         #
344         # Set log values.
345         #
346         set_lg_regionmax        104857
347         set_lg_max              1048576
348         set_lg_bsize            209715
349         set_lg_dir              $ldapdir/db/bdb-logs
350         
351         
352         #
353         # Set temporary file creation directory.
354         #                       
355         set_tmp_dir             $ldapdir/db/tmp
356         ";
357         close(CONF);
358
359         #This uses the provision we just did, to read out the schema
360         system("$self->{bindir}/ad2oLschema $configuration -H $privatedir/sam.ldb -I $self->{setupdir}/schema-map-openldap-2.3 -O $ldapdir/ad.schema >&2");
361
362         #Now create an LDAP baseDN
363         system("$self->{bindir}/smbscript $self->{setupdir}/provision $provision_options --ldap-base >&2");
364
365         my $oldpath = $ENV{PATH};
366         $ENV{PATH} = "/usr/local/sbin:/usr/sbin:/sbin:$ENV{PATH}";
367
368         unlink($modconf);
369         open(CONF, ">$modconf"); close(CONF);
370
371         if (system("slaptest -u -f $slapd_conf >&2") != 0) {
372                 open(CONF, ">$modconf"); 
373                 # enable slapd modules
374                 print CONF "
375 modulepath      /usr/lib/ldap
376 moduleload      back_bdb
377 moduleload      syncprov
378 ";
379                 close(CONF);
380         }
381
382         system("slaptest -u -f $slapd_conf") == 0 or die("slaptest still fails after adding modules");
383         system("slapadd -f $slapd_conf < $privatedir/$dnsname.ldif >/dev/null") == 0 or die("slapadd failed");
384
385     system("slaptest -f $slapd_conf >/dev/null") == 0 or 
386                 die ("slaptest after database load failed");
387     
388         $ENV{PATH} = $oldpath;
389
390         return ($slapd_conf, $pidfile);
391 }
392
393 sub provision($$$$$)
394 {
395         my ($self, $prefix, $server_role, $domain, $netbiosname) = @_;
396
397         my $smbd_loglevel = 1;
398         my $username = "administrator";
399         my $realm = "SAMBA.EXAMPLE.COM";
400         my $dnsname = "samba.example.com";
401         my $basedn = "dc=samba,dc=example,dc=com";
402         my $password = "penguin";
403         my $root = ($ENV{USER} or $ENV{LOGNAME} or `whoami`);
404         my $server = "localhost";
405         my $srcdir="$RealBin/../..";
406         -d $prefix or mkdir($prefix) or die("Unable to create $prefix");
407         my $prefix_abs = abs_path($prefix);
408         my $tmpdir = "$prefix_abs/tmp";
409         my $etcdir = "$prefix_abs/etc";
410         my $piddir = "$prefix_abs/pid";
411         my $conffile = "$etcdir/smb.conf";
412         my $krb5_config = "$etcdir/krb5.conf";
413         my $privatedir = "$prefix_abs/private";
414         my $ncalrpcdir = "$prefix_abs/ncalrpc";
415         my $lockdir= "$prefix_abs/lockdir";
416
417         my $winbindd_socket_dir = "$prefix_abs/winbind_socket";
418         my $configuration = "--configfile=$conffile";
419         my $ldapdir = "$prefix_abs/ldap";
420
421         my $tlsdir = "$privatedir/tls";
422
423         (system("rm -rf $prefix/*") == 0) or die("Unable to clean up");
424         mkdir($_) foreach ($privatedir, $etcdir, $piddir, $ncalrpcdir, $lockdir, 
425                 $tmpdir);
426
427         open(CONFFILE, ">$conffile");
428         print CONFFILE "
429 [global]
430         netbios name = $netbiosname
431         netbios aliases = $server
432         workgroup = $domain
433         realm = $realm
434         private dir = $privatedir
435         pid directory = $piddir
436         ncalrpc dir = $ncalrpcdir
437         lock dir = $lockdir
438         setup directory = $self->{setupdir}
439         js include = $srcdir/scripting/libjs
440         winbindd socket directory = $winbindd_socket_dir
441         name resolve order = bcast
442         interfaces = 127.0.0.1/8
443         tls dh params file = $tlsdir/dhparms.pem
444         panic action = $srcdir/script/gdb_backtrace \%PID% \%PROG%
445         wins support = yes
446         server role = $server_role
447         max xmit = 32K
448         server max protocol = SMB2
449         notify:inotify = false
450         ldb:nosync = true
451         system:anonymous = true
452 #We don't want to pass our self-tests if the PAC code is wrong
453         gensec:require_pac = true
454         log level = $smbd_loglevel
455
456 [tmp]
457         path = $tmpdir
458         read only = no
459         ntvfs handler = posix
460         posix:sharedelay = 100000
461         posix:eadb = $lockdir/eadb.tdb
462
463 [cifs]
464         read only = no
465         ntvfs handler = cifs
466         cifs:server = $netbiosname
467         cifs:share = tmp
468 #There is no username specified here, instead the client is expected
469 #to log in with kerberos, and smbd will used delegated credentials.
470
471 [simple]
472         path = $tmpdir
473         read only = no
474         ntvfs handler = simple
475
476 [cifsposixtestshare]
477         copy = simple
478         ntvfs handler = cifsposix   
479 ";
480         close(CONFFILE);
481
482         die ("Unable to create key blobs") if
483                 (system("TLSDIR=$tlsdir $RealBin/mk-keyblobs.sh") != 0);
484
485         open(KRB5CONF, ">$krb5_config");
486         print KRB5CONF "
487 #Generated krb5.conf for $realm
488
489 [libdefaults]
490  default_realm = $realm
491  dns_lookup_realm = false
492  dns_lookup_kdc = false
493  ticket_lifetime = 24h
494  forwardable = yes
495
496 [realms]
497  $realm = {
498   kdc = 127.0.0.1:88
499   admin_server = 127.0.0.1:88
500   default_domain = $dnsname
501  }
502  $dnsname = {
503   kdc = 127.0.0.1:88
504   admin_server = 127.0.0.1:88
505   default_domain = $dnsname
506  }
507  $domain = {
508   kdc = 127.0.0.1:88
509   admin_server = 127.0.0.1:88
510   default_domain = $dnsname
511  }
512
513 [appdefaults]
514         pkinit_anchors = FILE:$tlsdir/ca.pem
515
516 [kdc]
517         enable-pkinit = true
518         pkinit_identity = FILE:$tlsdir/kdc.pem,$tlsdir/key.pem
519         pkinit_anchors = FILE:$tlsdir/ca.pem
520
521 [domain_realm]
522  .$dnsname = $realm
523 ";
524         close(KRB5CONF);
525
526 #Ensure the config file is valid before we start
527         if (system("$self->{bindir}/testparm $configuration -v --suppress-prompt >/dev/null 2>&1") != 0) {
528                 system("$self->{bindir}/testparm $configuration >&2");
529                 die("Failed to create configuration!");
530         }
531
532         (system("($self->{bindir}/testparm $configuration -v --suppress-prompt --parameter-name=\"netbios name\" --section-name=global 2> /dev/null | grep -i ^$netbiosname ) >/dev/null 2>&1") == 0) or die("Failed to create configuration!");
533
534         my @provision_options = ($configuration);
535         push (@provision_options, "--host-name=$netbiosname");
536         push (@provision_options, "--host-ip=127.0.0.1");
537         push (@provision_options, "--quiet");
538         push (@provision_options, "--domain $domain");
539         push (@provision_options, "--realm $realm");
540         push (@provision_options, "--adminpass $password");
541         push (@provision_options, "--root=$root");
542         push (@provision_options, "--simple-bind-dn=cn=Manager,$basedn");
543         push (@provision_options, "--password=$password");
544         push (@provision_options, "--root=$root");
545
546         (system("$self->{bindir}/smbscript $self->{setupdir}/provision " .  join(' ', @provision_options) . ">&2") == 0) or die("Unable to provision");
547
548         my $ldap_uri= "$ldapdir/ldapi";
549         $ldap_uri =~ s|/|%2F|g;
550         $ldap_uri = "ldapi://$ldap_uri";
551
552         my $ret = {
553                 KRB5_CONFIG => $krb5_config,
554                 PIDDIR => $piddir,
555                 SERVER => $server,
556                 NETBIOSNAME => $netbiosname,
557                 LDAP_URI => $ldap_uri,
558                 DOMAIN => $domain,
559                 USERNAME => $username,
560                 REALM => $realm,
561                 PASSWORD => $password,
562                 LDAPDIR => $ldapdir,
563                 WINBINDD_SOCKET_DIR => $winbindd_socket_dir,
564                 NCALRPCDIR => $ncalrpcdir,
565                 CONFIGURATION => $configuration
566         };
567
568         if (not defined($self->{ldap})) {
569         } elsif ($self->{ldap} eq "openldap") {
570                 ($ret->{SLAPD_CONF}, $ret->{OPENLDAP_PIDFILE}) = $self->mk_openldap($ldapdir, $basedn, $password, $privatedir, $dnsname, $configuration, join(' ', @provision_options)) or die("Unable to create openldap directories");
571         } elsif ($self->{ldap} eq "fedora") {
572                 ($ret->{FEDORA_DS_DIR}, $ret->{FEDORA_DS_PIDFILE}) = $self->mk_fedora($ldapdir, $basedn, $root, $password, $privatedir, $configuration) or die("Unable to create fedora ds directories");
573                 push (@provision_options, "--ldap-module=nsuniqueid");
574         }
575
576         $ret->{PROVISION_OPTIONS} = join(' ', @provision_options);
577
578         return $ret; 
579 }
580
581 sub provision_member($$$)
582 {
583         my ($self, $prefix, $dcvars) = @_;
584         print "PROVISIONING MEMBER...";
585
586         my $ret = $self->provision($prefix, "member server", "SAMBADOMAIN", 
587                 "localmember");
588
589         $ret or die("Unable to provision");
590
591         system("$self->{bindir}/net join $ret->{CONFIGURATION} $dcvars->{DOMAIN} member -U$dcvars->{USERNAME}\%$dcvars->{PASSWORD}") == 0 or die("Join failed");
592
593         $ret->{SMBD_TEST_FIFO} = "$prefix/smbd_test.fifo";
594         $ret->{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
595         return $ret;
596 }
597
598 sub provision_dc($$)
599 {
600         my ($self, $prefix) = @_;
601
602         print "PROVISIONING DC...";
603         my $ret = $self->provision($prefix, "domain controller", "SAMBADOMAIN", 
604                 "localtest");
605
606         $self->add_wins_config("$prefix/private") or 
607                 die("Unable to add wins configuration");
608
609         $ret->{SMBD_TEST_FIFO} = "$prefix/smbd_test.fifo";
610         $ret->{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
611         return $ret;
612 }
613
614 sub provision_ldap($$)
615 {
616         my ($self, $envvars) = @_;
617         my $provision_aci = "";
618         
619         if ($self->{ldap} eq "fedora") {
620                 #it is easier to base64 encode this than correctly escape it:
621                 # (targetattr = "*") (version 3.0;acl "full access to all by all";allow (all)(userdn = "ldap:///anyone");)
622                 $provision_aci = "--aci=aci:: KHRhcmdldGF0dHIgPSAiKiIpICh2ZXJzaW9uIDMuMDthY2wgImZ1bGwgYWNjZXNzIHRvIGFsbCBieSBhbGwiO2FsbG93IChhbGwpKHVzZXJkbiA9ICJsZGFwOi8vL2FueW9uZSIpOykK";
623         }
624
625         system("$self->{bindir}/smbscript $self->{setupdir}/provision $envvars->{PROVISION_OPTIONS} \"$provision_aci\" --ldap-backend=$envvars->{LDAP_URI}") and
626                 die("LDAP PROVISIONING failed: $self->{bindir}/smbscript $self->{setupdir}/provision $envvars->{PROVISION_OPTIONS} \"$provision_aci\" --ldap-backend=$envvars->{LDAP_URI}");
627 }
628
629 sub teardown_env($$)
630 {
631         my ($self, $envvars) = @_;
632
633         close(DATA);
634
635         sleep(2);
636
637         my $failed = $? >> 8;
638
639         if (-f "$envvars->{PIDDIR}/smbd.pid" ) {
640                 open(IN, "<$envvars->{PIDDIR}/smbd.pid") or die("unable to open smbd pid file");
641                 kill 9, <IN>;
642                 close(IN);
643         }
644
645         $self->slapd_stop($envvars) if ($self->{ldap});
646
647         return $failed;
648 }
649
650 sub setup_env($$$)
651 {
652         my ($self, $envname, $path) = @_;
653         
654         if ($envname eq "dc") {
655                 return $self->setup_dc("$path/dc");
656         } elsif ($envname eq "member") {
657                 if (not defined($self->{vars}->{dc})) {
658                         $self->setup_dc("$path/dc");
659                 }
660                 return $self->setup_member("$path/member", $self->{vars}->{dc});
661         } else {
662                 die("Samba4 can't provide environment '$envname'");
663         }
664 }
665
666 sub setup_member($$$$)
667 {
668         my ($self, $path, $dc_vars) = @_;
669
670         my $env = $self->provision_member($path, $dc_vars);
671
672         $self->check_or_start($env, ($ENV{SMBD_MAX_TIME} or 5400));
673
674         $self->wait_for_start($env);
675
676         return $env;
677 }
678
679 sub setup_dc($$)
680 {
681         my ($self, $path) = @_;
682
683         my $env = $self->provision_dc($path);
684
685         $self->check_or_start($env, 
686                 ($ENV{SMBD_MAX_TIME} or 5400));
687
688         $self->wait_for_start($env);
689
690         $self->{vars}->{dc} = $env;
691
692         return $env;
693 }
694
695 sub stop($)
696 {
697         my ($self) = @_;
698 }
699
700 1;