Tengo unos cuantos scripts con Net::LDAP que me sirven para localizar de modo rápido determinados atributos del servidor LDAP. Hasta ahora cada vez que necesitaba consultar un nuevo atributo, pues copiaba un script, cambiaba el atributo a buscar y ya está. El problema es que cada vez tengo más programillas dispersos y duplico muchas cosas.
Así que me he puesto a aprender a pasar argumentos al programa y así tener uno solo y poder buscar distintas cosas desde ahí.
Éste es el programilla:
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
use strict;
use Getopt::Std;
use vars qw/ $opt_e $opt_n $opt_t $opt_h/;
getopts( 'e:t:n:?' );
# croak if no valid switches present:
usage() unless defined($opt_e) or defined($opt_n) or defined($opt_t);
# --- configuration ---
# $ldapserver = "domaincontroller.yourdomain.com";
# my $domain = "YOURDOMAIN";
# my $basedn = "ou=companyxy,dc=companyxy,dc=tld";
my $ldapserver = "name.domain.tld";
# my $domain = "YOURDOMAIN";
# my $username = "myuser";
# my $password = "mypassword";
my $basedn = "dc=domain,dc=tld";
# --- end configuration ---
# if $opt_e we want only attribute mail
# if $opt_n we want attribute sn
# if $opt_t we want mobile, homePhone and telephoneNumber
if (defined($opt_e)) {
search("$_[0]", "mail");
}
sub search {
use Net::LDAP;
my $ldap = Net::LDAP->new($ldapserver) or die "$0";
# at home I do not need binding, otherwise here bind
my $msg = $ldap->search (base => $basedn,
filter => "(|(cn=*$_[0]*)(uid=*$_[0]*))",
attrs => ['$_[1]']);
$msg->code && die $msg->error;
foreach my $entry ($msg->all_entries) {
if ($entry->get_value('$_[1]')) {
print "$_\n" for $entry->get_value( '$_[1]' );
} else { print "bummer\n";}
}
# $ldap->unbind;
}
sub usage {
my $heredoc = <<EOF;
usage: $0 [-etn?] name
-e: get e-mail addres
-t: get telephone number
-n: get surname
EOF
print $heredoc;
}
use warnings;
use strict;
use Getopt::Std;
use vars qw/ $opt_e $opt_n $opt_t $opt_h/;
getopts( 'e:t:n:?' );
# croak if no valid switches present:
usage() unless defined($opt_e) or defined($opt_n) or defined($opt_t);
# --- configuration ---
# $ldapserver = "domaincontroller.yourdomain.com";
# my $domain = "YOURDOMAIN";
# my $basedn = "ou=companyxy,dc=companyxy,dc=tld";
my $ldapserver = "name.domain.tld";
# my $domain = "YOURDOMAIN";
# my $username = "myuser";
# my $password = "mypassword";
my $basedn = "dc=domain,dc=tld";
# --- end configuration ---
# if $opt_e we want only attribute mail
# if $opt_n we want attribute sn
# if $opt_t we want mobile, homePhone and telephoneNumber
if (defined($opt_e)) {
search("$_[0]", "mail");
}
sub search {
use Net::LDAP;
my $ldap = Net::LDAP->new($ldapserver) or die "$0";
# at home I do not need binding, otherwise here bind
my $msg = $ldap->search (base => $basedn,
filter => "(|(cn=*$_[0]*)(uid=*$_[0]*))",
attrs => ['$_[1]']);
$msg->code && die $msg->error;
foreach my $entry ($msg->all_entries) {
if ($entry->get_value('$_[1]')) {
print "$_\n" for $entry->get_value( '$_[1]' );
} else { print "bummer\n";}
}
# $ldap->unbind;
}
sub usage {
my $heredoc = <<EOF;
usage: $0 [-etn?] name
-e: get e-mail addres
-t: get telephone number
-n: get surname
EOF
print $heredoc;
}
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
el resultado es:
Using bash Syntax Highlighting
Creo que el error lo tengo en la función search(). Mi intención es que el primer argumento sea $opt_e u $opt_t..., etc; y que el segundo argumento sea el atributo que le quiera pasar, en este caso, mail.
Parece que funciona, pero me no encuentra nada. Lo que es curioso es que si busco objetos que tengan varias direcciones de correo, me imprime 'bummer' tantas veces como direcciones tienen los objetos. Lo cual me sugiere que sí encuentra algo pero no del todo bien.
En fin, que ya es tarde para mí hoy y no acabo de verlo. A ver si alguno de ustedes ve el error y si no cuando tenga otro rato a ver si lo encuentro. De antemano gracias por su colaboración.