# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

DB_File.xs:101: db.h: No such file or directory

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.

Elegir el compilador correcto para Perl en Solaris

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

cPanel 11.25: error en módulo perl Mail::SPF

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

Actualizar todos los módulos de Perl desde CPAN

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

Perl: Enviar correos con el módulo MIME::Lite

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

Perl: Encriptar y desencriptar base64 con MIME::Base64

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;