r24339: Move output functions to separate files.
[kai/samba.git] / source4 / selftest / Samba3.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 Samba3;
7
8 use strict;
9 use Cwd qw(abs_path);
10 use FindBin qw($RealBin);
11
12 sub binpath($$)
13 {
14         my ($self, $binary) = @_;
15
16         if (defined($self->{bindir})) {
17                 my $path = "$self->{bindir}/$binary";
18                 -f $path or die("File $path doesn't exist");
19                 return $path;
20         }
21
22         return $binary;
23 }
24
25 sub new($$) {
26         my ($classname, $bindir) = @_;
27         my $self = { bindir => $bindir };
28         bless $self;
29         return $self;
30 }
31
32 sub teardown_env($$)
33 {
34         my ($self, $envvars) = @_;
35
36         $self->samba3_stop_sig_term($envvars->{PIDDIR});
37         $self->samba3_stop_sig_kill($envvars->{PIDDIR});
38
39         return 0;
40 }
41
42 sub getlog_env($$)
43 {
44         my ($self, $envvars) = @_;
45
46         # TODO...
47         return "";
48 }
49
50 sub check_env($$)
51 {
52         my ($self, $envvars) = @_;
53
54         # TODO ...
55         return 1;
56 }
57
58 sub setup_env($$$)
59 {
60         my ($self, $envname, $path) = @_;
61         
62         if ($envname eq "dc") {
63                 return $self->setup_dc("$path/dc");
64         } else {
65                 die("Samba4 can't provide environment '$envname'");
66         }
67 }
68
69 sub setup_dc($$)
70 {
71         my ($self, $path) = @_;
72
73         my $vars = $self->provision($path);
74
75         $self->check_or_start($vars, ($ENV{NMBD_MAXTIME} or 2700), ($ENV{SMBD_MAXTIME} or 2700));
76
77         $self->wait_for_start($vars);
78
79         return $vars;
80 }
81
82 sub stop($)
83 {
84         my ($self) = @_;
85 }
86
87 sub samba3_stop_sig_term($$) {
88         my ($self, $piddir) = @_;
89         my $ret = 0;
90         kill("USR1", `cat $piddir/timelimit.nmbd.pid`) or \
91                 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`) or $ret++;
92
93         kill("USR1", `cat $piddir/timelimit.smbd.pid`) or \
94                 kill("ALRM", `cat $piddir/timelimit.smbd.pid`) or $ret++;
95
96         return $ret;
97 }
98
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`);
103         return 0;
104 }
105
106 sub check_or_start($$$$) {
107         my ($self, $env_vars, $nmbd_maxtime, $smbd_maxtime) = @_;
108
109         unlink($env_vars->{NMBD_TEST_LOG});
110         print "STARTING NMBD...";
111         my $pid = fork();
112         if ($pid == 0) {
113                 open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
114                 open STDERR, '>&STDOUT';
115         
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: $!");
118         }
119         open(PID, ">$env_vars->{PIDDIR}/timelimit.nmbd.pid");
120         print PID $pid;
121         close(PID);
122         print "DONE\n";
123
124         unlink($env_vars->{SMBD_TEST_LOG});
125         print "STARTING SMBD...";
126         $pid = fork();
127         if ($pid == 0) {
128                 open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
129                 open STDERR, '>&STDOUT';
130         
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: $!");
133         }
134         open(PID, ">$env_vars->{PIDDIR}/timelimit.smbd.pid");
135         print PID $pid;
136         close(PID);
137         print "DONE\n";
138
139         return 0;
140 }
141
142 sub create_clientconf($$$)
143 {
144         my ($self, $prefix, $domain) = @_;
145
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";
152
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");
155         print CONF "
156 [global]
157         workgroup = $domain
158
159         private dir = $privatedir
160         pid directory = $piddir
161         lock directory = $lockdir
162         log file = $logdir/log.\%m
163         log level = 0
164
165         name resolve order = bcast
166
167         netbios name = TORTURE_6
168         interfaces = $torture_interfaces
169         panic action = $scriptdir/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)
170
171         passdb backend = tdbsam
172         ";
173         close(CONF);
174 }
175
176 sub provision($$)
177 {
178         my ($self, $prefix) = @_;
179
180         ##
181         ## setup the various environment variables we need
182         ##
183
184         my %ret = ();
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";
189
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";
201
202         ## 
203         ## create the test directory layout
204         ##
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);
211         chmod 0777, $tmpdir;
212
213         open(CONF, ">$conffile") or die("Unable to open $conffile");
214         print CONF "
215 [global]
216         workgroup = $domain
217
218         private dir = $privatedir
219         pid directory = $piddir
220         lock directory = $lockdir
221         log file = $logdir/log.\%m
222         log level = 0
223
224         name resolve order = bcast
225
226         netbios name = $server
227         interfaces = $server_ip/8
228         bind interfaces only = yes
229         panic action = $scriptdir/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
230
231         passdb backend = tdbsam
232
233         ; Necessary to add the build farm hacks
234         add user script = /bin/false
235         add machine script = /bin/false
236
237         kernel oplocks = no
238         kernel change notify = no
239
240         syslog = no
241         printing = bsd
242         printcap name = /dev/null
243
244 [tmp]
245         path = $tmpdir
246         read only = no
247         smbd:sharedelay = 100000
248         map hidden = yes
249         map system = yes
250         create mask = 755
251 [hideunread]
252         copy = tmp
253         hide unreadable = yes
254 [hideunwrite]
255         copy = tmp
256         hide unwriteable files = yes
257 [print1]
258         copy = tmp
259         printable = yes
260         printing = test
261 [print2]
262         copy = print1
263 [print3]
264         copy = print1
265 [print4]
266         copy = print1
267         ";
268         close(CONF);
269
270         ##
271         ## create a test account
272         ##
273
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");
277
278         print "DONE\n";
279
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;
291         return \%ret;
292 }
293
294 sub wait_for_start($$)
295 {
296         my ($self, $envvars) = @_;
297
298         # give time for nbt server to register its names
299         print "delaying for nbt name registration\n";
300         sleep(10);
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");
311
312         print $self->getlog_env($envvars);
313 }
314
315 1;