Subject: Developers of Sympa
List archive
- From: Francis Lachapelle <address@concealed>
- To: address@concealed
- Subject: [sympa-dev] alias_manager.pl > LDAP (Sympa 5.1)
- Date: Thu, 16 Mar 2006 10:30:41 -0500
Hi,
Almost two years ago, my good friend Ludovic Marcotte modified the
alias_manger.pl script to be fully LDAP-aware
(http://listes.cru.fr/sympa/arc/sympa-dev/2004-06/msg00001.html).
Kazuo Moriwaka seems to have modified the script to make it work with
Sympa 5.0.1
(http://listes.cru.fr/sympa/arc/sympa-dev/2005-07/msg00008.html).
However, it seems that his patched script was not attached to his
message nor added to the contributed software page.
I attached to this message a new version of this script that works with
Sympa 5.1.2.
Comments are welcome!
Thanks,
Francis
#!/usr/bin/perl
$ENV{'PATH'} = '';
## Load Sympa.conf
use strict;
use lib '/usr/lib/sympa/bin';
use Conf;
use POSIX;
require "tools.pl";
require "tt2.pl";
use Net::LDAP;
unless (Conf::load('/etc/sympa.conf')) {
print gettext("The configuration file /etc/sympa.conf contains errors.\n");
exit(1);
}
## LDAP configuration
my $ldap_connection = undef;
my $ldap_host = "localhost";
my $ldap_search_base = "dc=example,dc=com";
my $ldap_bind_dn = "cn=admin,dc=example,dc=com";
my $ldap_bind_pw = "password";
my $ldap_mail_attribute = "mail";
my $ldap_sample_dn = "uid={ALIAS},ou=list,dc=example,dc=com";
my %ldap_attributes = ("objectClass" => ["top","person", "organizationalPerson", "inetOrgPerson", "qmailUser"],
"cn" => ['{ALIAS}'],
"sn" => ['{ALIAS}'],
"uid" => ['{ALIAS}'],
"deliveryProgramPath" => ['{COMMAND}']
);
my $default_domain;
my ($operation, $listname, $domain, $file) = @ARGV;
if (($operation !~ /^(add)|(del)$/) || ($#ARGV < 2)) {
printf "Usage: $0 <add|del> <listname> <domain> [<file>]\n";
exit(2);
}
$default_domain = $Conf{'domain'};
my %data;
$data{'date'} = &POSIX::strftime("%d %b %Y", localtime(time));
$data{'list'}{'domain'} = $data{'robot'} = $domain;
$data{'list'}{'name'} = $listname;
$data{'default_domain'} = $default_domain;
$data{'is_default_domain'} = 1 if ($domain eq $default_domain);
my @aliases ;
my $tt2_include_path = [$Conf{'etc'}.'/'.$domain,
$Conf{'etc'},
'/usr/share/sympa'];
my $aliases_dump;
&tt2::parse_tt2(\%data, 'list_aliases.tt2',\$aliases_dump, $tt2_include_path);
@aliases = split /\n/, $aliases_dump;
unless (@aliases) {
print STDERR "No aliases defined\n";
exit(15);
}
if ($operation eq 'add') {
## Check existing aliases
if (&already_defined(@aliases)) {
print STDERR "some alias already exist\n";
exit(13);
}
if (!&initialize_ldap) {
print STDERR "Can't bind to LDAP server\n";
exit(14);
}
foreach my $alias (@aliases) {
if ($alias =~ /^\#/) {
next;
}
$alias =~ /^([^:]+):\s*(\".*\")$/;
my $alias_value = $1;
my $command_value = $2;
if ($command_value =~ m/bouncequeue/) {
$command_value = "sympabounce";
} else{
$command_value = "sympa";
}
# We create the new LDAP entry.
my $entry = Net::LDAP::Entry->new;
# We add the required mail attribute
$entry->add($ldap_mail_attribute, $alias_value."\@".$domain);
# We substitute all occurences of + by - for the rest of the attributes, including the dn.
# The rationale behind this is that the "uid" attribute prevents the use of the '+' character.
$alias_value =~ s/\+/\-/g;
# We set the dn
my $value = $ldap_sample_dn;
$value =~ s/{ALIAS}/$alias_value/;
$entry->dn($value);
# We add the rest of the attributes
foreach my $hash_key (keys %ldap_attributes) {
foreach my $hash_value (@{$ldap_attributes{$hash_key}}) {
$value = $hash_value;
$value =~ s/{ALIAS}/$alias_value/;
$value =~ s/{COMMAND}/$command_value/;
$entry->add($hash_key, $value);
}
}
# We finally add the entry
my $msg = $ldap_connection->add($entry);
if ($msg->is_error()) {
print STDERR "Can't add entry for $alias_value\@$domain: ",$msg->error(),"\n";
exit(15);
}
$entry = undef;
}
&finalize_ldap;
}
elsif ($operation eq 'del') {
if (!&initialize_ldap) {
print STDERR "Can't bind to LDAP server\n";
exit(7);
}
foreach my $alias (@aliases) {
if ($alias =~ /^\#/) {
next;
}
$alias =~ /^([^:]+):/;
my $alias_value = $1;
$alias_value =~ s/\+/\-/g;
my $value = $ldap_sample_dn;
$value =~ s/{ALIAS}/$alias_value/;
$ldap_connection->delete($value);
}
&finalize_ldap;
}
else {
print STDERR "Action $operation not implemented yet\n";
exit(2);
}
exit 0;
## Check if an alias is already defined
sub already_defined {
my @aliases = @_;
&initialize_ldap;
foreach my $alias (@aliases) {
$alias =~ /^([^:]+):/;
my $source_result = $ldap_connection->search(filter => "(".$ldap_mail_attribute."=".$1."\@".$domain.")",
base => $ldap_search_base);
if ($source_result->count != 0) {
print STRERR "Alias already defined : $1\n";
&finalize_ldap;
return 1;
}
}
&finalize_ldap;
return 0;
}
## Initialize the LDAP connection
sub initialize_ldap {
unless ($ldap_connection = Net::LDAP->new($ldap_host), version => 3) {
print STDERR "Can't connect to LDAP server $ldap_host: $@\n";
return 0;
}
my $msg = $ldap_connection->bind($ldap_bind_dn, password => $ldap_bind_pw);
if ($msg->is_error()) {
print STDERR "Can't bind to server $ldap_host: ",$msg->error(),"\n";
return 0;
}
return 1;
}
## Close the LDAP connection
sub finalize_ldap {
if (defined $ldap_connection) {
$ldap_connection->unbind;
$ldap_connection = undef;
}
}
-
[sympa-dev] alias_manager.pl > LDAP (Sympa 5.1),
Francis Lachapelle, 03/16/2006
-
Re: [sympa-dev] alias_manager.pl > LDAP (Sympa 5.1),
Olivier Salaün - CRU, 03/20/2006
-
Re: [sympa-dev] alias_manager.pl > LDAP (Sympa 5.1),
Kazuo Moriwaka, 03/22/2006
- Re: [sympa-dev] alias_manager.pl > LDAP (Sympa 5.1), Olivier Salaün - CRU, 03/22/2006
-
Re: [sympa-dev] alias_manager.pl > LDAP (Sympa 5.1),
Kazuo Moriwaka, 03/22/2006
-
Re: [sympa-dev] alias_manager.pl > LDAP (Sympa 5.1),
Olivier Salaün - CRU, 03/20/2006
Archive powered by MHonArc 2.6.19+.