Regexp du soir, espoir

Tags: , , ,
No Comments »

Dans ma tentative de conquete du monde, je suis confronté à un problème auquel je n’avais pas immédiatement pensé. En effet, une foule d’outils partagent sans vergogne certains noms de fonction (usage(), help(), error()…) et de variables globales. Cet ennuyeux constat aboutit evidemment à des problèmes de linkage et faisait lamentablement foirer la compilation de mon BeastieBox cheri.

Une solution evidente était de renommer ces fonctions et leurs appels. mais…

imil@obana:~/src/beastiebox/beastiebin/sh$ grep 'error(' *.c|wc -l
      95

Flemme quoi.

Je me suis donc fendu de même pas 10 lignes de shell/perl qui serviront peut-être au voyageur perdu :

#!/bin/sh

usage()
{
        echo "usage: $0 <type> <function|variable> <prefix>"
        echo "type : <func|var>"
        exit 1
}

[ $# -lt 3 ] && usage

type=$1
item=$2
prefix=$3

preprx="^|\s+|=+\s*|\(.+?\)\s*|\(\s*"

for file in *.[ch]
do
        if [ "$type" != "var" ]; then
                perl -pi.bkp -e "s/(${preprx})${item}(\s*\()/\1${prefix}_${item}\2/g" $file
        else
                perl -pi.bkp -e "s/(${preprx}|[\+\-\*\/\>\< \%\^\|\!\&\~\[\.]+)${item}(\s*[^a-z0-9\-_\(])/\1${prefix}_${item}\2/gi" $file
        fi
done

L’outil s’utilise de cette façon :

$ commonfunc.sh func pouet prefixe

ou

$ commonfunc.sh var variable prefixe

Chaque appel et déclaration de la fonction pouet sera remplacé par prefixe_pouet. Même principe pour les variables. Un backup suffixé "bkp" sera créé pour chaque fichier modifié, permettant ainsi de réaliser un petit diff de verification.

merde, j’ai pas de backup…

Tags: , ,
No Comments »

Combien de fois cette phrase a retenti dans vos esprits imprudents ? dans mon esprit imprudent à moi, plein.
Alors, comme je viens de toper un kimloli sur les conseils de mon bouquetin favori, je me suis dit que, pour une fois, j’y collerais bien une procedure de backup propre.

J’ai déjà parlé et probablement pasté ici même un petit script gentil qui, grâce au couple rsync / rsyncd, permettait de rendre cette opération relativement rapide assez simplement. J’y ai apporté quelques modifs et enrobé le tout d’un chouillat de sécu. Un chouillat j’ai dit, trépigne pas spoty.

Le kimloli est un FreeBSD 6.2, j’y installe rsync via les ports.
Le backup est fait sur une bête workstation Ubuntu, chez moi. J’y installe rsync via apt-get.

Voici les differentes étapes que j’ai suivi pour préparer mon rsyncd sur ma machine à backuper :

Activation du rsync dans inetd :

# grep rsync /etc/inetd.conf
# backup
rsync           stream  tcp     nowait  root    /usr/local/bin/rsync rsyncd --daemon --config=/usr/local/etc/rsyncd.conf

Interdiction d’y accéder d’ailleurs que de ma ligne DSL qui dispose d’une IP fixe :

ALL : localhost ip.publique.dsl : allow
rsync : ALL : deny

Configuration du demon rsync

pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log

uid = root
gid = wheel
use chroot = no
max connections = 1
syslog facility = local5

[homes]
        path = /home
        comment = Homes
	# seul utilisateur autorisé
        auth users = bkp
        secrets file = /usr/local/etc/rsyncd.secrets
        hosts allow = ip.publique.dsl
[usr_local]
        path = /usr/local
        comment = usr local directories
        auth users = bkp
        secrets file = /usr/local/etc/rsyncd.secrets
        hosts allow = ip.publique.dsl

Créaction du très simple fichier d’authentification /usr/local/etc/rsyncd.secrets :

bkp:mangemoitoute

Activation de inetd au démarrage :

# grep inetd /etc/rc.conf
inetd_enable="YES"

Et on démarre tout ce petit monde :

# /etc/rc.d/inetd start

La conf serveur est prête. Coté client, je vous propose ce script :

#!/bin/sh

# Simple rsync client script
# if "console" is specified, verbose output and --delete are implied
# iMil 

RSYNC="/usr/bin/rsync"

usage()
{
        echo "usage: $0    "
        exit 1
}

if [ $# != 4 ]
then
        usage
fi

HOST=$2
FROM=$3
TO=$4
EXCLUDE="/home/bkp/rsync.exclude"
SECRET="/home/bkp/rsync.secret"
USER="bkp"

OPTIONS="--compress -a --recursive --times --perms --links"

if [ -f ${EXCLUDE} ]; then
        OPTIONS="${OPTIONS} --exclude-from=${EXCLUDE}"
fi
if [ -f ${SECRET} ]; then
        OPTIONS="${OPTIONS} --password-file=${SECRET}"
fi

case $1 in
        console)
                CONSOLE="--verbose --progress --stats --delete"
                ;;
        cron)
                CONSOLE=""
                ;;
        *)
                usage
                ;;
esac

CMD="${RSYNC} ${CONSOLE} ${OPTIONS} ${USER}@${HOST}::${FROM} ${TO}/${FROM}"

echo running: ${CMD}

eval ${CMD}

On crée le fichier /home/bkp/rsync.secret qui contiendra UNIQUEMENT le mot de passe précisé dans le fichier secret du serveur, puis /home/bkp/rsync.exclude qui est composé de la liste des fichiers et repertoires à exclude, par exemple :

/home/ftp
/home/mirror
*access_log
*error_log

On teste en console :

bin/bkp.sh console kimloli212 usr_local /home/bkp/kimloli

Et si tout va bien, on cron :

0 2 * * * /home/bkp/bin/bkp.sh cron kimloli212 homes /home/bkp/kimloli

Joyeux backups

WP Theme & Icons based on GlossyBlue by N.Design Studio
Banner from www.trynthlas.com
Entries RSS Comments RSS Log in