root/fotos-ldap/trunk/updatefotosldap/updatefotosldap @ 41
30 | enavas | #!/usr/bin/perl
|
|
#
|
|||
# Programa perl para subir y/o actualizar las fotos de los alumnos en servidor ldap del centro.
|
|||
# Toma como parámetro el fichero de exportación de datos de alumnado.
|
|||
# Actualiza las fotos de los alumnos en el servidor de ldap desde el fichero ExportacionDatosAlumnado.zip
|
|||
#
|
|||
#
|
|||
# Esteban M. Navas
|
|||
# IES Valle del Jerte
|
|||
# Fecha creación: 09/11/2010
|
|||
# Fecha última modificación: 12/11/2010
|
|||
# Requisito: Instalar los módulos de perl libnet-ldap-perl,
|
|||
# libarchive-zip-perl y perlmagick
|
|||
use Archive::Extract;
|
|||
use Net::LDAP;
|
|||
use Image::Magick;
|
|||
# Declaramos las funciones
|
|||
sub trim($);
|
|||
my $ldapserver = "ldap";
|
|||
my $archivo;
|
|||
if ($#ARGV != 0) {
|
|||
print "Uso: updatefotosldap <Path Archivo Exportacion Datos Alumnado.zip>\n\n";
|
|||
print "Ejemplo: updatefotosldap ExportacionDatosAlumnado.zip\n";
|
|||
exit;
|
|||
}
|
|||
if ( -e $ARGV[0] ) {
|
|||
$archivo = $ARGV[0];
|
|||
}
|
|||
else {
|
|||
print "El archivo $ARGV[0] no existe\n";
|
|||
exit;
|
|||
}
|
|||
print "Descomprimiendo $archivo...\n";
|
|||
my $ae = Archive::Extract->new(archive => $archivo);
|
|||
my $ok = $ae->extract( to => '/tmp' ) or die $ae->error;
|
|||
my $outdir = $ae->extract_path;
|
|||
my $files = $ae->files;
|
|||
print "$archivo descomprimido en $outdir\n\n";
|
|||
print "Introduce la contraseña del administrador de ldap: ";
|
|||
system "stty -echo"; # disable echo
|
|||
chomp (my $pass = <STDIN>);
|
|||
system "stty echo"; # enable echo
|
|||
$ldap = Net::LDAP->new("$ldapserver") or die "$@";
|
|||
# Abrimos una conexión
|
|||
$ldap->bind("cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es", password=>$pass);
|
|||
# Obtenemos la lista de usuarios
|
|||
$mesg = $ldap->search(filter=>"(&(objectClass=inetOrgPerson))", base=>"ou=People,dc=instituto,dc=extremadura,dc=es");
|
|||
@entries = $mesg->entries;
|
|||
# Procesamos cada usuario
|
|||
foreach $entry (@entries) {
|
|||
my $employeeNumber = $entry->get_value(employeeNumber);
|
|||
my $cn = $entry->get_value(cn);
|
|||
# Obtenemos el nombre del fichero
|
|||
my $fichero = qx{ls $outdir | grep -iE '^$employeeNumber.[a-z]{3}'};
|
|||
# Importante: Quitar los espacios que nos da la salida del qx{}
|
|||
$fichero = trim($fichero);
|
|||
# Si hay una foto para el alumno ...
|
|||
if ( $fichero ) {
|
|||
my $tmp;
|
|||
my $photo;
|
|||
# Y si el alumno tiene foto en el servidor ldap...
|
|||
if ( $entry->get_value( jpegPhoto ) ne '') {
|
|||
# ...la borramos de allí
|
|||
$mesg = $ldap->modify($entry->dn(), replace => {'jpegPhoto' => ''});
|
|||
}
|
|||
my $imagen = $outdir . "/" . $fichero;
|
|||
# Cambiamos el tamaño y el formato de la imagen
|
|||
my $nuevaimagen = Image::Magick->new;
|
|||
$nuevaimagen->Read( filename => $imagen );
|
|||
$nuevaimagen->Set( Gravity => 'Center' );
|
|||
$nuevaimagen->Resize( geometry => '80x80' );
|
|||
$nuevaimagen->Extent( geometry => '80x80' );
|
|||
my $imagenretocada = $outdir . "/" . $employeeNumber . ".jpg";
|
|||
$nuevaimagen->Write( "$imagenretocada" );
|
|||
open(FILE, "$imagenretocada");
|
|||
binmode(FILE);
|
|||
$photo .= $tmp while (sysread FILE, $tmp, 1024);
|
|||
close(FILE);
|
|||
$mesg = $ldap->modify($entry->dn(), replace => {'jpegPhoto'=>$photo});
|
|||
print "Foto $imagenretocada de $cn actualizada.\n";
|
|||
# Borramos la image retocada
|
|||
unlink $imagenretocada;
|
|||
}
|
|||
}
|
|||
# Cerramos la conexión
|
|||
$ldap->unbind;
|
|||
# Borramos los archivos extraidos en el directorio $outdir
|
|||
foreach $file (@$files) {
|
|||
unlink "$outdir/$file";
|
|||
}
|
|||
print "Proceso concluido.\n\n";
|
|||
sub trim($)
|
|||
{
|
|||
my $string = shift;
|
|||
$string =~ s/^\s+//;
|
|||
$string =~ s/\s+$//;
|
|||
return $string;
|
|||
}
|