mardi 6 mai 2014

Recompilation de l'utilitaire "file" pour Synology

TLDR; Solution pour corriger le segfault de "file": remplacer le fichier /opt/lib/libmagic.so.1.0.0 par celui-ci:
https://drive.google.com/file/d/0B9w1DBAb0xtWSDBhdWFadjZyQTg/edit?usp=sharing

Le problème 

Depuis la dernière mise à jour ipkg, l'utilitaire "file" ne marche que partiellement sur mon Synology DS 207+. Symptômes:
file /path/to/something
renvoie la bonne information de fichier mais est suivie d'un segfault:
/path/to/something: RAR archive data, v1d, os: Win32
Segmentation fault (core dumped)

En soi, l'utilitaire reste utilisable en ligne de commande, mais il ne peut plus être appelé dans un script, car dès qu'on essaie de sauver le stdout, le segfault prend le pas et rien n'est sauvé. file /path/to/something | grep . ne renvoie rien, myvar=$(file -b /path/to/something) est vide.

La solution

Il faut recompiler file, en version 5.12. Pour cela, installer le toolchain, comme expliqué dans l'article sur rsyncrypto. Puis, télécharger le code de file-5.12, ici: ftp://ftp.astron.com/pub/file/file-5.12.tar.gz . L'extraire, et modifier le fichier src/apprentice.c ainsi:
--- apprentice.c.old    2014-05-06 09:57:34.154444863 +0200
+++ apprentice.c    2014-05-06 09:59:03.834446304 +0200
@@ -348,11 +348,9 @@
 protected void
 file_ms_free(struct magic_set *ms)
 {
-    size_t i;
     if (ms == NULL)
         return;
-    for (i = 0; i < MAGIC_SETS; i++)
-        mlist_free(ms->mlist[i]);
+    mlist_free(ms->mlist[0]);
     free(ms->o.pbuf);
     free(ms->o.buf);
     free(ms->c.li);


Recompiler (comme pour rsyncrypto) avec:
./configure --host=arm-marvell-linux-gnu --target=arm-marvell-linux-gnu --build=i686-pc-linux --prefix=/opt/
CC=arm-marvell-linux-gnu-gcc ARCH=arm make
(en cas de problème de compilation, il vous faudra peut être installer file5.12 sur votre machine compilante et/ou transférer votre fichier synology /opt/share/misc/magic.mgc vers votre répertoire source de compilation)

Puis transférer le fichier résultat: src/.libs/libmagic.so.1.0.0 (qui sera ainsi non-strippé par ailleurs, de même que le binaire file situé au même endroit mais qu'il n'est pas nécessaire de transférer, lui) vers le Synology, dans /opt/lib/
Lien vers le fichier libmagic.so.1.0.0 recompilé pour DS-207+:
https://drive.google.com/file/d/0B9w1DBAb0xtWSDBhdWFadjZyQTg/edit?usp=sharing

Pour info, mais non-nécessaire, le lien vers le binaire file recompilé, non-strippé:
https://drive.google.com/file/d/0B9w1DBAb0xtWdVFyT0d2TmNFVHM/edit?usp=sharing


(NB: le core dump se fait dans /volume1/@file.core , pour tout autre système, vous pouvez savoir où se trouve votre coredump en faisant:
cat /proc/sys/kernel/]core_pattern

Pour plus d'info: Read /usr/src/linux/Documentation/sysctl/kernel.txt.
[/proc/sys/kernel/]core_pattern is used to specify a core dumpfile pattern name.

If the first character of the pattern is a '|', the kernel will treat the rest of the pattern as a command to run. The core dump will be written to the standard input of that program instead of to a file.
Pour debugger cela, vous auriez eu besoin de gdb sur le syno, puis de faire du gdb à coup de :
file /path/to/something
gdb file /volume1/@file.core 
avec des versions de file et libmagic.so.1.0.0 recompilées pour ne pas être strippées.
Puis les commandes gdb classiques: "bt", ...
)


lundi 31 janvier 2011

Ajout de ldd sous Synology

Par défaut, il n'y a pas LDD sur le synology DS-207+
Voici une méthode simple pour en obtenir un:
Ouvrir sa boite linux préférée, et taper:
which ldd
Copier le fichier renvoyé sur le synology
Eventuellement l'ouvrir et éditer la première variable RTLDLIST pour enlever la lib 64 bits si vous avez pris votre ldd depuis un 64 bits
Il vous faut bash :
ipkg install bash
Et voilà. Utilisation de LDD:
bash ldd mon_executable

Edit:
J'ai aussi découvert ce lien :
http://benjamin-balet.info/multimedia/synology/il-ny-a-pas-dutilitaire-ldd-sur-mon-syno/ qui permet d'obtenir sensiblement les mêmes résultats avec des paquets ipkg.

Compilation de rsyncrypto pour le Synology DS-207+

Ce week end, j'ai décidé de compiler rsyncrypto pour le Synology DS-207+. Je vous livre la procédure suivie sur mon Ubuntu.

NB: je n'ai pas testé l'option pour zipper les contenus mais je livre quand meme la procédure qui devrait fonctionner meme si elle n'est pas complète

Tout d'abord, télécharger le toolchain pour cross compiler sous Ubuntu: http://en.sourceforge.jp/projects/sfnet_dsgpl/downloads/DSM%203.0%20Tool%20Chains/Marvell%2088F5281%20Linux%202.6.15/gcc343_glibc232_88f5281.tgz/

Passer root:
sudo su
Décompresser l'archive dans un répertoire: moi dans /home/user/src/
tar xzvf ../Downloads/gcc343_glibc232_88f5281.tgz
mv usr/local/arm-marvell-linux-gnu/ .

Se mettre en mode de développement:
cd arm-marvell-linux-gnu/bin
PATH="$PATH:/home/user/src/arm-marvell-linux-gnu/bin/:/usr/bin:/bin"

Télécharger argtable 2.12 et compiler:
http://www.icewalkers.com/Linux/Software/51540/argtable.html
tar xzvf /home/user/Downloads/argtable2-12.tar.gz
cd argtable2-12
./configure --host=arm-marvell-linux-gnu --target=arm-marvell-linux-gnu --build=i686-pc-linux --prefix=/usr/local
make CC=arm-marvell-linux-gnu-gcc ARCH=arm
cp src/.libs/libargtable2.so* ../../lib/
cd ..

Télécharger openssl et le compiler (juste pour avoir la lib et les headers, je suis sur qu'il y a un moyen plus simple basé sur un retrieve depuis le syno, mais ceci marche pour moi)
http://www.openssl.org/source/openssl-1.0.0c.tar.gz
tar xzvf /home/user/Downloads/openssl-1.0.0c.tar.gz
cd openssl-1.0.0c/
export cross=arm-marvell-linux-gnu-
./Configure dist
make CC="${cross}gcc" ARCH=arm AR="${cross}ar r" RANLIB="${cross}ranlib"
cp libcrypto.a ../../lib/
cd ..

Télécharger rsyncrypto (moi j'ai chopé les sources via la commande SVN indiquée sur sourceforge) et compiler:
cp -r path_to_rsyncryptoSVN/rsyncrypto/tags/V1.12/ rsyncrypto
cd rsyncrypto
./bootstrap
ln -s ../openssl-1.0.0c/include/openssl/ .
ln -sf /home/user/src/arm-marvell-linux-gnu/bin/argtable2-12/src/argtable2.h /home/user/src/arm-marvell-linux-gnu/include/argtable2.h
./configure --host=arm-marvell-linux-gnu --target=arm-marvell-linux-gnu --build=i686-pc-linux --prefix=/usr/local
make CC=arm-marvell-linux-gnu-gcc ARCH=arm
make all-am
cd ..

Copier les fichiers générés vers le synology
cp rsyncrypto/rsyncrypto{,_recover} argtable2-12/src/.libs/libargtable2.so.0.1.7 SYNOLOGY

su le DS207+:
ln -s libargtable2.so.0.1.7 libargtable2.so.0
ln -s libargtable2.so.0.1.7 libargtable2.so
mv libargtable2.so* /lib
ldconfig

Pour gzip: le gzip fourni doit marcher mais ne sera pas optimisé pour l'utilisation avec rsyncrypto. Du coup il est conseillé de télécharger le patch suivant:
télécharger gzip 1.3.13
http://article.gmane.org/gmane.comp.gnu.gzip.bugs/258
URL du patch:
http://svn.exactcode.de/t2/trunk/package/archiver/gzip/gzip.rsync.patch
copier la section du patch à proprement parler: (starting at --- +++ lines), remplacer tous les 'b/' avec des '' et placer le fichier obtenu dans le répertoire src de gzip (nommé patch)
patch -p0 < patch
J'ai aussi du modifier le temps de la compilation le fichier/home/brehon/src/arm-marvell-linux-gnu/bin/../lib/gcc/arm-marvell-linux-gnu/3.4.3/../../../../arm-marvell-linux-gnu/sys-include/getopt.h
Pour ajouter ligne 150 (sous le #ifndef):
#ifdef YANNICK
et ligne 164 (sous la déclaration __getopt_internal)
#endif /*Yannick*/
La compilation se fait ensuite comme précédemment
./configure --host=arm-marvell-linux-gnu --target=arm-marvell-linux-gnu --build=i686-pc-linux --prefix=/usr/local
make CC=arm-marvell-linux-gnu-gcc ARCH=arm
et on peut copier les fichiers générés vers le syno :) voilà.

Enjoy

PS: edit: les fichiers compilés sont mis à disposition ici: http://dl.free.fr/alw7TCU1a . s'ils n'y sont plus, contactez moi pour une copie.

jeudi 25 novembre 2010

Toujours ce mauvais modem routeur N150

Cette belle merde ne sait pas ce qu'est une DMZ.
Si je mets une machine dans la DMZ, en fait il n'est juste plus couvert par le firewall. Un vrai modem routeur doit envoyer toutes les connections entrantes sur des ports non réservés vers la DMZ... le N150 les filtre.
Impossible du coup de rendre mon N150 transparent.
Je voulais faire:
N150 -- DDWRT -- Machines
Impossible, car il faut déclarer sur le N150 tous les ports à envoyer vers le DDWRT, et cela est limité à 20.
Et avec en plus le besoin d'UPnP pour faire du SIP, j'ai abandonné.
J'ai remplacé le N150 par un Netgear. Ca a marché directement comme attendu, le SIP marche sans le moindre forward de ports déclaré grace à l'UPnP du DDWRT, bref, je suis enfin content.
Je maudis Belkin.

mercredi 30 juin 2010

La lente mort de Bonzy


Je crois malheureusement que mon petit Bonzy se meurt. Après avoir passé, il y a un mois et demi de cela, une semaine tout seul sans arrosage dans une canicule surprise, la femme de ménage me l'a innondé d'eau sans ma permission. Je ne sais pas ce qui l'a tué, mais il reste désespérement sec, malgré mon espoir de le raviver avec un arrosage normal. Comme vous le constatez, il est sec, se dépérit, pert ses feuilles qui sont toutes blanches et pique du nez.
Ici, on l'appelle désormais "la branche de romarin séchée", c'est dire à quel point on y croit...

Published with Blogger-droid v1.3.8

L'enfer des mauvais modems routeurs

Aujourd'hui j'ai voulu faire une amélioration de ma config réseau. Pour des raisons logistiques, cela impliquait pas mal de démontage de prises, déplacement d'équipements. J'ai passé presque 3 heures à tester toute ma config, tout ça pour me rendre à l'évidence: mon modem routeur Belkin N150 est une brave merde.

Alors voilà, tout a commencé lorsque j'ai voulu faire du SIP depuis mon nouveau joli androphone. Bizarrement, je n'arrivais pas à envoir de son en SIP. Pourtant, j'avais déjà fait du SIP facilement avec le même provider (freephonie) dans un autre réseau. Après avoir mis en cause free, innocenté mes configs logicielles par moults tests, je me suis rendu conmpte que l'absence de son (dans les 2 sens) après l'établissement de la communication provenait de mon réseau. Documentation prise, SIP établit une session RTP depuis le port 8000 par défaut. A tout hasard, j'ouvre donc le port 8000 de mon routeur modem et bam le son passe. Après une courte hésitation, je décide qu'il est temps de changer ma config réseau.

Situation avant: un Belkin modem routeur (premier prix Surcouf des modems adsl2+, nécessaire en belgique) pour l'accès web. Branché sur une patte LAN de mon WRT qui sert de DHCP, point d'accès Wifi et switch avec mes autres équipements ethernet.

Situation après: le N150 est en point à point avec le WRT sur sa patte WAN, et le switch LAN WRT irrigue mon réseau local+un nouveau switch basique déballé pour l'occasion. Je mets sur le N150 une DMZ pointant sur le WRT, de façon à rendre le N150 transparent. Ou crois-je. Plus d'une heure après, je me rends compte que la DMZ ne fonctionne en fait que si je réactive le firewall du N150, sans quoi il refuse toute connection externe non explicitement ouverte par la page de config de l'ouverture de ports (limitée de plus à 20 ports et aucun range: la classe.). Donc je réactive le firewall, youpi, la DMZ fonctionne. Je me retrouve avec une config à peu près fonctionnelle (je passe, ou pas finalement, sur le grand nombre de déco WIFI liées au déplacement du WRT vers une zone polluée par trop d'autres WIFI et/ou liées à l'orientation des antennes et liées également, ça c'est sur, au reparamétrage des fonctions routeur: à chaque reparamétrage ou presque, on perdait le wifi quelques secondes).
Sauf que du coup, le firewall (enfin, je le suspecte) empêche le passage du son SIP, va savoir pourquoi. En tous cas, mon WRT ne reçoit aucune connexion sur le port 8000, donc j'en déduis que c'est le N150 qui filtre arbitrairement.

A ce moment là, j'ai donc le choix: garder ma nouvelle config mais ne plus avoir le SIP du tout, ou remettre l'ancienne et forcer le SIP sur l'IP de mon android, mais personne d'autre ne peut faire de SIP. Pour l'instant je choisis donc le retour en arrière. Dommage, car ça me bloque pour mon prochain upgrade qui n'aurait marché qu'avec le WRT en série avec le N150: router les paquets bittorrent et eux uniquement via une connexion VPN ipredator. Mais je ne perds pas espoir: dès lors que j'aurai la main sur un modem ADSL2+ digne de ce nom, je réessaie! Beaucoup plus simplement maintenant car toute la config est prête, les équipements sont bien disposés, il n'y a plus qu'un cable à déplacer sur le DDWRT.

Mon conseil: n'achetez pas pour votre modem une merde Belkin. Soit un WRT qui fait modem (ça existe sûrement), soit un vrai modem digne de ce nom (Livebox, freebox, ou autre. dès que j'aurai testé un linksys je referai un post)


PS: ah et pour bien ruiner les logs de dd wrt, il est impossible de désactiver l'upnp du N150. Vraiment un article de qualité ce N150

mardi 18 mai 2010

Subversion over SSH

Petit pense-bête pour faire fonctionner svn sur ssh, avec des hooks.
Après l'install de svn (apt-get install subversion et cie, svnadmin create monrepo, ...), il y a quelques étapes à suivre pour que plusieurs utilisateurs puissent accéder au repo en svn+ssh:
- Penser à faire un chown -R sur "monrepo" pour que le groupe propriétaire soit "developers" par exemple (peu importe le user owner), puis un chmod -R g+w monrepo pour que tout le groupe puisse toucher au svn
- Ajouter au groupe developers les utilisateurs SVN qui seront amenés à commit (usermod -a -G developers userA)
- Modifier les droits d'accès à l'appli SVN elle meme: editer le fichier monrepo/conf/authz pour le rendre adéquat
- Si un client doit se connecter en SSH pour modifier le SVN et sur un port non standard, éditer son .subversion/config, et dans la section [tunnels] rajouter un type de tunnel: mytunnel = ssh -p 1234. Dès lors les URL svn+mytunnel:// doivent fonctionner

A ce stade SVN over SSH (port non standard) doit fonctionner

Pour activer le hook pre-commit par défaut (il vérifie la présence d'un comment et a sa propre gestion de droits par-repertoire), il faut:
- cp monrepo/hooks/pre-commit{.tmpl,}
éventuellement, éditer (moi j'ai modifié le script pour avoir un message d'erreur:
$SVNLOOK log -t "$TXN" "$REPOS" | \
   grep "[a-zA-Z0-9]" > /dev/null || NOCOMMENT=1
test "$NOCOMMENT" && echo "please add a comment to your commit (use -m option)" 1>&2 && exit 1
)
- si il y a une erreur PERL lors du commit sur des histoires de @INC et de fichiers ini foireux faire un : sudo perl -MCPAN -e 'install Config::IniFiles'
- si ensuite il y a un problème de fichier de config non trouvé, faire un cp /usr/share/subversion/hook-scripts/commit-access-control.cfg.example monrepo/hooks/commit-access-control.cfg , l'éditer et dans le pre-commit hook, vérifier que le path vers ce fichier est absolu et non relatif lorsqu'il est appelé.