Proyecto

General

Perfil

#!/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;
}
(3-3/4)