Bienvenida a los foros de Perl en Español, silviaeaguilar.
Yo tengo hecho algo parecido. Cuando interactuas con MySQL desde la línea de comandos, busca un archivo ~/.my.cnf donde se supone que hay algunas opciones por defecto para esa sesión interactiva. Este archivo tiene este aspecto:
Using ini Syntax Highlighting
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = gq3nzsd9uyerb4LO6v5
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = gq3nzsd9uyerb4LO6v5
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Como pone al principio, el archivo lo generó Debian en el momento de la instalación del MySQL. Ahí están indicados los datos mínimos de conexión para cuando Debian necesite acceder a la base de datos, para realizar alguna tarea de mantenimiento.
El caso es que el usuario debian-sys-maint tiene los permisos necesarios para lo que yo quiero (insertar usuarios virtuales o realizar una simple consulta), así que puedo aprovechar esa misma información en el programa que hace esas consultas, como información de inicio de sesión:
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# Saca la lista de usuarios virtuales de la tabla system, para un dominio indicado
#
use common::sense;
use Config::IniFiles;
use DBI;
my $dominio = shift or die "Uso: $0 <nombre de dominio>\n";
my $config = Config::IniFiles->new(-file => '/root/.my.cnf') or die "ERROR: el archivo no tiene formato .ini\n";
my $userdb = $config->val('client', 'user');
my $passdb = $config->val('client', 'password');
my $dbh = DBI->connect('DBI:mysql:database=system', $userdb, $passdb, { RaiseError => 1, AutoCommit => 0 });
for my $tabla (qw(user alias catchall)) {
#my($cantidad) = $dbh->selectrow_array("SELECT COUNT(*) FROM $tabla WHERE `domain` = ?", {}, $dominio);
#say "$tabla: $cantidad";
say $tabla;
my $sth = $dbh->prepare("SELECT * FROM $tabla WHERE `domain` = ?");
$sth->execute($dominio);
my $contador = 0;
while (my @usuario = $sth->fetchrow_array) {
say "\t@usuario";
$contador++;
}
say "\tTotal: $contador" if $contador;
}
$dbh->disconnect();
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Como el archivo my.conf sigue el formato de un archivo .ini, uso el módulo
Config::IniFiles. En la línea 10 le paso al módulo el nombre del archivo que quiero que analice, y en las líneas 11 y 12 sacamos los datos que queremos: el nombre de usuario y contraseña, que usaremos en la línea 14 para hacer la conexión.
Se puede hacer de más formas, claro.