mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
cb786dfd7c
We only need to specify explicit entries for the local realm in order to provision the server. Everything else is handled by real dns or faked dns via resolv wrapper. Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Guenther Deschner <gd@samba.org>
220 lines
4.8 KiB
Perl
220 lines
4.8 KiB
Perl
#!/usr/bin/perl
|
|
# Bootstrap Samba and run a number of tests against it.
|
|
# Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@samba.org>
|
|
# Published under the GNU GPL, v3 or later.
|
|
|
|
package Samba;
|
|
|
|
use strict;
|
|
use target::Samba3;
|
|
use target::Samba4;
|
|
use POSIX;
|
|
use Cwd qw(abs_path);
|
|
|
|
sub new($$$$$) {
|
|
my ($classname, $bindir, $binary_mapping,$ldap, $srcdir, $server_maxtime) = @_;
|
|
|
|
my $self = {
|
|
samba3 => new Samba3($bindir,$binary_mapping, $srcdir, $server_maxtime),
|
|
samba4 => new Samba4($bindir,$binary_mapping, $ldap, $srcdir, $server_maxtime),
|
|
};
|
|
bless $self;
|
|
return $self;
|
|
}
|
|
|
|
sub setup_env($$$)
|
|
{
|
|
my ($self, $envname, $path) = @_;
|
|
|
|
$ENV{ENVNAME} = $envname;
|
|
|
|
my $env = $self->{samba4}->setup_env($envname, $path);
|
|
if (defined($env) and $env ne "UNKNOWN") {
|
|
if (not defined($env->{target})) {
|
|
$env->{target} = $self->{samba4};
|
|
}
|
|
} elsif (defined($env) and $env eq "UNKNOWN") {
|
|
$env = $self->{samba3}->setup_env($envname, $path);
|
|
if (defined($env) and $env ne "UNKNOWN") {
|
|
if (not defined($env->{target})) {
|
|
$env->{target} = $self->{samba3};
|
|
}
|
|
}
|
|
}
|
|
if (defined($env) and ($env eq "UNKNOWN")) {
|
|
warn("Samba can't provide environment '$envname'");
|
|
return "UNKNOWN";
|
|
}
|
|
if (not defined $env) {
|
|
warn("failed to start up environment '$envname'");
|
|
return undef;
|
|
}
|
|
return $env;
|
|
}
|
|
|
|
sub bindir_path($$) {
|
|
my ($object, $path) = @_;
|
|
|
|
if (defined($object->{binary_mapping}->{$path})) {
|
|
$path = $object->{binary_mapping}->{$path};
|
|
}
|
|
|
|
my $valpath = "$object->{bindir}/$path";
|
|
|
|
return $valpath if (-f $valpath);
|
|
return $path;
|
|
}
|
|
|
|
sub nss_wrapper_winbind_so_path($) {
|
|
my ($object) = @_;
|
|
my $ret = $ENV{NSS_WRAPPER_WINBIND_SO_PATH};
|
|
if (not defined($ret)) {
|
|
$ret = bindir_path($object, "shared/libnss_wrapper_winbind.so.2");
|
|
$ret = abs_path($ret);
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
sub mk_krb5_conf($$)
|
|
{
|
|
my ($ctx) = @_;
|
|
|
|
unless (open(KRB5CONF, ">$ctx->{krb5_conf}")) {
|
|
warn("can't open $ctx->{krb5_conf}$?");
|
|
return undef;
|
|
}
|
|
|
|
my $our_realms_stanza = mk_realms_stanza($ctx->{realm},
|
|
$ctx->{dnsname},
|
|
$ctx->{domain},
|
|
$ctx->{kdc_ipv4});
|
|
print KRB5CONF "
|
|
#Generated krb5.conf for $ctx->{realm}
|
|
|
|
[libdefaults]
|
|
default_realm = $ctx->{realm}
|
|
dns_lookup_realm = true
|
|
dns_lookup_kdc = true
|
|
ticket_lifetime = 24h
|
|
forwardable = yes
|
|
allow_weak_crypto = yes
|
|
|
|
[realms]
|
|
$our_realms_stanza
|
|
";
|
|
|
|
|
|
if (defined($ctx->{tlsdir})) {
|
|
print KRB5CONF "
|
|
|
|
[appdefaults]
|
|
pkinit_anchors = FILE:$ctx->{tlsdir}/ca.pem
|
|
|
|
[kdc]
|
|
enable-pkinit = true
|
|
pkinit_identity = FILE:$ctx->{tlsdir}/kdc.pem,$ctx->{tlsdir}/key.pem
|
|
pkinit_anchors = FILE:$ctx->{tlsdir}/ca.pem
|
|
|
|
";
|
|
}
|
|
close(KRB5CONF);
|
|
}
|
|
|
|
sub mk_realms_stanza($$$$)
|
|
{
|
|
my ($realm, $dnsname, $domain, $kdc_ipv4) = @_;
|
|
my $lc_domain = lc($domain);
|
|
|
|
my $realms_stanza = "
|
|
$realm = {
|
|
kdc = $kdc_ipv4:88
|
|
admin_server = $kdc_ipv4:88
|
|
default_domain = $dnsname
|
|
}
|
|
$dnsname = {
|
|
kdc = $kdc_ipv4:88
|
|
admin_server = $kdc_ipv4:88
|
|
default_domain = $dnsname
|
|
}
|
|
$domain = {
|
|
kdc = $kdc_ipv4:88
|
|
admin_server = $kdc_ipv4:88
|
|
default_domain = $dnsname
|
|
}
|
|
$lc_domain = {
|
|
kdc = $kdc_ipv4:88
|
|
admin_server = $kdc_ipv4:88
|
|
default_domain = $dnsname
|
|
}
|
|
|
|
";
|
|
return $realms_stanza;
|
|
}
|
|
|
|
sub get_interface($)
|
|
{
|
|
my ($netbiosname) = @_;
|
|
$netbiosname = lc($netbiosname);
|
|
|
|
my %interfaces = ();
|
|
$interfaces{"localnt4dc2"} = 3;
|
|
$interfaces{"localnt4member3"} = 4;
|
|
$interfaces{"localshare4"} = 5;
|
|
|
|
$interfaces{"localktest6"} = 7;
|
|
$interfaces{"maptoguest"} = 8;
|
|
$interfaces{"localnt4dc9"} = 9;
|
|
|
|
# 11-16 used by selftest.pl for client interfaces
|
|
|
|
$interfaces{"localdc"} = 21;
|
|
$interfaces{"localvampiredc"} = 22;
|
|
$interfaces{"s4member"} = 23;
|
|
$interfaces{"localrpcproxy"} = 24;
|
|
$interfaces{"dc5"} = 25;
|
|
$interfaces{"dc6"} = 26;
|
|
$interfaces{"dc7"} = 27;
|
|
$interfaces{"rodc"} = 28;
|
|
$interfaces{"localadmember"} = 29;
|
|
$interfaces{"addc"} = 30;
|
|
$interfaces{"localsubdc"} = 31;
|
|
$interfaces{"chgdcpass"} = 32;
|
|
$interfaces{"promotedvdc"} = 33;
|
|
$interfaces{"rfc2307member"} = 34;
|
|
|
|
# update lib/socket_wrapper/socket_wrapper.c
|
|
# #define MAX_WRAPPED_INTERFACES 32
|
|
# if you wish to have more than 32 interfaces
|
|
|
|
if (not defined($interfaces{$netbiosname})) {
|
|
die();
|
|
}
|
|
|
|
return $interfaces{$netbiosname};
|
|
}
|
|
|
|
sub cleanup_child($$)
|
|
{
|
|
my ($pid, $name) = @_;
|
|
my $childpid = -1;
|
|
|
|
if (defined($pid)) {
|
|
$childpid = waitpid($pid, WNOHANG);
|
|
}
|
|
|
|
if ($childpid == 0) {
|
|
} elsif ($childpid < 0) {
|
|
printf STDERR "%s child process %d isn't here any more\n",
|
|
return $childpid;
|
|
}
|
|
elsif ($? & 127) {
|
|
printf STDERR "%s child process %d, died with signal %d, %s coredump\n",
|
|
$name, $childpid, ($? & 127), ($? & 128) ? 'with' : 'without';
|
|
} else {
|
|
printf STDERR "%s child process %d exited with value %d\n", $name, $childpid, $? >> 8;
|
|
}
|
|
return $childpid;
|
|
}
|
|
|
|
1;
|