BackupPC ed errore Perl su CentOS x64

Ho notato che in questi giorni, installando BackupPC su CentOS a 64bit si incorre in un errore al quanto criptico duarante il tentativo di avvio del servizio:

 service backuppc start
Starting BackupPC: Can't locate BackupPC/Lib.pm in @INC (@INC contains: /usr/lib /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/bin/BackupPC line 60.
BEGIN failed--compilation aborted at /usr/bin/BackupPC line 60.
                                                           [FAILED]

Si tratta di un bug che può agevolmente essere risolto ripristinando i riferimenti corretti a Perl all’interno del codice di BackupPC.
Per quanto riguarda il file /usr/bin/BackupPC ad esempio, è necessario sostituire la riga in ‘use lib “/usr/lib”;’:

use strict;
no  utf8;
use vars qw(%Status %Info $Hosts);
use lib "/usr/lib";
use BackupPC::Lib;
use BackupPC::FileZIO;
use Encode qw/decode_utf8/;

con ‘use lib “/usr/lib64″;’:

use strict;
no  utf8;
use vars qw(%Status %Info $Hosts);
use lib "/usr/lib64";
use BackupPC::Lib;
use BackupPC::FileZIO;
use Encode qw/decode_utf8/;

Per evitare di apportare queste modifiche in tutti i punti del codice sorgente, la cosa più comoda è quella di creare un link all’interno della cartella /usr/lib:

cd /usr/lib
ln -s /usr/lib64/BackupPC BackupPC

Ed il gioco è fatto.

Installare BackupPC su CentOS

BackupPc è sicuramente una comoda soluzione per fare il backup di più macchine in rete.
Al momento in cui scrivo, CentOS non prevede un pacchetto all’interno della propria distribuzione, rendendo l’uso del software non proprio agevole. Per questo motivo ho deciso di scrivere questa breve guida che spiega come installare e configurare il software.

Come sempre, prima di partire è bene disabilitare temporaneamente SELinux ed Iptables. Questi verranno riabilitati alla fine dell’installazione:

/usr/sbin/service iptables stop
bash: /usr/sbin/service: No such file or directory
[root@francesca /]# /sbin/service iptables stop
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]

Come dicevamo prima, non potendo usare il repository di default, dovremo utilizzarne uno esterno:

yum install backuppc
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
...
Setting up Install Process
No package backuppc available.
Nothing to do

Abbiamo dunque bisogno di un repository di test. Istruzioni su come attivare repository esterni alla distribuzione sono disponibili qui.

Se avete seguito le istruzioni relative ai repository riportate nell’articolo, potrete installare backuppc tramite il comando:

yum --enablerepo=c5-testing install backuppc mod_perl httpd

Il comando provvederà ad installare anche eventuali dipendenze:

Dependencies Resolved

================================================================================
 Package                       Arch     Version              Repository    Size
================================================================================
Installing:
 backuppc                      i386     3.1.0-1.el5.centos   c5-testing   667 k
Installing for dependencies:
 perl-Archive-Zip              noarch   1.16-1.2.1           base         138 k
 perl-Class-Singleton          i386     1.03-1.2.el5.rf      rpmforge      14 k
 perl-Compress-Raw-Bzip2       i386     2.021-1.el5.rf       rpmforge     108 k
 perl-Compress-Raw-Zlib        i386     2.021-1.el5.rf       rpmforge     169 k
 perl-DateTime                 i386     0.4305-1.el5.rf      rpmforge     134 k
 perl-DateTime-Format-Mail     noarch   0.3001-1.el5.rf      rpmforge      25 k
 perl-DateTime-Format-W3CDTF   noarch   0.04-1.el5.rf        rpmforge      16 k
 perl-DateTime-Locale          noarch   0.4001-1.el5.rf      rpmforge     1.7 M
 perl-DateTime-TimeZone        i386     0.46-1.el5.rf        rpmforge     361 k
 perl-File-RsyncP              i386     0.68-1.el5.rf        rpmforge     179 k
 perl-HTML-Parser              i386     3.55-1.fc6           base          92 k
 perl-HTML-Tagset              noarch   3.10-2.1.1           base          15 k
 perl-IO-Compress              noarch   2.021-1.el5.rf       rpmforge     238 k
 perl-List-MoreUtils           i386     0.25.1-1.el5.rf      rpmforge     104 k
 perl-Params-Validate          i386     0.91-1.el5.rf        rpmforge     104 k
 perl-Time-modules             noarch   2006.0814-1.el5.rf   rpmforge      38 k
 perl-XML-Parser               i386     2.34-6.1.2.2.1       base         210 k
 perl-XML-RSS                  noarch   1.45-1.el5.rf        rpmforge      62 k
 perl-libwww-perl              noarch   5.805-1.1.1          base         376 k

Transaction Summary
================================================================================
Install     20 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 4.7 M

Configurare il frontend
Ora è la volta di Apache che verrà utilizzato come frontend per la gestione dei backup. Seguendo l’HOW-TO riportato sul sito di CentOS la configurazione sarà modificata per consentire l’esecuzione di Apache come utente diverso.
A mio parere questo potrebbe avere implicazioni non trascurabili sulla sicurezza e sull’assetto della distribuzione, senza considerare il fatto che Apache verrebbe dedicato interamente al backup.

Preferisco invece eseguire una seconda istanza del webserver con i soli plug-in necessari a far giare BackupPC. Per questo motivo copiamo il file di configurazione esistente in un nuovo file:

cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/backuppc_httpd.conf

modificando i paramentri essenziali:

PidFile run/backuppc_httpd.pid
Listen 81
User backuppc
#Allow from all

Possiamo inoltre disabilitare tutti i plug-in che non sono necessari al frontend. Per comodità riporto un file di configurazione utile come esempio:

ServerTokens OS
ServerRoot "/etc/httpd"
PidFile run/httpd_backuppc.pid
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
Include conf.d/perl.conf

StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000

StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0

Listen 81

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so

#ExtendedStatus On

User backuppc
Group apache

ServerAdmin root@localhost
#ServerName www.example.com:80
UseCanonicalName Off
#DocumentRoot "/var/www/html"
DocumentRoot "/var/lib/backuppc"

    Options FollowSymLinks
    AllowOverride None

    UserDir disable
    #UserDir public_html

DirectoryIndex index.html index.html.var

AccessFileName .htaccess

    Order allow,deny
    Deny from all

TypesConfig /etc/mime.types

DefaultType text/plain

#   MIMEMagicFile /usr/share/magic.mime
    MIMEMagicFile conf/magic

HostnameLookups Off

ErrorLog logs/backuppc_error_log

LogLevel warn

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog logs/backuppc_access_log combined

ServerSignature On

Alias /icons/ "/var/www/icons/"

    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all

    # Location of the WebDAV lock database.
    DAVLockDB /var/lib/dav/lockdb

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

DefaultIcon /icons/unknown.gif

#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz

ReadmeName README.html
HeaderName HEADER.html

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

AddLanguage ca .ca
AddLanguage cs .cz .cs
AddLanguage da .dk
AddLanguage de .de
AddLanguage el .el
AddLanguage en .en
AddLanguage eo .eo
AddLanguage es .es
AddLanguage et .et
AddLanguage fr .fr
AddLanguage he .he
AddLanguage hr .hr
AddLanguage it .it
AddLanguage ja .ja
AddLanguage ko .ko
AddLanguage ltz .ltz
AddLanguage nl .nl
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddLanguage pt .pt
AddLanguage pt-BR .pt-br
AddLanguage ru .ru
AddLanguage sv .sv
AddLanguage zh-CN .zh-cn
AddLanguage zh-TW .zh-tw

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

ForceLanguagePriority Prefer Fallback

AddDefaultCharset UTF-8

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

AddHandler type-map var

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Alias /error/ "/var/www/error/"

        AllowOverride None
        Options IncludesNoExec
        AddOutputFilter Includes html
        AddHandler type-map var
        Order allow,deny
        Allow from all
        LanguagePriority en es de fr
        ForceLanguagePriority Prefer Fallback

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully

alias /backuppc /usr/share/backuppc

   SetHandler perl-script
   PerlResponseHandler ModPerl::Registry
   PerlOptions +ParseHeaders
   Options +ExecCGI
   Order deny,allow
   Deny from all
   Allow from 192.168.0
   Allow from 127.0.0.1
   AuthName "Backup Admin"
   AuthType Basic
   AuthUserFile /var/lib/backuppc/passwd/htpasswd
   Require valid-user

Per verificare che il file sia formalmente valido possiamo eseguire un test preliminare:

/usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -t
Syntax OK

Prima di provare il servizio impostiamo una password per l’accesso al frontend:

htpasswd -c /var/lib/backuppc/passwd/htpasswd backup_manager
New password: your_password
Re-type new password: your_password
Adding password for user backup_manager

Arriva ora il momento di avviare una seconda instanza di Apache per verificare che tutto sia in ordine:

/usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -k start

Se tutto funziona correttamente possiamo procedere con le opportune modifiche necessarie a far partire il servizio all’avvio del sistema. Anche in questo caso faremo una copia del file utilizzato dal webserver:

cp /etc/init.d/httpd /etc/init.d/backuppc_httpd

Anche in questo caso per comodità riporto un esempio:

#!/bin/bash
#
# backuppc_httpd   Startup script for the Apache HTTP Server (BackupPC)
#
# chkconfig: - 90 34
# description: BackupPC stand alone web server 

# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi

# Avoid using root's TMPDIR
unset TMPDIR

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1

RETVAL=0

start() {
   KIND="BackupPC Web Server"
   echo -n $"Starting  service: "
   /usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -k start && echo "OK" || echo "Error"
   RETVAL=0
   echo
   return
}

stop() {
   KIND="BackupPC Web Server"
   echo -n $"Shutting down  services: "
   /usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -k stop && echo "OK" || echo "Error"
   RETVAL=0
   echo
   return
}

restart() {
   stop
   sleep 5
   start
}

case "$1" in
start)
   start
   ;;
stop)
   stop
   ;;
restart)
   restart
   ;;
*)
   echo $"Usage: $0 {start|stop|restart}"
   exit 1
esac

exit 0

Useremo chkconfig per rendere il servizio attivo all’avvio:

/sbin/chkconfig backuppc_httpd --add
/sbin/chkconfig --level 2345 backuppc_httpd on

Configurare BackupPC
Finito con il frontend passiamo a personalizzare il file /etc/BackupPC/config.pl che contiene i parametri necessari al backup. L’articolo si occupa di spiegare come configuare CentOS per la corretta esecuzione del pacchetto. Per maggiori informazioni è necessario seguire l’help online.

Una modifca importante da fare però riguarda la necessità di dover dare all’utente backuppc l’accesso all’intero file system tramite il comando tar altrimenti non sarà possibile procedere con il backup completo del sistema. Editiamo il file /etc/sudoers impostando i seguenti parametri:

#Defaults    requiretty
Defaults !lecture

backuppc ALL=NOPASSWD:/bin/gtar,/bin/tar

Come abbiamo già fatto per il frontend, possiamo abilitare l’avvio automatico del servizio tramite chkconfig:

chkconfig backuppc on

Prima di concludere
Al momento in cui scrivo questo articolo, esiste un piccolo baco facile da risolvere. Se per caso i link alla documentazione in linea non dovessero funzionare, potete eseguire i seguenti comandi per ripristinarli:

mkdir /usr/doc
ln -s /usr/share/doc/backuppc*/BackupPC.html /usr/doc/BackupPC.html

Alla prossima.

Excel – una funzione per i colori delle celle

Vi è mai capitato di dover ordinare o filtrare una lista in excel in base al colore delle celle?

Qualche giorno fa ho fornito ad un cliente una lista chiedendo di indicare le voci superflue.

Quando ho ricevuto la lista rielaborata, mi sono accorto che il cliente aveva usato due colori per discriminare gli elementi: il giallo ed il rosso.

Ma come fare a filtrare gli elementi in base al colore?

Visto che le formule non mi sono state di grande aiuto, ho deciso di scriverne una io.

Di seguito presento una funzione in grado di restituire il colore di una cella (o range di celle). Il colore può essere riferito allo sfondo (motivo) oppure al tratto (foreground).

La funzione dovrebbe restituire (dico dovrebbe perché non ne sono sicuro) un valore a 24 bit rappresentante la codifica del colore (8x8x8)

L’importante però è avere un valori diversi per colori diversi.

Public Function Colore(r As Range, Tipo As String) As Long
    Select Case UCase(Tipo)
        Case "MOTIVO"
            Colore = r.Interior.Color

         Case "TRATTO"
            Colore = r.Font.Color

         Case Else
            Colore = -1
    End Select
End Function

Per ottenere il valore relativo al tratto possiamo usare ad esempio la formula:

=colore(A1;"tratto")

Mentre per lo sfondo possiamo usare ad esempio la formula:

=colore(A1;"motivo")


Per comodità al fondo di questo articolo ho inserito una add-in excel (formato xla) contenente la funzione.

Scarica l’add-in

Alla prossima.