use strict;
use File::Basename;
my $configured = "/var/db/.configureLocalKDC";
my $progname = basename ($0);
chdir '/' or die "chdir: $!\n";
if ($< != 0) {
print 'Error: '. $progname ." needs to be run by root\n";
exit 1;
}
umask 022;
close STDOUT;
open STDOUT, ">>/Library/Logs/LKDC-setup.log" || die "Failed to open STDOUT";
open STDERR, ">&STDOUT" || die "Failed to open STDERR";
system("date");
my $hod_admin = '/System/Library/PrivateFrameworks/Heimdal.framework/Helpers/hod-admin';
my $system_keychain = '/Library/Keychains/System.keychain';
my $restore = 0;
my $argc = scalar @ARGV;
my $i;
for ($i = 0; $i < $argc; ++$i) {
if ($ARGV[$i] eq '--plist') {
} elsif ($ARGV[$i] eq '--source') {
$restore = 1;
die "Error: --source requires an argument\n" unless ++$i < $argc;
} elsif ($ARGV[$i] eq '--source-version') {
die "Error: --source-version requires an argument\n" unless ++$i < $argc;
} elsif ($ARGV[$i] eq '--mode') {
die "Error: --mode requires an argument\n" unless ++$i < $argc;
} else {
die "Error: unknown argument $ARGV[$i]\n";
}
}
if ($restore) {
unlink $configured;
print "lkdc restore trigger re-setup of LKDC on next boot\n";
exit 0;
}
my $res;
if (! -f $system_keychain) {
system '/usr/sbin/systemkeychain', '-C';
}
printf("creating system keychain entries\n");
$res = system '/usr/bin/certtool', 'C', 'com.apple.systemdefault', 'u', 'P', 'v';
if ($res != 0) {
unlink $configured;
die "cert tool failed for com.apple.systemdefault";
}
$res = system '/usr/bin/certtool', 'C', 'com.apple.kerberos.kdc', 'u', 'P', 'v', 'x=S';
if ($res != 0) {
unlink $configured;
die "cert tool failed for com.apple.kerberos.kdc";
}
$res = system '/System/Library/PrivateFrameworks/KerberosHelper.framework/Helpers/lkdc_acl',
'-s', 'com.apple.kerberos.kdc', '-a',
'/System/Library/PrivateFrameworks/Heimdal.framework/Helpers/kdc';
if ($res != 0) {
print "ldkc_acl failed with: $res\n";
}
$res = system $hod_admin, '.', 'setup-lkdc';
if ($res != 0) {
print "hod-admin . setup-lkdc failed with: $res\n";
}
if ($res eq 0) {
print "Done LKDC setup\n";
system "touch", $configured;
system 'killall', '-9', 'kdc', 'digest-service';
} else {
print "Failed LKDC setup\n";
unlink $configured;
}