r21743: Always use the 'escaped' LDAPI path.
[Samba.git] / source / script / tests / Samba4.pm
blob65b55fcee003d1e666b11d03db95f7c142c7ea2e
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.
6 package Samba4;
8 use Exporter;
9 @ISA = qw(Exporter);
10 @EXPORT_OK = qw(slapd_start slapd_stop smbd_check_or_start provision);
12 use strict;
13 use FindBin qw($RealBin);
14 use POSIX;
16 sub slapd_start($$$)
18 my $count = 0;
19 my ($bindir, $conf, $uri) = @_;
20 # running slapd in the background means it stays in the same process group, so it can be
21 # killed by timelimit
22 if (defined($ENV{FEDORA_DS_PREFIX})) {
23 system("$ENV{FEDORA_DS_PREFIX}/sbin/ns-slapd -D $ENV{FEDORA_DS_DIR} -d$ENV{FEDORA_DS_LOGLEVEL} > $ENV{LDAPDIR}/logs 2>&1 &");
24 } else {
25 my $oldpath = $ENV{PATH};
26 $ENV{PATH} = "/usr/local/sbin:/usr/sbin:/sbin:$ENV{PATH}";
27 system("slapd -d$ENV{OPENLDAP_LOGLEVEL} -f $conf -h $uri > $ENV{LDAPDIR}/logs 2>&1 &");
28 $ENV{PATH} = $oldpath;
30 while (system("$bindir/ldbsearch -H $uri -s base -b \"\" supportedLDAPVersion > /dev/null") != 0) {
31 $count++;
32 if ($count > 10) {
33 slapd_stop();
34 return 0;
36 sleep(1);
38 return 1;
41 sub slapd_stop()
43 if (defined($ENV{FEDORA_DS_PREFIX})) {
44 system("$ENV{LDAPDIR}/slapd-samba4/stop-slapd");
45 } else {
46 open(IN, "<$ENV{PIDDIR}/slapd.pid") or
47 die("unable to open slapd pid file");
48 kill 9, <IN>;
49 close(IN);
53 sub smbd_check_or_start($$$$$$)
55 my ($bindir, $test_fifo, $test_log, $socket_wrapper_dir, $max_time, $conffile) = @_;
56 return 0 if ( -p $test_fifo );
58 warn("Not using socket wrapper, but also not running as root. Will not be able to listen on proper ports") unless
59 defined($socket_wrapper_dir) or $< == 0;
61 if (defined($socket_wrapper_dir)) {
62 if ( -d $socket_wrapper_dir ) {
63 unlink <$socket_wrapper_dir/*>;
64 } else {
65 mkdir($socket_wrapper_dir);
69 unlink($test_fifo);
70 POSIX::mkfifo($test_fifo, 0700);
71 unlink($test_log);
73 my $valgrind = "";
74 if (defined($ENV{SMBD_VALGRIND})) {
75 $valgrind = $ENV{SMBD_VALGRIND};
78 print "STARTING SMBD...";
79 my $pid = fork();
80 if ($pid == 0) {
81 open STDIN, $test_fifo;
82 open STDOUT, ">$test_log";
83 open STDERR, '>&STDOUT';
84 my $optarg = "";
85 if (defined($max_time)) {
86 $optarg = "--maximum-runtime=$max_time ";
88 my $ret = system("$valgrind $bindir/smbd $optarg -s $conffile -M single -i --leak-report-full");
89 if ($? == -1) {
90 print "Unable to start smbd: $ret: $!\n";
91 exit 1;
93 unlink($test_fifo);
94 unlink(<$socket_wrapper_dir/*>) if (defined($socket_wrapper_dir) and -d $socket_wrapper_dir);
95 my $exit = $? >> 8;
96 if ( $ret == 0 ) {
97 print "smbd exits with status $exit\n";
98 } elsif ( $ret & 127 ) {
99 print "smbd got signal ".($ret & 127)." and exits with $exit!\n";
100 } else {
101 $ret = $? >> 8;
102 print "smbd failed with status $exit!\n";
104 exit $exit;
106 print "DONE\n";
108 return $pid;
111 sub wait_for_start()
113 # give time for nbt server to register its names
114 print "delaying for nbt name registration\n";
116 # This will return quickly when things are up, but be slow if we
117 # need to wait for (eg) SSL init
118 system("bin/nmblookup $ENV{CONFIGURATION} $ENV{SERVER}");
119 system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{SERVER}");
120 system("bin/nmblookup $ENV{CONFIGURATION} $ENV{SERVER}");
121 system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{NETBIOSNAME}");
122 system("bin/nmblookup $ENV{CONFIGURATION} $ENV{NETBIOSNAME}");
123 system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{NETBIOSNAME}");
124 system("bin/nmblookup $ENV{CONFIGURATION} $ENV{NETBIOSNAME}");
125 system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{NETBIOSNAME}");
128 sub provision($)
130 my ($prefix) = @_;
131 my %ret = ();
132 print "PROVISIONING...";
133 open(IN, "$RealBin/mktestsetup.sh $prefix|") or die("Unable to setup");
134 while (<IN>) {
135 die ("Error parsing `$_'") unless (/^([A-Z0-9a-z_]+)=(.*)$/);
136 $ret{$1} = $2;
138 close(IN);
139 return \%ret;
142 sub provision_ldap($$)
144 my ($bindir, $setupdir) = @_;
145 system("$bindir/smbscript $setupdir/provision $ENV{PROVISION_OPTIONS} \"$ENV{PROVISION_ACI}\" --ldap-backend=$ENV{LDAP_URI}") and
146 die("LDAP PROVISIONING failed: $bindir/smbscript $setupdir/provision $ENV{PROVISION_OPTIONS} \"$ENV{PROVISION_ACI}\" --ldap-backend=$ENV{LDAP_URI}");