diff -r 59c7146ec6f0 -r 66bf85163780 alias.pm --- a/alias.pm Tue Jul 31 10:46:37 2007 +0000 +++ b/alias.pm Fri Feb 21 11:56:39 2014 +0100 @@ -1,4 +1,5 @@ package alias; + # © Heiko Schlittermann # $Id$ # $URL$ @@ -7,17 +8,17 @@ use warnings; use Net::LDAP; use Net::LDAP::Constant qw( - LDAP_ALREADY_EXISTS - LDAP_NO_SUCH_OBJECT - LDAP_NO_SUCH_ATTRIBUTE - LDAP_TYPE_OR_VALUE_EXISTS); + LDAP_ALREADY_EXISTS + LDAP_NO_SUCH_OBJECT + LDAP_NO_SUCH_ATTRIBUTE + LDAP_TYPE_OR_VALUE_EXISTS); use Net::LDAP::Entry; use Text::Wrap; use password; my $Cf; -my ($ldap, $abase, $ubase); +my ( $ldap, $abase, $ubase ); sub _add(); sub _list(); @@ -37,142 +38,151 @@ $Cf = shift; require constant; - import constant OU_ACCOUNTS => $Cf->ldap_ou_accounts; - import constant OU_ALIASES => $Cf->ldap_ou_aliases; - import constant OC_ALIAS => $Cf->ldap_oc_alias; + import constant OU_ACCOUNTS => $Cf->ldap_ou_accounts; + import constant OU_ALIASES => $Cf->ldap_ou_aliases; + import constant OC_ALIAS => $Cf->ldap_oc_alias; import constant AT_FORWARDINGADDRESS => $Cf->ldap_at_forwardingaddress; - import constant AT_GROUP => $Cf->ldap_at_group; - import constant AT_PRIMARYADDRESS => $Cf->ldap_at_primaryaddress; + import constant AT_GROUP => $Cf->ldap_at_group; + import constant AT_PRIMARYADDRESS => $Cf->ldap_at_primaryaddress; $abase = OU_ALIASES . "," . $Cf->ldap_base; $ubase = OU_ACCOUNTS . "," . $Cf->ldap_base; } sub run($) { + # Eigentlich brauchen wir für alles ldap $ldap = new Net::LDAP $Cf->ldap_server or die; - my $r = $ldap->bind($Cf->ldap_bind_dn, - password => $Cf->ldap_password || $ENV{LDAP_PASS} || password::ask("LDAP (". $Cf->ldap_bind_dn .") password: ")); + my $r = $ldap->bind( $Cf->ldap_bind_dn, + password => $Cf->ldap_password + || $ENV{LDAP_PASS} + || password::ask( "LDAP (" . $Cf->ldap_bind_dn . ") password: " ) ); die $r->error, "\n" if $r->code; - - if ($Cf->list) { _list() } - elsif ($Cf->add) { _add() } - elsif ($Cf->delete) { _delete() } - elsif ($Cf->modify) { _modify() } - else { die "Need action (--add|--modify|--list|--delete)\n" }; + if ( $Cf->list ) { _list() } + elsif ( $Cf->add ) { _add() } + elsif ( $Cf->delete ) { _delete() } + elsif ( $Cf->modify ) { _modify() } + else { die "Need action (--add|--modify|--list|--delete)\n" } } sub _add() { -# Wenn's den Alias schon gibt, wird er nicht mehr -# angelegt + + # Wenn's den Alias schon gibt, wird er nicht mehr + # angelegt die "Need alias name for creation\n" if not @ARGV; die "Need members\n" if not defined $Cf->members; - my $alias = shift @ARGV; + my $alias = shift @ARGV; my @members = split /,/, $Cf->members; - my $dn = "mail=$alias,$abase"; + my $dn = "mail=$alias,$abase"; my $r; verbose("$alias:\n"); verbose("\t$dn..."); - $r = $ldap->search(base => $abase, filter => "(mail=$alias)"); + $r = $ldap->search( base => $abase, filter => "(mail=$alias)" ); die $r->error if $r->code; die "Multiple entries not expected" if $r->count > 1; - - $r = $ldap->add($dn, attrs => [ - objectClass => OC_ALIAS, - mail => $alias, - (AT_FORWARDINGADDRESS) => \@members - ]); - if ($r->code == LDAP_ALREADY_EXISTS) { verbose "exists" } - elsif ($r->code) { die $r->error } - else { verbose "ok" } + + $r = $ldap->add( + $dn, + attrs => [ + objectClass => OC_ALIAS, + mail => $alias, + (AT_FORWARDINGADDRESS) => \@members + ] + ); + if ( $r->code == LDAP_ALREADY_EXISTS ) { verbose "exists" } + elsif ( $r->code ) { die $r->error } + else { verbose "ok" } verbose("\n"); } sub _modify() { -# Auch hier gehen wir davon aus, daß die dn direkt aus dem Alias-Namen folgt: -# dn: cn=USER,... -# Jetzt behandeln wir lediglich die Modifikation auf Basis eines -# alias-Namens! + + # Auch hier gehen wir davon aus, daß die dn direkt aus dem Alias-Namen folgt: + # dn: cn=USER,... + # Jetzt behandeln wir lediglich die Modifikation auf Basis eines + # alias-Namens! my (@users) = @ARGV or die "Need alias names(s)\n"; my @members = split /,/, $Cf->members; my @add = grep { s/^\+// } @_ = @members; - my @del = grep { s/^-// } @_ = @members; + my @del = grep { s/^-// } @_ = @members; my @set = grep { !/^[\+-]/ } @members; - foreach my $alias (@ARGV) { - my $dn = "mail=$alias,$abase"; - verbose "$alias:"; + my $dn = "mail=$alias,$abase"; + verbose "$alias:"; - my $r = $ldap->search(base => $abase, filter => "(mail=$alias)"); - die $r->error if $r->code; + my $r = $ldap->search( base => $abase, filter => "(mail=$alias)" ); + die $r->error if $r->code; - if ($r->count == 0) { - verbose " not found\n"; - next; - } + if ( $r->count == 0 ) { + verbose " not found\n"; + next; + } - while (my $e = $r->shift_entry) { + while ( my $e = $r->shift_entry ) { - verbose "\n\t" . $e->dn . " "; + verbose "\n\t" . $e->dn . " "; - if (@set) { - $e->replace((AT_FORWARDINGADDRESS) => \@set); - } else { - @add and $e->replace((AT_FORWARDINGADDRESS) => [uniq $e->get(AT_FORWARDINGADDRESS), @add]); - @del and $e->delete((AT_FORWARDINGADDRESS) => \@del); - } + if (@set) { + $e->replace( (AT_FORWARDINGADDRESS) => \@set ); + } else { + @add + and $e->replace( (AT_FORWARDINGADDRESS) => + [ uniq $e->get(AT_FORWARDINGADDRESS), @add ] ); + @del and $e->delete( (AT_FORWARDINGADDRESS) => \@del ); + } - $e->dump if $Cf->debug; + $e->dump if $Cf->debug; - my $r = $e->update($ldap); - if ($r->code == LDAP_NO_SUCH_ATTRIBUTE) { - verbose "no member"; - } elsif ($r->code) { - die $r->error . "/" . $r->code; - } else { - verbose "ok"; - } - } + my $r = $e->update($ldap); + if ( $r->code == LDAP_NO_SUCH_ATTRIBUTE ) { + verbose "no member"; + } elsif ( $r->code ) { + die $r->error . "/" . $r->code; + } else { + verbose "ok"; + } + } - print "\n"; + print "\n"; } } sub _delete() { -# Wir gehen davon aus, daß es einen dn mail=ALIAS,ou=MailAliases,... -# gibt und löschen diesen gnadenlos. + + # Wir gehen davon aus, daß es einen dn mail=ALIAS,ou=MailAliases,... + # gibt und löschen diesen gnadenlos. - if (!@ARGV) { - print "User: "; - chomp($_ = <>); - @ARGV = ($_); + if ( !@ARGV ) { + print "User: "; + chomp( $_ = <> ); + @ARGV = ($_); } foreach (@ARGV) { - my $dn = "mail=$_,$abase"; + my $dn = "mail=$_,$abase"; - verbose("$_:\n"); - verbose("\tdeleting $dn..."); - my $r = $ldap->delete($dn); + verbose("$_:\n"); + verbose("\tdeleting $dn..."); + my $r = $ldap->delete($dn); - if ($r->code == LDAP_NO_SUCH_OBJECT) { - verbose("doesn't exist"); - } elsif ($r->code == 0) { - verbose("ok"); - } else { - die $r->error; - } - - verbose("\n"); + if ( $r->code == LDAP_NO_SUCH_OBJECT ) { + verbose("doesn't exist"); + } elsif ( $r->code == 0 ) { + verbose("ok"); + } else { + die $r->error; + } + + verbose("\n"); } } @@ -180,45 +190,45 @@ sub _list() { my $filter; @ARGV = ("*") unless @ARGV; - $filter = "(|" . join("", map { "(mail=$_)" } @ARGV) . ")"; + $filter = "(|" . join( "", map { "(mail=$_)" } @ARGV ) . ")"; my $r = $ldap->search( - filter => $filter, - base => $abase, - attrs => [qw/mail/, AT_FORWARDINGADDRESS], + filter => $filter, + base => $abase, + attrs => [ qw/mail/, AT_FORWARDINGADDRESS ], ); die $r->error if $r->code; $Text::Wrap::columns = columns() || 80; - while (my $e = $r->shift_entry) { - my $mail = $e->get("mail"); + while ( my $e = $r->shift_entry ) { + my $mail = $e->get("mail"); - print wrap("", "\t", $e->get_value("mail") - . ": " - . join(", ", $e->get(AT_FORWARDINGADDRESS)) - . "\n"); - + print wrap( "", "\t", + $e->get_value("mail") . ": " + . join( ", ", $e->get(AT_FORWARDINGADDRESS) ) + . "\n" ); + } - $filter = "(|" . join("", map { "(".AT_GROUP."=$_)" } @ARGV) . ")"; + $filter = "(|" . join( "", map { "(" . AT_GROUP . "=$_)" } @ARGV ) . ")"; $r = $ldap->search( - filter => $filter, - base => $ubase, - attrs => [AT_GROUP, AT_PRIMARYADDRESS] + filter => $filter, + base => $ubase, + attrs => [ AT_GROUP, AT_PRIMARYADDRESS ] ); die $r->error if $r->code; my %group; - while (my $e = $r->shift_entry) { - my $mail = $e->get_value(AT_PRIMARYADDRESS); - foreach my $g ($e->get_value(AT_GROUP)) { - push @{$group{$g}}, $mail; - } + while ( my $e = $r->shift_entry ) { + my $mail = $e->get_value(AT_PRIMARYADDRESS); + foreach my $g ( $e->get_value(AT_GROUP) ) { + push @{ $group{$g} }, $mail; + } } - foreach my $g (keys %group) { - print wrap("", "\t", "$g⇒ " . join(", ", @{$group{$g}}) . "\n"); + foreach my $g ( keys %group ) { + print wrap( "", "\t", "$g⇒ " . join( ", ", @{ $group{$g} } ) . "\n" ); } } @@ -238,4 +248,5 @@ } 1; + # vim:sts=4 sw=4 aw ai sm: