selftest: Fix Samba::bindir_path() with a valid directory.
[nivanova/samba-autobuild/.git] / selftest / target / Samba.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 Samba;
7
8 use strict;
9 use target::Samba3;
10 use target::Samba4;
11 use POSIX;
12 use Cwd qw(abs_path);
13
14 sub new($$$$$) {
15         my ($classname, $bindir, $ldap, $srcdir, $server_maxtime) = @_;
16
17         my $self = {
18             samba3 => new Samba3($bindir, $srcdir, $server_maxtime),
19             samba4 => new Samba4($bindir, $ldap, $srcdir, $server_maxtime),
20         };
21         bless $self;
22         return $self;
23 }
24
25 sub setup_env($$$)
26 {
27         my ($self, $envname, $path) = @_;
28
29         $ENV{ENVNAME} = $envname;
30
31         my $env = $self->{samba4}->setup_env($envname, $path);
32         if (defined($env) and $env ne "UNKNOWN") {
33             if (not defined($env->{target})) {
34                 $env->{target} = $self->{samba4};
35             }
36         } elsif (defined($env) and $env eq "UNKNOWN") {
37                 $env = $self->{samba3}->setup_env($envname, $path);
38                 if (defined($env) and $env ne "UNKNOWN") {
39                     if (not defined($env->{target})) {
40                         $env->{target} = $self->{samba3};
41                     }
42                 }
43         }
44         if (defined($env) and ($env eq "UNKNOWN")) {
45                 warn("Samba can't provide environment '$envname'");
46                 return "UNKNOWN";
47         }
48         if (not defined $env) {
49                 warn("failed to start up environment '$envname'");
50                 return undef;
51         }
52         return $env;
53 }
54
55 sub bindir_path($$) {
56         my ($object, $path) = @_;
57
58         my $valpath = "$object->{bindir}/$path";
59
60         return $valpath if (-f $valpath or -d $valpath);
61         return $path;
62 }
63
64 sub nss_wrapper_winbind_so_path($) {
65         my ($object) = @_;
66         my $ret = $ENV{NSS_WRAPPER_WINBIND_SO_PATH};
67         if (not defined($ret)) {
68             $ret = bindir_path($object, "shared/libnss_wrapper_winbind.so.2");
69             $ret = abs_path($ret);
70         }
71         return $ret;
72 }
73
74 sub mk_krb5_conf($$)
75 {
76         my ($ctx) = @_;
77
78         unless (open(KRB5CONF, ">$ctx->{krb5_conf}")) {
79                 warn("can't open $ctx->{krb5_conf}$?");
80                 return undef;
81         }
82
83         my $our_realms_stanza = mk_realms_stanza($ctx->{realm},
84                                                  $ctx->{dnsname},
85                                                  $ctx->{domain},
86                                                  $ctx->{kdc_ipv4});
87         print KRB5CONF "
88 #Generated krb5.conf for $ctx->{realm}
89
90 [libdefaults]
91  default_realm = $ctx->{realm}
92  dns_lookup_realm = false
93  dns_lookup_kdc = true
94  ticket_lifetime = 24h
95  forwardable = yes
96  allow_weak_crypto = yes
97
98 [realms]
99  $our_realms_stanza
100 ";
101
102
103         if (defined($ctx->{tlsdir})) {
104                print KRB5CONF "
105
106 [appdefaults]
107         pkinit_anchors = FILE:$ctx->{tlsdir}/ca.pem
108
109 [kdc]
110         enable-pkinit = true
111         pkinit_identity = FILE:$ctx->{tlsdir}/kdc.pem,$ctx->{tlsdir}/key.pem
112         pkinit_anchors = FILE:$ctx->{tlsdir}/ca.pem
113
114 ";
115         }
116         close(KRB5CONF);
117 }
118
119 sub mk_realms_stanza($$$$)
120 {
121         my ($realm, $dnsname, $domain, $kdc_ipv4) = @_;
122         my $lc_domain = lc($domain);
123         
124         my $realms_stanza = "
125  $realm = {
126   kdc = $kdc_ipv4:88
127   admin_server = $kdc_ipv4:88
128   default_domain = $dnsname
129  }
130  $dnsname = {
131   kdc = $kdc_ipv4:88
132   admin_server = $kdc_ipv4:88
133   default_domain = $dnsname
134  }
135  $domain = {
136   kdc = $kdc_ipv4:88
137   admin_server = $kdc_ipv4:88
138   default_domain = $dnsname
139  }
140  $lc_domain = {
141   kdc = $kdc_ipv4:88
142   admin_server = $kdc_ipv4:88
143   default_domain = $dnsname
144  }
145
146 ";
147         return $realms_stanza;
148 }
149
150 sub get_interface($)
151 {
152     my ($netbiosname) = @_;
153     $netbiosname = lc($netbiosname);
154
155     my %interfaces = ();
156     $interfaces{"localnt4dc2"} = 3;
157     $interfaces{"localnt4member3"} = 4;
158     $interfaces{"localshare4"} = 5;
159
160     $interfaces{"localktest6"} = 7;
161     $interfaces{"maptoguest"} = 8;
162     $interfaces{"localnt4dc9"} = 9;
163
164     # 11-16 used by selftest.pl for client interfaces
165
166     $interfaces{"localdc"} = 21;
167     $interfaces{"localvampiredc"} = 22;
168     $interfaces{"s4member"} = 23;
169     $interfaces{"localrpcproxy"} = 24;
170     $interfaces{"dc5"} = 25;
171     $interfaces{"dc6"} = 26;
172     $interfaces{"dc7"} = 27;
173     $interfaces{"rodc"} = 28;
174     $interfaces{"localadmember"} = 29;
175     $interfaces{"addc"} = 30;
176     $interfaces{"localsubdc"} = 31;
177     $interfaces{"chgdcpass"} = 32;
178     $interfaces{"promotedvdc"} = 33;
179     $interfaces{"rfc2307member"} = 34;
180     $interfaces{"fileserver"} = 35;
181
182     # update lib/socket_wrapper/socket_wrapper.c
183     #  #define MAX_WRAPPED_INTERFACES 40
184     # if you wish to have more than 40 interfaces
185
186     if (not defined($interfaces{$netbiosname})) {
187         die();
188     }
189
190     return $interfaces{$netbiosname};
191 }
192
193 sub cleanup_child($$)
194 {
195     my ($pid, $name) = @_;
196     my $childpid = -1;
197
198     if (defined($pid)) {
199         $childpid = waitpid($pid, WNOHANG);
200     }
201
202     if ($childpid == 0) {
203     } elsif ($childpid < 0) {
204         printf STDERR "%s child process %d isn't here any more\n",
205         return $childpid;
206     }
207     elsif ($? & 127) {
208         printf STDERR "%s child process %d, died with signal %d, %s coredump\n",
209         $name, $childpid, ($? & 127),  ($? & 128) ? 'with' : 'without';
210     } else {
211         printf STDERR "%s child process %d exited with value %d\n", $name, $childpid, $? >> 8;
212     }
213     return $childpid;
214 }
215
216 1;