Sunday 10 January 2010

Modifier un paquet Debian rapidement (méthode sale)

Parfois on veut modifier juste un petit bout de fichier de configuration dans un paquet Debian. L'utilisation du classique apt-get source, apt-get build-dep et dpkg-buildpackage est alors très longue et lourde, sans parler de tous les paquets, nécessaires à la recompilation, à installer.

Voici deux scripts de mon cru qui permettent de décompresser un paquet binaire, faire les changements nécessaires et reconstruire le paquet. C'est une méthode qui est sale dans la mesure où elle ne respecte pas les procédures de construction de paquets chez Debian, mais elle est très rapide lorsqu'il faut déployer rapidement une configuration personnalisée.

deb-dirty-extract.sh :

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
 
if [ ! -f "$1" ] ; then
  echo "No such file"
fi
 
DIR=${1%%.deb}
mkdir "$DIR" && cd "$DIR"
ar x "../$1"
mkdir data control
cd data && tar -zxf ../data.tar.gz && cd ..
cd control && tar -zxf ../control.tar.gz

deb-dirty-rebuild.sh :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
if [ ! -f 'debian-binary' -o ! -d 'control' -o ! -d 'data' ] ; then
  echo "No extracted deb file here"
  exit 1
fi
 
if [ -z "$1" -o ! -f "$1" ] ; then
  PKG="../"$(basename $PWD)"-custom.deb"
else
  PKG="$1"
fi
echo "Writing new package to $PKG..."
 
rm -f control.tar.gz data.tar.gz "$PKG"
 
cd data && tar -zcf ../data.tar.gz ./ && cd ..
cd control && tar -zcf ../control.tar.gz ./ && cd ..
ar rc "$PKG" debian-binary control.tar.gz data.tar.gz

Utilisation typique :

wget http://.../.../paquet.deb
deb-dirty-extract.sh paquet.deb
cd paquet
[...] # vos modifications
deb-dirty-rebuild.sh

Wednesday 6 January 2010

Mes codes pour les qualifications de Prologin 2010

Cette année, je participe à nouveau au concours d'informatique Prologin. Voici mes codes pour les qualifications (terminée le 5 janvier).

Également disponible sur mon dépôt SVN :
http://grapsus.net/svn/prog/trunk/prq10/

Continue reading...

Tuesday 5 January 2010

Downgrader deluge-torrent sur Debian Sid

Il y a de gros dysfonctionnements dans les derniers paquets du client torrent deluge, notamment l'interface web est inutilisable. Voici un moyen rapide pour revenir à la version précédente, celle de Debian lenny :

dpkg -r deluge deluge-common deluge-gtk deluge-torrent deluge-web deluge-webui
wget http://ftp.de.debian.org/debian/pool/main/d/deluge-torrent/deluge-torrent-common_0.5.9.3-1_all.deb
wget http://ftp.de.debian.org/debian/pool/main/d/deluge-torrent/deluge-torrent_0.5.9.3-1_i386.deb
wget http://ftp.de.debian.org/debian/pool/main/b/boost/libboost-date-time1.34.1_1.34.1-14_i386.deb
wget http://ftp.de.debian.org/debian/pool/main/b/boost/libboost-thread1.34.1_1.34.1-14_i386.deb
wget http://ftp.de.debian.org/debian/pool/main/b/boost/libboost-filesystem1.34.1_1.34.1-14_i386.deb
aptitude install python-dbus
dpkg -i libboost-* deluge-*

Friday 1 January 2010

Nagios et les locales des plugins

Nagios a plein de fonctionnalités intéressantes, mais du côté de la localisation et des encodages de caractères c'est très mal géré. Par exemple on ne peut pas choisir l'encodage des pages web de l'interface (à moins de faire des bidouilles du côté du serveur HTTP), les caractères accentués sont supposés être en ISO-8859 et sont automatiquement convertis en codes HTML ce qui rend impossible leur affichage correct sur un système fonctionnant en UTF-8. Encore, ces problèmes n'affectent pas les fonctionnalités du logiciel. Par contre les plugins s'amusent à exécuter des commandes sans se soucier de la locale utilisée, si bien que la sortie dépend de la langue du système ! À partir de là, les pages de résumé ne ressemblent à rien, Nagiosgrapher marche une fois sur deux etc. Je n'ai pas trouvé comment remédier à ce problème sur le net; dans les rapports de bugs Debian correspondants, on va jusqu'à dire que c'est normal. J'ai essayé de changer la locale de Nagios dans son script init, mais celui-ci se fork et certains résultats sont en anglais alors que d'autres restent en français de manière complètement aléatoire.

Voici ma solution définitive à ce problème : recompiler Nagios avec la modification suivante dans le fichier base/checks.c :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
350,352d349
<       
<       char *current_locale;
<       char previous_locale[40];
762,768d758 
<                       /* Grapsus : run plugins with no locale */
<                       if(current_locale = getenv("LC_ALL"))
<                       {
<                               strncpy(previous_locale, current_locale, 40);
<                               previous_locale[39] = 0;
<                       }
<                       setenv("LC_ALL", "C", 1);
770,774d759 
<                       if(current_locale)
<                               setenv("LC_ALL", previous_locale, 1);
<                       else
<                               unsetenv("LC_ALL");
<                       /* End grapsus run plugins with no locale */

Avec ce patch, Nagios va se mettre en locale par défaut avant d'exécuter un plugin, de sorte que les résultats seront homogènes et facilement lisibles avec Nagiosgrapher.

Voici comment obtenir le code source sous Debian :

apt-get source nagios3
apt-get build-dep nagios3

Une fois le patch appliqué, on reconstruit le paquet avec :

dpkg-buildpackage -uc -us

Tuesday 29 December 2009

Transfert d'appel Free à distance

Chez Free il est impossible, pour raisons de sécurité, de paramétrer un renvoi d'appels depuis une autre adresse IP que la sienne. Voici un script shell à éxécuter sur une machine chez soi pour contourner ce système et paramétrer le transfert d'appels depuis l'extérieur :

transfert.sh :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
 
LOGIN=""
MDP=""
 
TMP="/tmp/transtmp"
if [ ! -d "$TMP" ] ; then
         mkdir -p "$TMP" || (echo "Dossier temporaire inaccessible" ; exit 1)
fi
 
NUMERO="$1"
if [ -n "$NUMERO" ] ; then
        TRANSINC='&transinc=transinc'
fi
 
USERAGENT='Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5'
 
wget --no-check-certificate --quiet --keep-session-cookies --save-cookies="$TMP/free-cookie" \
 --user-agent="$USERAGENT" --post-data='login='"$LOGIN"'&ok=Connexion&pass='"$MDP" \
 -O "$TMP/login.html" https://subscribes.free.fr/login/login.pl
 
ID=`grep -o 'id=[[:alnum:]]*&idt=[[:alnum:]]*' "$TMP/login.html"  | tail -n 1` 
if [ -z "$ID" ] ; then
        echo "Login : erreur."
        exit 1
fi
echo "Login : OK"
 
wget --no-check-certificate --quiet --keep-session-cookies --load-cookies="$TMP/free-cookie" \
 --user-agent="$USERAGENT" --post-data='appsort=0000&delai=5&incon='\
 "$NUMERO"'&mevo_delai=35&mevo_mode=5&nonrep=&occup='"$TRANSINC" \
 -O "$TMP/transfert.html" 'https://adsls.free.fr/admin/tel/adminservice_valid.pl?'"$ID"
 
export LC_ALL=c
if grep -sq 'Donn.*valid.' "$TMP/transfert.html" ; then
        echo "Transfert : OK"
else
        echo "Transfert : erreur"
        exit 2
fi
 
rm -f "$TMP/*"

Si aucun numéro n'est fourni en paramètre, le script désactive le renvoi d'appels, sinon il l'active pour ce numéro. Ne pas oublier de renseigner son login et son mot de passe Free au début du code.

Voici une version CGI (à placer dans un dossier cgi-bin Apache ou Lighttpd) qu'on peut exécuter par exemple à partir d'un smartphone ( transfert-cgi.sh?numero=... ) :

transfert-cgi.sh :

1
2
3
4
5
6
7
8
#!/bin/bash
 
echo "<html><body>"
 
NUMERO=`echo "$QUERY_STRING" | cut -f 2 -d '='`
./transfert.sh "$NUMERO"
 
echo "</body></html>"

En plus ces scripts peuvent servir de base pour d'autres automatisations chez le même FAI, il suffit de récupérer la requête à rejouer avec Firebug ou Wireshark et de la lancer à la place de la deuxième requête du script.

Édition du 16 juillet 2010

L'interface de Free est passée en HTTPS, j'ai adapté le script présenté dans cet article.

- page 5 of 6 -