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, $envname, $path) = @_;
54 if ($envname eq "dc") {
55 return $self->setup_dc("$path/dc");
57 die("Samba4 can't provide environment '$envname'");
63 my ($self, $path) = @_;
65 my $vars = $self->provision($path);
67 $self->check_or_start($vars, ($ENV{NMBD_MAXTIME} or 2700), ($ENV{SMBD_MAXTIME} or 2700));
69 $self->wait_for_start($vars);
79 sub samba3_stop_sig_term($$) {
80 my ($self, $piddir) = @_;
82 kill("USR1", `cat $piddir/timelimit.nmbd.pid`) or \
83 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`) or $ret++;
85 kill("USR1", `cat $piddir/timelimit.smbd.pid`) or \
86 kill("ALRM", `cat $piddir/timelimit.smbd.pid`) or $ret++;
91 sub samba3_stop_sig_kill($$) {
92 my ($self, $piddir) = @_;
93 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`);
94 kill("ALRM", `cat $piddir/timelimit.smbd.pid`);
98 sub check_or_start($$$$) {
99 my ($self, $env_vars, $nmbd_maxtime, $smbd_maxtime) = @_;
101 unlink($env_vars->{NMBD_TEST_LOG});
102 print "STARTING NMBD...";
105 open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
106 open STDERR, '>&STDOUT';
108 $ENV{MAKE_TEST_BINARY} = $self->binpath("nmbd");
109 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: $!");
111 open(PID, ">$env_vars->{PIDDIR}/timelimit.nmbd.pid");
116 unlink($env_vars->{SMBD_TEST_LOG});
117 print "STARTING SMBD...";
120 open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
121 open STDERR, '>&STDOUT';
123 $ENV{MAKE_TEST_BINARY} = $self->binpath("smbd");
124 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: $!");
126 open(PID, ">$env_vars->{PIDDIR}/timelimit.smbd.pid");
134 sub create_clientconf($$$)
136 my ($self, $prefix, $domain) = @_;
138 my $lockdir = "$prefix/locks";
139 my $logdir = "$prefix/logs";
140 my $piddir = "$prefix/pid";
141 my $privatedir = "$prefix/private";
142 my $scriptdir = "$RealBin/..";
143 my $conffile = "$prefix/smb.conf";
145 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';
146 open(CONF, ">$conffile");
151 private dir = $privatedir
152 pid directory = $piddir
153 lock directory = $lockdir
154 log file = $logdir/log.\%m
157 name resolve order = bcast
159 netbios name = TORTURE_6
160 interfaces = $torture_interfaces
161 panic action = $scriptdir/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)
163 passdb backend = tdbsam
170 my ($self, $prefix) = @_;
173 ## setup the various environment variables we need
177 my $server = "localhost2";
178 my $server_ip = "127.0.0.2";
179 my $username = `PATH=/usr/ucb:$ENV{PATH} whoami`;
180 my $password = "test";
182 my $srcdir="$RealBin/../..";
183 my $scriptdir="$srcdir/script/tests";
184 my $prefix_abs = abs_path($prefix);
185 my $shrdir="$prefix_abs/tmp";
186 my $libdir="$prefix_abs/lib";
187 my $piddir="$prefix_abs/pid";
188 my $conffile="$libdir/server.conf";
189 my $privatedir="$prefix_abs/private";
190 my $lockdir="$prefix_abs/lockdir";
191 my $logdir="$prefix_abs/logs";
192 my $domain = "SAMBA-TEST";
195 ## create the test directory layout
198 print "CREATE TEST ENVIRONMENT IN '$prefix'...";
199 system("rm -rf $prefix_abs/*");
200 mkdir($_) foreach($privatedir,$libdir,$piddir,$lockdir,$logdir);
201 my $tmpdir = "$prefix_abs/tmp";
205 open(CONF, ">$conffile") or die("Unable to open $conffile");
210 private dir = $privatedir
211 pid directory = $piddir
212 lock directory = $lockdir
213 log file = $logdir/log.\%m
216 name resolve order = bcast
218 netbios name = $server
219 interfaces = $server_ip/8
220 bind interfaces only = yes
221 panic action = $scriptdir/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
223 passdb backend = tdbsam
225 ; Necessary to add the build farm hacks
226 add user script = /bin/false
227 add machine script = /bin/false
230 kernel change notify = no
234 printcap name = /dev/null
239 smbd:sharedelay = 100000
245 hide unreadable = yes
248 hide unwriteable files = yes
263 ## create a test account
266 open(PWD, "|".$self->binpath("smbpasswd")." -c $conffile -L -s -a $username");
267 print PWD "$password\n$password\n";
268 close(PWD) or die("Unable to set password for test account");
272 $ret{SERVER_IP} = $server_ip;
273 $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
274 $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
275 $ret{SERVERCONFFILE} = $conffile;
276 $ret{CONFIGURATION} ="-s $conffile";
277 $ret{SERVER} = $server;
278 $ret{USERNAME} = $username;
279 $ret{DOMAIN} = $domain;
280 $ret{NETBIOSNAME} = $server;
281 $ret{PASSWORD} = $password;
282 $ret{PIDDIR} = $piddir;
286 sub wait_for_start($$)
288 my ($self, $envvars) = @_;
290 # give time for nbt server to register its names
291 print "delaying for nbt name registration\n";
293 # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init
294 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
295 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} __SAMBA__");
296 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
297 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
298 system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} $envvars->{SERVER}");
299 # make sure smbd is also up set
300 print "wait for smbd\n";
301 system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
302 system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
304 print $self->getlog_env($envvars);