fa51dba3a2d6d002ff133465c8cb37a169ce516c
[kai/samba.git] / source / script / tests / 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 setup_env($$$)
51 {
52         my ($self, $envname, $path) = @_;
53         
54         if ($envname eq "dc") {
55                 return $self->setup_dc("$path/dc");
56         } else {
57                 die("Samba4 can't provide environment '$envname'");
58         }
59 }
60
61 sub setup_dc($$)
62 {
63         my ($self, $path) = @_;
64
65         my $vars = $self->provision($path);
66
67         $self->check_or_start($vars, ($ENV{NMBD_MAXTIME} or 2700), ($ENV{SMBD_MAXTIME} or 2700));
68
69         $self->wait_for_start($vars);
70
71         return $vars;
72 }
73
74 sub stop($)
75 {
76         my ($self) = @_;
77 }
78
79 sub samba3_stop_sig_term($$) {
80         my ($self, $piddir) = @_;
81         my $ret = 0;
82         kill("USR1", `cat $piddir/timelimit.nmbd.pid`) or \
83                 kill("ALRM", `cat $piddir/timelimit.nmbd.pid`) or $ret++;
84
85         kill("USR1", `cat $piddir/timelimit.smbd.pid`) or \
86                 kill("ALRM", `cat $piddir/timelimit.smbd.pid`) or $ret++;
87
88         return $ret;
89 }
90
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`);
95         return 0;
96 }
97
98 sub check_or_start($$$$) {
99         my ($self, $env_vars, $nmbd_maxtime, $smbd_maxtime) = @_;
100
101         unlink($env_vars->{NMBD_TEST_LOG});
102         print "STARTING NMBD...";
103         my $pid = fork();
104         if ($pid == 0) {
105                 open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
106                 open STDERR, '>&STDOUT';
107         
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: $!");
110         }
111         open(PID, ">$env_vars->{PIDDIR}/timelimit.nmbd.pid");
112         print PID $pid;
113         close(PID);
114         print "DONE\n";
115
116         unlink($env_vars->{SMBD_TEST_LOG});
117         print "STARTING SMBD...";
118         my $pid = fork();
119         if ($pid == 0) {
120                 open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
121                 open STDERR, '>&STDOUT';
122         
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: $!");
125         }
126         open(PID, ">$env_vars->{PIDDIR}/timelimit.smbd.pid");
127         print PID $pid;
128         close(PID);
129         print "DONE\n";
130
131         return 0;
132 }
133
134 sub create_clientconf($$$)
135 {
136         my ($self, $prefix, $domain) = @_;
137
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";
144
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");
147         print CONF "
148 [global]
149         workgroup = $domain
150
151         private dir = $privatedir
152         pid directory = $piddir
153         lock directory = $lockdir
154         log file = $logdir/log.\%m
155         log level = 0
156
157         name resolve order = bcast
158
159         netbios name = TORTURE_6
160         interfaces = $torture_interfaces
161         panic action = $scriptdir/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)
162
163         passdb backend = tdbsam
164         ";
165         close(CONF);
166 }
167
168 sub provision($$)
169 {
170         my ($self, $prefix) = @_;
171
172         ##
173         ## setup the various environment variables we need
174         ##
175
176         my %ret = ();
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";
181
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";
193
194         ## 
195         ## create the test directory layout
196         ##
197         mkdir($prefix_abs);
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";
202         mkdir($tmpdir);
203         chmod 0777, $tmpdir;
204
205         open(CONF, ">$conffile") or die("Unable to open $conffile");
206         print CONF "
207 [global]
208         workgroup = $domain
209
210         private dir = $privatedir
211         pid directory = $piddir
212         lock directory = $lockdir
213         log file = $logdir/log.\%m
214         log level = 0
215
216         name resolve order = bcast
217
218         netbios name = $server
219         interfaces = $server_ip/8
220         bind interfaces only = yes
221         panic action = $scriptdir/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
222
223         passdb backend = tdbsam
224
225         ; Necessary to add the build farm hacks
226         add user script = /bin/false
227         add machine script = /bin/false
228
229         kernel oplocks = no
230         kernel change notify = no
231
232         syslog = no
233         printing = bsd
234         printcap name = /dev/null
235
236 [tmp]
237         path = $tmpdir
238         read only = no
239         smbd:sharedelay = 100000
240         map hidden = yes
241         map system = yes
242         create mask = 755
243 [hideunread]
244         copy = tmp
245         hide unreadable = yes
246 [hideunwrite]
247         copy = tmp
248         hide unwriteable files = yes
249 [print1]
250         copy = tmp
251         printable = yes
252         printing = test
253 [print2]
254         copy = print1
255 [print3]
256         copy = print1
257 [print4]
258         copy = print1
259         ";
260         close(CONF);
261
262         ##
263         ## create a test account
264         ##
265
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");
269
270         print "DONE\n";
271
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;
283         return \%ret;
284 }
285
286 sub wait_for_start($$)
287 {
288         my ($self, $envvars) = @_;
289
290         # give time for nbt server to register its names
291         print "delaying for nbt name registration\n";
292         sleep(10);
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");
303
304         print $self->getlog_env($envvars);
305 }
306
307 1;