La situación es la siguiente. Estamos compilando en Solaris 10 el módulo de Perl DB_File. El requerimiento lógico es tener instalado BerkeleyDB en el servidor así que procedemos a ello:
# pkgadd -d db-4.7.25.NC-sol10-x86-local
Ahora procedemos a la típica compilación (Elegir el compilador correcto para Perl en Solaris) y nos encontramos con uno de estos dos errores:
cc -c -I/usr/local/include -Dbool=char -DHAS_BOOL
-O2 -DVERSION=\"1.64\" -DXS_VERSION=\"1.64\" -fpic
-I/usr/local/lib/perl5/i586-linux/5.00404/CORE -DmDB_Prefix_t=size_t
-DmDB_Hash_t=u_int32_t DB_File.c
DB_File.xs:101: db.h: No such file or directory
LD_RUN_PATH="/lib" cc -o blib/arch/auto/DB_File/DB_File.so -shared
-L/usr/local/lib DB_File.o -L/usr/local/lib -ldb
ld: cannot open -ldb: No such file or directory
Es raro porque el fichero db.h se encuentra en la ruta de instalación de DB. El problema es que el fichero de configuración para la compilación del módulo presupone una ruta estándar que en este caso no se cumple. Así que modificamos dicho fichero de esta forma:
Antes (config.in):
INCLUDE = /usr/local/BerkeleyDB/include
LIB = /usr/local/BerkeleyDB/lib
Por la ruta donde se encuentre, en mi caso /usr/local/BerkeleyDB.4.7/include/db.h:
INCLUDE = /usr/local/BerkeleyDB.4.7/include
LIB = /usr/local/BerkeleyDB.4.7/lib
Y a compilar.
Cuando compilamos módulos de Perl en Solaris (en este caso Solaris 10) hay que tener muy claro el compilador a utilizar. En esta versión de Solaris tenemos por defecto la versión 5.8.4 de Perl, la cual ha sido compilada con la suite de compilación de Sun Studio. La forma habitual de compilar módulos es la siguiente:
# perl Makefile.PL
# make
# make test
# make install
Si lo hacemos así, el sistema utilizará el compilador Sun Studio y habrá flags incompatibles, errores de compilación, etc. Lo que tenemos que hacer es forzar la utilización del compilador GNU C/C++, que por defecto lo encontraremos en /usr/sfw/bin como nos indica el Solaris Install CookBook.
Lo primero que tenemos que hacer es añadir esta ruta al PATH ya que por defecto no está:
export PATH=$PATH:/usr/sfw/bin
Para la ejecución del Makefile.PL utilizaremos perlgcc en lugar de perl a secas, está en la ruta “/usr/perl5/bin/perlgcc“. Para los make forzaremos la utilización de gmake en la ruta anteriormente citada. La lista de comandos sería la siguiente:
# /usr/perl5/bin/perlgcc Makefile.PL
# /usr/sfw/bin/gmake MAKE=/usr/sfw/bin/gmake
# /usr/sfw/bin/gmake MAKE=/usr/sfw/bin/gmake test
# /usr/sfw/bin/gmake MAKE=/usr/sfw/bin/gmake install
Al parecer en algunas versiones del nuevo cPanel 11.25.0-RELEASE se están detectando errores en la instalación del módulo de perl Mail::SPF. Si ejecutamos /scripts/checkperlmodules encontramos los siguientes errores:
CPAN.pm: Going to build J/JM/JMEHNLE/mail-spf/Mail-SPF-v2.007.tar.gz
perl-64bit-hack: enabled
# running Build.PL --otherldflags -L/usr/lib64 --config ldflags=-L/usr/lib64 --extralibdir /usr/lib64
Creating new 'MYMETA.yml' with configuration results
Creating new 'Build' script for 'Mail-SPF' version 'v2.7.0'
Prereq 'v5.6' for 'perl' is not supported by Module::Build::Compat
make: *** No targets. Stop.
JMEHNLE/mail-spf/Mail-SPF-v2.007.tar.gz
/usr/bin/make OTHERLDFLAGS=-L/usr/lib64 LDFLAGS=-L/usr/lib64 EXTRALIBDIR=/usr/lib64 OTHERLDFLAGS=-L/usr/lib64 LDFLAGS=-L/usr/lib64 EXTRALIBDIR=/usr/lib64 -- NOT OK
Running make install
Make had returned bad status, install seems impossible
perlmod--Install done
Para efectuar la instalación de un modo correcto ejecutad el siguiente comando:
perl -MCPAN -e "get('Mail::SPF')" && cd /home/.cpan/sources/authors/id/J/JM/JMEHNLE/mail-spf && tar -xzvf Mail-SPF-v2.007.tar.gz && cd Mail-SPF-v2.007 && perl Build.PL && ./Build && ./Build test && ./Build install && /scripts/checkperlmodules --full
Fuente | Foros cPanel
Gracias a CPAN, existe una forma muy sencilla y cómoda de actualizar de vez todos los módulos de PERL que tengamos instalados en el sistema, para ello, simplemente ejecutad lo siguiente:
cpan -r
Automáticamente comenzará la actualización de los módulos:
$ cpan -r
CPAN: Storable loaded ok
Going to read /home/alex/.cpan/Metadata
Database was generated on Mon, 10 Aug 2009 23:26:58 GMT
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
ftp://ftp.perl.org/pub/CPAN/authors/01mailrc.txt.gz
Going to read /home/alex/.cpan/sources/authors/01mailrc.txt.gz
CPAN: Compress::Zlib loaded ok
Fetching with LWP:
ftp://ftp.perl.org/pub/CPAN/modules/02packages.details.txt.gz
LWP failed with code[500] message[LWP::Protocol::MyFTP: connect: Conexi�n rechazada]
Fetching with Net::FTP:
ftp://ftp.perl.org/pub/CPAN/modules/02packages.details.txt.gz
Going to read /home/alex/.cpan/sources/modules/02packages.details.txt.gz
Database was generated on Fri, 18 Dec 2009 01:45:07 GMT
Fetching with LWP:
ftp://ftp.perl.org/pub/CPAN/modules/03modlist.data.gz
Going to read /home/alex/.cpan/sources/modules/03modlist.data.gz
Going to write /home/alex/.cpan/Metadata
...................... etc etc
Hoy vamos a ver un ejemplo sencillo de programación en Perl, mediante el cual vamos a enviar un correo electrónico. Utilizamos el módulo MIME::Lite, que permite mandar contenido html (u otro MIME) en el cuerpo del mensaje.
El ejemplo que os voy a mostrar envía el correo utilizando el método de envío por defecto que tenga el sistema en el que se ejecuta (si es Linux, normalmente sendmail). Ahí va:
#!/usr/bin/perl -w
use MIME
::Lite;
use strict
;
my $subject = "Asunto del correo";
my $from = "test\@dominio.com";
my $to = "destinatario\@dominio.com";
my $body = "Esto es el cuerpo del correo ...";
my $msg = MIME
::Lite->new
(
Subject
=> $subject,
From
=> $from,
To
=> $to,
Type
=> 'text/html',
Data
=> $body
);
$msg->send();
Básicamente declaramos las variables que contienen el asunto, destinatarios, cuerpo del mensaje, etc y abrimos la clase para trabajar con ella, finalmente enviamos el correo.
En la propia página de cpan hay bastantes ejemplos y muy útiles, os dejo un par de ellos, podéis ver los demás aquí.
Agregar una imagen a un mensaje con varios destinatarios:
### Start with a simple text message:
$msg = MIME::Lite->new(
From =>'me@myhost.com',
To =>'you@yourhost.com',
Cc =>'some@other.com, some@more.com',
Subject =>'A message with 2 parts...',
Type =>'TEXT',
Data =>"Here's the GIF file you wanted"
);
### Attach a part... the make the message a multipart automatically:
$msg->attach(
Type =>'image/gif',
Path =>'aaa000123.gif',
Filename =>'logo.gif'
);
Utilizar otro método de envío de correo si no tenemos sendmail:
### Do something like this in your 'main':
if ($I_DONT_HAVE_SENDMAIL) {
MIME
::Lite->send('smtp', $host, Timeout
=>60
AuthUser
=>$user, AuthPass
=>$pass);
}
### Now this will do the right thing:
$msg->send; ### will now use Net::SMTP as shown above
El módulo de Perl MIME::Base64 proporciona funciones para codificar y descodificar cadenas en y desde base64.
Base 64 es un sistema de numeración posicional que usa 64 como base. Es la mayor potencia de dos que puede ser representada usando únicamente los caracteres imprimibles de ASCII. Esto ha propiciado su uso para codificación de correos electrónicos, PGP y otras aplicaciones. Todas las variantes famosas que se conocen con el nombre de Base64 usan el rango de caracteres A-Z, a-z y 0-9 en este orden para los primeros 62 dígitos, pero los símbolos escogidos para los últimos dos dígitos varían considerablemente de unas a otras. Wikipedia
Las funciones que nos ofrece son las siguientes:
encode_base64($str);
encode_base64($str, $eol);
decode_base64($str);
Os dejo un par de ejemplos muy sencillos, podéis encontrar más en cPan.org.
Decodificación:
#!/usr/bin/perl
use warnings
;
use strict
;
use MIME
::Base64;
my $string_codificada = "RXN0byBlcyB1bmEgcHJ1ZWJh";
my $string = decode_base64
($codificado);
print "String ($string_codificada) decodificada:\n ".$string;
Codificación:
#!/usr/bin/perl
use warnings
;
use strict
;
use MIME
::Base64;
my $string = 'Esto es una prueba';
my $string_codificada = encode_base64
($string);
print "String ($string) codificada:\n".$string_codificada;
Tras la última actualización de cPanel en un servidor FreeBSD (11.24.4-RELEASE_33609), resulto haber un fallo en ciertos módulos de Perl, por ejemplo exim no arrancaba mostrando el siguiente error:
# /scripts/restartsrv_exim
/libexec/ld-elf.so.1: Shared object "libperl.so" not found, required by "exim"
/libexec/ld-elf.so.1: Shared object "libperl.so" not found, required by "exim"
Ni un upcp –force ni reinstalar exim solventan el fallo, es necesario realizar lo siguiente, ejecutad el script:
/usr/local/bin/perl-after-upgrade -f
Toda la información sobre este script aquí.
De este modo quedaría solucionado, podéis chequear tras dicha tarea que todo es correcto (Perl) chequeando los módulos con:
/scripts/checkperlmodules --force
Tras actualizar un servidor FreeBSD a la última versión Release de cPanel (11.24.4-RELEASE_32603) me encontré con el siguiente error:
The perl module Text::CSV could not be installed.
This module is required by cPanel, and the system may not function correctly until it is installed, and functional. Below is the results of the auto-install attempt:
Test Run
==============
Can't locate Text/CSV.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.8/BSDPAN /usr/local/lib/perl5/site_perl/5.8.8/mach /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.8/mach /usr/local/lib/perl5/5.8.8 .) at - line 1.
BEGIN failed--compilation aborted at - line 1.
Installer Run
==============
%Config::Config is read-only
Al tratar de reinstalar el módulo de Perl, ya sea desde WHM o desde línea de comandos seguía sin dejarme por el dichoso “%Config::Config is read-only” así que directamente reinstalando perl 5.8.8 el problema ha quedado solucionado:
wget http://layer1.cpanel.net/perl588installer.tar.gz
tar xfvz perl588installer.tar.gz
cd perl588installer
./install
Tras instalarlo revisa que todos los módulos han sido instalados correctamente:
/scripts/checkperlmodules
Si todo a ido bien, os indicará lo siguiente tras el chequeo:
Using fast module check.....checked 110 modules in 19 second(s)
Tested 111, 111 ok, 0 failed.
Comentarios recientes