alias.pm
branchfoerste-cms
changeset 72 66bf85163780
parent 3 1f0b4cd76cc8
--- 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: