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.
10 use FindBin
qw($RealBin);
14 my ($self, $binary) = @_;
16 if (defined($self->{bindir})) {
17 my $path = "$self->{bindir}/$binary";
18 -f $path or die("File $path doesn't exist");
26 my ($classname, $bindir) = @_;
27 my $self = { bindir => $bindir };
34 my ($self, $envvars) = @_;
36 $self->samba3_stop_sig_term($envvars->{PIDDIR});
37 $self->samba3_stop_sig_kill($envvars->{PIDDIR});
44 my ($self, $envvars) = @_;
52 my ($self, $envvars) = @_;
60 my ($self, $envname, $path) = @_;
62 if ($envname eq "dc") {
63 return $self->setup_dc("$path/dc");
65 die("Samba4 can't provide environment '$envname'");
71 my ($self, $path) = @_;
73 my $vars = $self->provision($path);
75 $self->check_or_start($vars, ($ENV{NMBD_MAXTIME} or 2700), ($ENV{SMBD_MAXTIME} or 2700));
77 $self->wait_for_start($vars);
87 sub samba3_stop_sig_term($$) {
88 my ($self, $piddir) = @_;
90 kill("USR1", `cat $piddir/timelimit.nmbd.pid`) or \
91 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`) or $ret++;
93 kill("USR1", `cat $piddir/timelimit.smbd.pid`) or \
94 kill("ALRM", `cat $piddir/timelimit.smbd.pid`) or $ret++;
99 sub samba3_stop_sig_kill($$) {
100 my ($self, $piddir) = @_;
101 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`);
102 kill("ALRM", `cat $piddir/timelimit.smbd.pid`);
106 sub check_or_start($$$$) {
107 my ($self, $env_vars, $nmbd_maxtime, $smbd_maxtime) = @_;
109 unlink($env_vars->{NMBD_TEST_LOG});
110 print "STARTING NMBD...";
113 open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
114 open STDERR, '>&STDOUT';
116 $ENV{MAKE_TEST_BINARY} = $self->binpath("nmbd");
117 exec($self->binpath("timelimit"), $nmbd_maxtime, $self->binpath("nmbd"), "-F", "-S", "--no-process-group", "-d0" ,"-s", $env_vars->{SERVERCONFFILE}) or die("Unable to start nmbd: $!");
119 open(PID, ">$env_vars->{PIDDIR}/timelimit.nmbd.pid");
124 unlink($env_vars->{SMBD_TEST_LOG});
125 print "STARTING SMBD...";
128 open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
129 open STDERR, '>&STDOUT';
131 $ENV{MAKE_TEST_BINARY} = $self->binpath("smbd");
132 exec($self->binpath("timelimit"), $nmbd_maxtime, $self->binpath("smbd"), "-F", "-S", "--no-process-group", "-d0" ,"-s", $env_vars->{SERVERCONFFILE}) or die("Unable to start smbd: $!");
134 open(PID, ">$env_vars->{PIDDIR}/timelimit.smbd.pid");
142 sub create_clientconf($$$)
144 my ($self, $prefix, $domain) = @_;
146 my $lockdir = "$prefix/locks";
147 my $logdir = "$prefix/logs";
148 my $piddir = "$prefix/pid";
149 my $privatedir = "$prefix/private";
150 my $scriptdir = "$RealBin/..";
151 my $conffile = "$prefix/smb.conf";
153 my $torture_interfaces='127.0.0.6/8,127.0.0.7/8,127.0.0.8/8,127.0.0.9/8,127.0.0.10/8,127.0.0.11/8';
154 open(CONF, ">$conffile");
159 private dir = $privatedir
160 pid directory = $piddir
161 lock directory = $lockdir
162 log file = $logdir/log.\%m
165 name resolve order = bcast
167 netbios name = TORTURE_6
168 interfaces = $torture_interfaces
169 panic action = $scriptdir/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)
171 passdb backend = tdbsam
178 my ($self, $prefix) = @_;
181 ## setup the various environment variables we need
185 my $server = "localhost2";
186 my $server_ip = "127.0.0.2";
187 my $username = `PATH=/usr/ucb:$ENV{PATH} whoami`;
188 my $password = "test";
190 my $srcdir="$RealBin/..";
191 my $scriptdir="$srcdir/selftest";
192 my $prefix_abs = abs_path($prefix);
193 my $shrdir="$prefix_abs/tmp";
194 my $libdir="$prefix_abs/lib";
195 my $piddir="$prefix_abs/pid";
196 my $conffile="$libdir/server.conf";
197 my $privatedir="$prefix_abs/private";
198 my $lockdir="$prefix_abs/lockdir";
199 my $logdir="$prefix_abs/logs";
200 my $domain = "SAMBA-TEST";
203 ## create the test directory layout
205 mkdir($prefix_abs, 0777);
206 print "CREATE TEST ENVIRONMENT IN '$prefix'...";
207 system("rm -rf $prefix_abs/*");
208 mkdir($_, 0777) foreach($privatedir,$libdir,$piddir,$lockdir,$logdir);
209 my $tmpdir = "$prefix_abs/tmp";
210 mkdir($tmpdir, 0777);
213 open(CONF, ">$conffile") or die("Unable to open $conffile");
218 private dir = $privatedir
219 pid directory = $piddir
220 lock directory = $lockdir
221 log file = $logdir/log.\%m
224 name resolve order = bcast
226 netbios name = $server
227 interfaces = $server_ip/8
228 bind interfaces only = yes
229 panic action = $scriptdir/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
231 passdb backend = tdbsam
233 ; Necessary to add the build farm hacks
234 add user script = /bin/false
235 add machine script = /bin/false
238 kernel change notify = no
242 printcap name = /dev/null
247 smbd:sharedelay = 100000
253 hide unreadable = yes
256 hide unwriteable files = yes
271 ## create a test account
274 open(PWD, "|".$self->binpath("smbpasswd")." -c $conffile -L -s -a $username");
275 print PWD "$password\n$password\n";
276 close(PWD) or die("Unable to set password for test account");
280 $ret{SERVER_IP} = $server_ip;
281 $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
282 $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
283 $ret{SERVERCONFFILE} = $conffile;
284 $ret{CONFIGURATION} ="-s $conffile";
285 $ret{SERVER} = $server;
286 $ret{USERNAME} = $username;
287 $ret{DOMAIN} = $domain;
288 $ret{NETBIOSNAME} = $server;
289 $ret{PASSWORD} = $password;
290 $ret{PIDDIR} = $piddir;
294 sub wait_for_start($$)
296 my ($self, $envvars) = @_;
298 # give time for nbt server to register its names
299 print "delaying for nbt name registration\n";
301 # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init
302 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
303 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} __SAMBA__");
304 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
305 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
306 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} $envvars->{SERVER}");
307 # make sure smbd is also up set
308 print "wait for smbd\n";
309 system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
310 system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
312 print $self->getlog_env($envvars);