L'appartement

Aller au contenu | Aller au menu | Aller à la recherche

Tag - bash

Fil des billets

jeudi, mars 5 2009

Script pratique : rechercher/remplacer/patcher comme vous voulez

Dans votre vie quotidienne de développeur et/ou d'administrateur système vous êtes sans doute confronté à la nécessité de rechercher et remplacer des motifs par lots.

L'utilisation conjointe d'une multitude d'outils le permettent efficacement sous GNU/Linux : find, grep, sed, awk, perl, diff, patch... Votre éditeur préféré possède sans doute également ce type de fonctionnalité.

Le remplacement doit parfois être assorti d'une vérification visuelle et d'une validation manuelle des différentes occurrences. Si vous changez l'intégralité de vos serveurs de nom dans les fichiers de zone de BIND, vous ne souhaitez sans doute pas qu'un de vos sites à la configuration tordue ne fonctionne plus ?

Partant de ce constat, mon collègue Zas[1] a sympathiquement concocté un script en pure bash habilement nommé search_replace ! C'est un savant mélange de find, sed, awk, diff(color) et patch qui a l'avantage de la simplicité (3 ko tout mouillé).

Comment ça marche ?!

  • On recherche un pattern donné sur un répertoire (exemple, la chaine « ma chaine » sur les fichiers .php du répertoire /var/www)
  • Pour chaque occurrence, un diff - en couleur, si vous avez installé colordiff - et dans le contexte vous permet de visualiser les changements qui seront appliqués
  • A chaque étape, vous choisissez :
    • d'accepter ou pas cette modification et de passer à l'occurrence suivante
    • de modifier manuellement via votre éditeur préféré VIM
    • d'annuler les actions en cours
  • Vous pouvez bien sur choisir de remplacer le tout sans confirmation ni vérification
  • Au final, vous choisissez d'appliquer les modifications ou de garder le patch pour plus tard.
  • Cerise sur le pompon, l'utilisation du patch vous permet de revenir sur les modifications si vous avez tout cassé !

Télécharger search_replace (tar.gz / 3ko)

Notes

[1] Je vous invite à essayer geeqie, co-développé par Zas

lundi, octobre 20 2008

Script minimaliste : génération des clés DKIM et ajout de l'enregistrement DNS

Un script pour ajouter un domaine dont on veux signer les mails via DKIMproxy. Celui-ci est forcément lié à mon article sur le sujet : "Installer la signature DKIM sur Postfix avec DKIMproxy". Vous pouvez très facilement l'adapter à votre usage.

Que fait ce script :

  • crée la clé publique et la clé privée dans le répertoire keys de DKIMproxy
  • change les droits sur la clé privée
  • sur demande, ajoute l'enregistrement dans le fichier de zone du domaine
  • ajoute les informations qui vont bien dans le fichier sender_map de DKIMproxy

On le lance de la façon suivante

./generate_keys domain.tld

Il faut ensuite incrémenter le numéro de série de la zone, relancer BIND et DKIMproxy.

Le script

#!/bin/bash

# Yves Tannier [grafactory.net] 2008 GPL...

# private/public keys path
PATH_KEYS='/usr/local/dkimproxy/keys'

# sender_map file path
PATH_SENDER_MAP='/usr/local/dkimproxy/sender_map'

# dkimuser
USER_GROUP='dkim:dkim'

# domain on parametre
DOMAIN=$1

# bind file path (optional)
ZONE_PATH="/var/cache/bind/$DOMAIN.hosts"

openssl genrsa -out $PATH_KEYS/$DOMAIN.key 1024
openssl rsa -in $PATH_KEYS/$DOMAIN.key -pubout -out $PATH_KEYS/${DOMAIN}_pub.key

# chg right
chown $USER_GROUP $PATH_KEYS/$DOMAIN.key
chmod 640 $PATH_KEYS/$DOMAIN.key

# Adding DKIM key on BIND Zone ?
echo
echo -n "Add DKIM key on BIND zone file ? ([Y]/n) "
read ans
if [ ! _$ans = _y -o _$ans = _Y ]; then

    # bind file
    echo -n "BIND Zone filename ($ZONE_PATH) : "
    read ${ZONE_PATH_READ}

    if [ ! -z "$ZONE_PATH_READ" ]; then
        ZONE_PATH=${ZONE_PATH_READ}
    fi

    # public key one line
    PUBLIC_KEY=$(cat $PATH_KEYS/${DOMAIN}_pub.key | sed -n '/BEGIN PUBLIC KEY/,/END PUBLIC KEY/p' | sed '/PUBLIC KEY/d' | tr -d '\n')

    # write
    echo
    echo "_domainkey.$DOMAIN.               IN TXT      \"t=y; o=-;\"" >> $ZONE_PATH
    echo "$DOMAIN._domainkey.$DOMAIN.       IN TXT      \"k=rsa; t=s; p=$PUBLIC_KEY\"" >> $ZONE_PATH

fi

SM="$DOMAIN dkim(c=simple,s=$DOMAIN,a=rsa-sha1,key=$PATH_KEYS/$DOMAIN.key), domainkeys(c=nofws,s=$DOMAIN,key=$PATH_KEYS/$DOMAIN.key)"
echo $SM >> $PATH_SENDER_MAP

echo
echo "Please, restart DKIMproxy !"
echo
echo "... And maybe BIND with new serial on $ZONE_PATH !"

Au format compressé : generate_keys.tar.gz

N'hésitez pas à me proposer vos améliorations.

mercredi, février 27 2008

Un script de monitoring ultra simpliste

Loin de Nagios et de ses innombrables possibilités, voici un script bash minimaliste pour tester la disponibilité d'une machine ou plusieurs machines via un ping et recevoir, en cas de non réponse, les alertes par SMS[1] et/ou mail. Le principe est le suivant :

  • on teste toutes les X minutes la disponibilité des hôtes
  • si une machine est détectée down, on le note dans un fichier temporaire
  • si 5 minutes après la machine est toujours down, on lance les alertes
  • quand la machine est de nouveau up, on renvoi un mail (pas de SMS dans ce cas)

Pour configurer le script, il suffit de préciser les variables commentées au début du fichier.

#!/bin/bash

# pingTest par Yves et Thierry
# http://www.grafactory.net/blog/
# 2008 / Licence LGPL

# les hotes a tester
HOSTS="domain.tld autredomaine.tld"

# sujets des mails
SUBJECT="machine down"
SUBJECT_UP="machine up"

# envoyer un SMS via tm4b.com
EMAILID="moi@domain.tld"
TELID="XXXXX"
PASSWD="XXXXX"

# envoyer un simple mail
EMAILSIMPLE="moi@domain.tld"

# nombre test
COUNT=4

for myHost in $HOSTS
do
    if ! ping -q -c $COUNT $myHost >> /dev/null
    # elle est KO
    then
        if [ ! -f /tmp/mail.$myHost ]
        # on n est pas encore au courant
        then
            if [ -f /tmp/ping.$myHost ]
                # elle etait KO cinq minutes avant, faut prevenir
            then
                # envoyer un SMS
                echo "To - $TELID\nFrom - $TELID\nMessage - La machine $myHost ne repond plus a $(date)\nPassword - $PASSWD" |\
                mail -s "[$myHost] $SUBJECT" $EMAILID
                # envoyer un mail normal
                echo "La machine $myHost ne repond plus a $(date)" |\
                mail -s "[$myHost] $SUBJECT" $EMAILSIMPLE
                #  creer le fichier pour indiquer que le mail a ete envoye
                touch /tmp/mail.$myHost
            fi
            touch /tmp/ping.$myHost
        fi
    else
        # elle n est pas KO
        if [ -f /tmp/ping.$myHost ]
        then
            rm /tmp/ping.$myHost
        fi
        if [ -f /tmp/mail.$myHost ]
        then
            rm /tmp/mail.$myHost
            # renvoyer un mail
            echo "La machine $myHost repond a nouveau a $(date)" |\
            mail -s "[$myHost] $SUBJECT_UP" $EMAILSIMPLE
        fi
    fi
done

Dans la crontab, on ajoute la ligne suivante (ici, un test toute les 5 minutes).

# faire un test de ping toutes les 5 min
*/5 * * * * /usr/local/sbin/pingtest >> /dev/null

(on suppose donc ici que le script est installé dans /usr/local/sbin/)

Toutes les améliorations sont les bienvenues ;)

Notes

[1] Pour recevoir les alertes par SMS, j'utilise le service Email to SMS de TM4B . Les SMS peuvent être de prépayés via PayPal à un tarif très intéressant. Cette société propose aussi un API très complet pour l'envoi de SMS depuis un programme, un site Web...