You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.4 KiB
56 lines
1.4 KiB
#!@l_prefix@/bin/perl |
|
## |
|
## ypanything.group.pl: LDAP group provider |
|
## |
|
|
|
use IO::File; |
|
use MIME::Base64; |
|
|
|
# configuration |
|
my $host = "localhost"; |
|
my $port = "389"; |
|
my $bindDN = "CN=Directory Manager"; |
|
my $bindPassword = "secret"; |
|
my $base = "O=example.com"; |
|
my $searchType = "sub"; |
|
my $ldapsearch = "@l_prefix@/bin/ldapsearch"; |
|
|
|
# query directory via LDAP |
|
my $ldap = new IO::File |
|
"$ldapsearch -x -LLL -h '$host' -p '$port'" . |
|
" -D '$bindDN' -w '$bindPassword' -b '$base' -s '$searchType'" . |
|
" objectClass=posixGroup" . |
|
" cn userpassword gidnumber memberuid |" |
|
or die "$!"; |
|
my @gr = (); |
|
my $gr; $gr = undef; |
|
while (<$ldap>) { |
|
if (m/^\s*$/) { |
|
if (defined($gr)) { |
|
push(@gr, $gr); |
|
$gr = undef; |
|
} |
|
} |
|
elsif (m/^([^:]+)::\s*(.*?)\s*$/) { |
|
$gr->{$1} .= (defined($gr->{$1}) ? $gr->{$1} . "," : "") . MIME::Base64::decode($2); |
|
} |
|
elsif (m/^([^:]+):\s*(.*?)\s*$/) { |
|
$gr->{$1} = (defined($gr->{$1}) ? $gr->{$1} . "," : "") . $2; |
|
} |
|
} |
|
$ldap->close(); |
|
|
|
# post-processing and output generation |
|
my $O = ""; |
|
foreach my $gr (@gr) { |
|
$gr->{"userpassword"} ||= "*"; |
|
$gr->{"userpassword"} =~ s/\{crypt\}//ig; |
|
$O .= sprintf("%s:%s:%s:%s\n", |
|
$pw->{cn}, $pw->{userpassword}, $pw->{gidnumber}, $pw->{memberuid} |
|
); |
|
} |
|
|
|
# provide output |
|
print STDOUT $O; |
|
exit(0); |
|
|
|
|