jueves, 20 de diciembre de 2007

Expect interactivo

Expect es genial para algunas actividades, pero en ocasiones se requiere que sea interactivo. Ejemplo:

#!/usr/bin/expect -f
#

set force_conservative 0 ;# set to 1 to force conservative mode
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}


set timeout 100
spawn ssh -l user1 [lindex $argv 0]
match_max 1000
for {} 1 {} {
expect timeout {
send_user "Problema de comunicacion \r"
exit
} "(yes/no)?" {
send "yes\r"
} "password:" {
send "mypassword\r"
break
}
}


expect -exact "\]$ "
send -- "Modo interactivo. Teclea 'salir' para continuar\n"
interact "salir" return
expect -exact "\]$ "
send -- "exit\r"
expect eof

lunes, 10 de diciembre de 2007

Tips & Trick sobre Perl

Instalar un modulo:

perl -MCPAN -e 'install Apache::Test'


Leer el contenido de un archivo

open FH1, "./nombre.arch" || die " Error al abrir archivo ";
while( < FH1 >){
chomp;
.
.
.
}
close FH1;

Crear un hash de hash apartir del contenido de un archivo
%arreglo=();
open FH, "archivo" || die " Error al abrir archivo ";
while () {
chomp;
if ( ! /^#/ ) {
($campo, $valor)=split(/:/,$_,-1);
if ( $campo =~ /FS/ ) {
$llave=$valor;
}
$arreglo{$llave}{$campo}=$valor;
}
}
close FH;


Imprimir el contenido de hash de hash
foreach $llave ( keys %arreglo ){
foreach $elemento ( keys %{$arreglo{$llave}} ){
print "$elemento = $arreglo{$llave}{$elemento} \n";
}
}

imprimir un elemento de un arreglo de manera aletoria

#!/usr/bin/perl

@array=("1","tres","4","cinco");
print $array[int ( rand(0+@array))];


llamar a system

if (($pid=fork()) == 0 ){
@args = ("/ruta/comando","arg1","arg2");
system(@args) == 0 or die "system @args failed: $?";
exit;
}
wait;

miércoles, 5 de diciembre de 2007

QUALSTAR TLS-6460 con Bacula

Estos fueron de manera general los pasos para instalar Bacula en un sistema Debian Lenny con un robot de cintas QUALSTAR TLS-6460.

A manera de introduccion, el sistema de respaldos de Bacula tiene 4 grandes componentes:

= Director: cerebro de todos los componentes.
= Storage daemon: demonio encargado del manejo de los dispositivos de almacenamiento (a disco, a cinta, a archivos).
= File daemon: encargado de la realización del respaldo de los archivos. Este componente es tambien conocido como el cliente.
= Console: consola de administracion.


Nota: En esta configuracion el director, el storage daemon y la consola estan en el mismo servidor. Esta guia no esta excenta de errores y/o mejoras, usela bajo su responsabilidad.


1) Instalacion de driver para fibrechanel.

2) Identificacion de los dispositivos de cinta. Esto lo puede hacer mediante el comando mtx. Las cintas normalmente estan ligadas a /dev/st0 y /dev/nst0; son el mismo dispositivo con la diferencia que el primero rebobina la cinta después de cada uso y en el caso del segundo no. Ejemplos:

mtx -f /dev/sg0 status -----> la libreria completa
mt -f /dev/st0 status -----> el status del primer driver

3) Instalacion de Mysql

apt-get install mysql-common mysql-server

4) Instalacion de Bacula

apt-get install bacula-director-mysql bacula-sd bacula-fd

5) Configuracion del Storage Daemon (/etc/bacula/bacula-sd.conf):

- Asignar el password correcto en la definicion de Director y monitor.
- Esta es mi definicion de device

Device {
Name = Drive-1 #
Drive Index = 0
Media Type = SDLT 600
Archive Device = /dev/st0
}

Note que esta definicion variara dependiendo de la cantidad de drivers que tenga el robot o incluso del robot que se trate.

6) Configuracion del Director:

- Elimine en la definicion de director la linea DirAddress
- Igualar la definicion de Storage del archivo de configuracion del Director con la definicion en el Strorage Daemon. Ejemplo:

Storage {
Name = Drive-1
# Do not use "localhost" here
Address = miserver # N.B. Use a fully qualified name here
SDPort = 9103
Password = "XXXXXXXXXXXXXXXXXXX" # password for FileDaemon
Device = Drive-1
Media Type = SDLT 600
}

- En la definicion de console, asignar el password correcto.

- Este es opcional. Definicion de Pool. Defini un pool para cada drive, y un pool para historicos, con la finalidad de que sea mas facil la administracion de cintas. Aqui parte de esa configuracion:

Pool {
Name = Grupo1
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 365 days # one year
Label Format = Grupo1a_
}

Pool {
Name = Grupo2
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 730 days # two year
Label Format = Grupo2a_
}

Pool {
Name = Historico
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 1825 # 5 years
Label Format = Historico_
}

7) Reiniciar al Director y al Storage Daemon

/etc/init.d/bacula-director start
/etc/init.d/bacula-sd start

8) Debera instalar algun cliente a respaldar, definir dicho cliente en la configuracion del Director.

9) La consola (bconsole) puede ayudarle a administrar los jobs de respaldo.