Planet Asrall

December 01, 2016

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet dernier, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de novembre !

Elle arrive un poil en retard… parce que j’avoue, hier soir, après 4h de cours avec les ASRALL, j’étais sur les rotules. Impos­sible de faire quoi que ce soit qui néces­si­tait l’ac­ti­va­tion de plus de deux neurones.

Merci à :

Les contre­par­ties physiques (stickers, photos de mon chat) sont bien parties en novembre, et elles sont norma­le­ment arri­vées à bon port (j’ai au moins une confir­ma­tion de bonne récep­tion).

Profi­tons un peu de cet article pour faire un petit résumé de mon acti­vité libriste du mois de novembre :

  • J’ai enfin pris le temps de rema­nier le vieux cours de Perl que j’avais écrit en 2009 avec Julien Vaubourg. Outre sa mise à jour, ce cours a béné­fi­cié d’une réécri­ture en Mark­down : cela me permet de ne plus m’oc­cu­per d’écrire le code LaTeX kiva­bien, c’est pandoc qui s’en charge :-) Enfin, les sources du cours sont main­te­nant sur Frama­git, avec en plus une recom­pi­la­tion auto­ma­tique en PDF chaque fois que je pousse sur le dépôt : le pdf publié est donc toujours à jour
  • Publi­ca­tion de mes cours de licence ASRALL sur le web. L’avan­tage d’écrire en Mark­down, c’est qu’a­vec un mini­mum d’ef­fort, on peut sortir des docu­ments en PDF, mais aussi sortir de l’HTML. Partant de là, je me suis dit que ce serait dommage de ne pas en profi­ter pour diffu­ser plus large­ment mes cours :-) (les cours arrivent au fur et à mesure que je les rema­nie, donc il y aura un nouveau chapitre toutes les semaines) Et puis tant qu’à faire, le cours de Perl est aussi en ligne, au même endroit :D
  • Docu­men­ta­tion d’une fonc­tion­na­lité de l’API d’Ether­pad. La fonc­tion­na­lité exis­tait, mais n’était pas dans la docu­men­ta­tion de l’API !
  • Correc­tion d’une typo sur Gitlab-Omni­bus
  • Correc­tion d’un bug sur Gitlab
  • Ajout d’un bout d’API en plus sur Lutim, pour obte­nir des infor­ma­tions sur la confi­gu­ra­tion du serveur. Cela devrait faci­li­ter le travail de Schoumi sur Goblim
  • Ajout de la récu­pé­ra­tion de la version HTML d’un pad sur padcon­sole
  • Diverses amélio­ra­tions sur Lstu, dont un nouveau thème plus léger, et un meilleur cache des fichiers dans le navi­ga­teur. Lstu devient deux fois plus rapide !

On peut le voir : je n’ai pas fait que du code ce mois-ci. On oublie faci­le­ment que même les plus infimes parti­ci­pa­tions (comme la typo sur Gitlab-Omni­bus) sont appré­ciées, et que le libre, ce n’est pas que du code, c’est aussi le partage du savoir (cf la doc de la fonc­tion d’API manquante sur Ether­pad et mes cours).

EDIT : ce bilan ne tient pas compte de ce que j’ai fait pour Frama­soft en tant que sala­rié, je n’ai parlé ici que de ce que j’ai fait en dehors de mes heures de travail.

Parta­ger

Flattr this!

by Luc at December 01, 2016 08:17 PM

November 07, 2016

Florent Peterschmitt

Windows 7/2008, Samba 3, Updates

Des machines Windows 7 et 2008 R2 n’arrivent pas à se connecter à un partage de fichier, alors que d’autres machines sous les mêmes OS et le même réseau le peuvent.

Dans les logs Samba, on pouvait voir Connection reset by peer et Server exit (failed to receive smb request), alors qu’une connexion réussie ne retourne jamais ce genre d’erreur.

Pas de résolution en mettant à jour vers la dernière version de Samba 3.5, et pas plus en 3.6. Je n’ai pas pu tester Samba 4 car il était impossible de l’intégrer chez le client.

Donc, après avoir épluché :

  • les logs
  • les firewall
  • les jointures au domaine
  • les éventuels problèmes d’authentification et être allé jusqu’à la page 2 de Google…

…il apparaît que certaines MAJ de Windows sont en cause : en prenant un PC pas à jour, qui arrive à monter le partage, après mise à jour, plus rien ne fonctionne.

Sauf que trouver et supprimer les MAJ ne résoud rien. Modifier certaines clefs de registre (je ne sais plus lesquelles) ne résoud rien non plus.

J’ai en revanche trouvé l’option samba qui permet de remettre les choses en fonctionnement, en parcourant la doc de Samba 3 de haut en bas :

[global]
    server signing = auto

En passant cette option à disabled, je reproduis mon impossibilité d’accès au partage, et ce même après reboot des clients entre chaque changement de l’option —jouuur, nuit, jouuur, nuit, jouuur, nuit—.

Tips

Un petit truc qui m’a permit de récupérer facilement les informations sur les MAJ windows des machines :

Get-WmiObject -Class "win32_quickfixengineering" | Select-Object -Property "Description", "HotfixID", @{Name="InstalledOn"; Expression={([DateTime]($_.InstalledOn)).ToLocalTime()}}

Puis :

for i in $(cat hotfixes | sed -rn 's/.*KB([0-9]+).*/\1/gp'); do chromium "https://support.microsoft.com/en-us/kb/$i" ; read ; done

Ensuite jouez du clavier… sous i3, c’est facile :D Je n’ai pas poussé à l’extrème l’automatisation, mais ça fait déjà gagner un temps certain.

by Florent Peterschmitt at November 07, 2016 06:00 PM

October 31, 2016

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet dernier, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle d’oc­tobre !

Merci à :

Bonne nouvelle pour les contre­par­ties physiques : les enve­loppes sont sur mon bureau, remplies et adres­sées, et n’at­tendent plus qu’un passage à la poste pour les peser et les envoyer ! Et ce sera fait cette semaine, donc surveillez vos boîtes aux lettres :-)

Parta­ger

Flattr this!

by Luc at October 31, 2016 03:41 PM

October 16, 2016

Simon Florentin

[MCP] Introduction au protocole Mackie Control

Retour inatendu sur le blog, cet article est le début d'une petite série concernant la réalisation d'une surface de controle pour DAW via le protocole Mackie Control, largement utilisé dans le milieu audionumérique.

by Simon at October 16, 2016 09:48 AM

October 10, 2016

Luc Didry

Bye Twit­ter

Comme annoncé sur Diaspo­ra* il y a moins de deux semaines, je coupe­rais mon compte Twit­ter fin octobre.

J’en ai assez d’être accro à ce réseau, constam­ment en peur de manquer quelque chose. Et puis, ça pue, c’est pas libre !

Donc j’ai mis en place un bot twit­ter qui répond auto­ma­tique­ment aux gens qui m’in­ter­pellent que je me casse. Ce bot est libre et simple d’em­ploi (un peu mal codé aussi :P ) et vous pouvez vous aussi l’em­ployer pour annon­cer votre départ :-) (ou juste pour emmer­der les gens, ça marche aussi :D )

J’ai aussi enlevé l’on­glet de Twit­ter de mon Fire­fox, désins­tallé Twidere de mon télé­phone et j’ar­rête de parta­ger mes posts Diaspo­ra* sur Twit­ter. La liai­son Twit­ter de ce blog sera coupée juste après la paru­tion de ce billet :-)

Et après cela, je ne serais plus que sur Diaspo­ra* et Twis­ter (comme d’hab, mon pseudo y est @fra­masky). Et pis sur LinuxFr quand même aussi, c’est un réseau social aussi, non mais ho.

Crédits : Dead bird, par Tris­tan Bower­sox, CC-BY, retou­ché par mes soins (crop + colo­ri­sa­tion)

Parta­ger

Flattr this!

by Luc at October 10, 2016 07:42 PM

October 05, 2016

Florent Peterschmitt

ArchLinux - Kernel custom

C’est pas nouveau, le kernel d’ArchLinux est géré d’une manière foireuse et certaines options ne sont pas présentes pour des raisons… mouais, bon.

Pour ma part, j’ai besoin du framework AUDIT, qui n’est pas compilé pour une raison que je trouve un peu légère.

En plus de ça, je pourrai passer d’un kernel PREEMPT à un kernel SMP classique car le module de la carte Wifi broadcom ne supporte que ce mode. Avec PREEMPT, on se retrouve à avoir des freeze du scheduler…

Mais bon peu importe : ce n’est pas compliqué de construire un kernel maison et packagé en prime !

Go

pacman -S abs
abs
cp -ar /var/abs/core/linux /tmp/ # je build dans /tmp car j’ai de la RAM
cd /tmp/linux/

makepkg --skippgpcheck -o # telechargement + extraction des sources

sed -i PKGBUILD -e 's/^pkgbase=linux/pkgbase=linux-custom/' # changer le nom parce ce qu'on veut

cd src/linux-4.7

make menuconfig # ou cp de sa configuration...

cd ../..
makepkg -e
pacman -U linux-custom-*.pkg.tar*

Ensuite on est prêt pour mettre à jour GRUB, évidemment :

grub-mkconfig -o /boot/grub/grub.cfg

Les modules gérés par DKMS seront pris en charge avec ce nouveau kernel.

by Florent Peterschmitt at October 05, 2016 08:59 AM

October 03, 2016

Luc Didry

Le pouvoir de nuisance des silos de mail

Quand on pense aux GAFAM, on pense surtout à leur vilaine habi­tude d’as­pi­rer les données de leurs utili­sa­teurs (et des autres aussi d’ailleurs) mais on ne pense pas souvent à leur poids déme­suré dans le domaine du mail.

Google, c’est gmail, Micro­soft, c’est hotmail, live, msn et je ne sais quels autres domaines, etc.

Tout ça repré­sente un nombre plus que consé­quent d’uti­li­sa­teurs. Google reven­diquait en 2015 900 millions de comptes Gmail. Bon ok, il y en a une part qui ne doit servir qu’à avoir un compte pour son télé­phone android, mais quand même. C’est énorme.

Je n’ai pas de statis­tiques pour Micro­soft et Yahoo, mais c’est pareil : ils pèsent un certain poids, et même un poids certain.

Ce qui nous ramène à une situa­tion des plus déplai­santes où un petit nombre d’ac­teurs peut en em***er une multi­tude.

Petits exemples vécus :

  • Micro­soft bloque tout nouveau serveur mail qu’il ne connait pas. C’est arrivé pour mon serveur perso, le serveur de mail de Frama­soft que j’ai mis en place, sa nouvelle IP quand je l’ai migré, le serveur de listes de Frama­soft et sa nouvelle IP quand je l’ai migré. Ça me pétait une erreur 554 Message not allowed (de mémoire, je n’ai plus le message sous la main). Et pour trou­ver comment s’en débrouiller, bon courage : la page d’er­reur de Micro­soft n’in­diquait rien. Je n’ai même pas trouvé tout seul (et pour­tant j’ai cher­ché) : c’est un ami qui m’a trouvé la bonne adresse où se faire dé-black­lis­ter (notez au passage qu’il est impos­sible de faire dé-black­lis­ter une adresse ou un bloc d’adresses IPv6).
  • Gmail qui, du jour au lende­main, décide de mettre tous les mails de mon domaine person­nel en spam. Ce qui ne serait pas trop gênant (hé, les faux posi­tifs, ça existe) si ce n’était pour une raison aber­rante (ou alors c’est une sacrée coïn­ci­dence) : ça s’est passé à partir du moment où j’ai activé DNSSEC sur mon domaine. Et ça s’est terminé dès que j’ai ajouté un enre­gis­tre­ment SPF à ce domaine. Or le DNSSEC et le SPF n’ont rien à voir ! Surtout pas dans cet ordre là ! Qu’on ne fasse confiance à un enre­gis­tre­ment SPF que dès lors que le DNS est de confiance (grâce à DNSSEC), soit, mais pourquoi néces­si­ter du SPF si on a du DNSSEC ?
  • Yahoo. Ah, Yahoo. Yahoo a décidé de renfor­cer la lutte contre le spam (bien) mais a de fait cassé le fonc­tion­ne­ment des listes de diffu­sion tel qu’il était depuis des lustres (pas bien). En effet, quand vous envoyez un mail à une liste de diffu­sion, le mail arrive dans les boîtes des abon­nés avec votre adresse comme expé­di­teur, tout en étant envoyé par le serveur de listes. Et Yahoo a publié un enre­gis­tre­ment DMARC indiquant que tout mail ayant pour expé­di­teur une adresse yahoo doit impé­ra­ti­ve­ment prove­nir d’un serveur de Yahoo. C’est bien gentil, mais non seule­ment ça fout en l’air le fonc­tion­ne­ment des listes de diffu­sion, mais surtout ça fout le bazar partout : les serveurs de mail qui respectent les enre­gis­tre­ments DMARC appliquent cette règle, pas que les serveurs de Yahoo. (notez qu’AOL fait la même chose)

On peut le voir, le pouvoir de nuisance de ces trois silos est énorme. Et plus encore dans le cas de Yahoo qui n’im­pacte pas que les commu­ni­ca­tions entre ses serveurs et votre serveur de listes de diffu­sion, mais entre tous les serveurs et votre serveur de listes, pour peu que l’ex­pé­di­teur utilise une adresse yahoo. Et comme il y a encore pas mal de gens possé­dant une adresse yahoo, il y a des chances que vous vous rencon­triez le problème un jour ou l’autre.

Si ces acteurs étaient de tailles modestes, l’en­semble de la commu­nauté pour­rait soit leur dire d’ar­rê­ter leurs bêtises, soit les lais­ser crever dans leurs forte­resses injoi­gnables. Mais ce n’est malheu­reu­se­ment pas le cas :-(

Une seule solu­tion pour faire cesser ce genre d’abus : la dégoo­gli­sa­tion ! Une décen­tra­li­sa­tion du net, le retour à un Inter­net d’avant, fait de petites briques et pas d’im­menses pans de béton.

EDIT : Orange fait aussi son chieur à coup d’er­reurs Too many connections, slow down. OFR004_104 [104]. C’est telle­ment connu que Google suggère de lui-même wanadoo quand on cherche Too many connections, slow down. Voici la solu­tion que j’ai utili­sée : https://blog.network-studio.fr/2011/06/30/too-many-connec­tions-slow-down/.

Crédits : Illus­tra­tion de Vincent Van Gogh, Joseph Roulin assis

PS : ne me lancez pas sur MailInB­lack, ça me donne des envies de meurtre.

Parta­ger

Flattr this!

by Luc at October 03, 2016 06:54 PM

October 01, 2016

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet dernier, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de septembre !

Certes, j’avais dit la dernière fois que je publie­rai cette page le dernier jour de chaque mois, mais Murphy et sa loi se sont invi­tés chez moi :

  • ça fait une semaine que mon ADSL débloque plein tube
  • pas grave, j’uti­li­sais la liai­son 4G de mon télé­phone
  • je n’ai pas trop fait gaffe à ma consom­ma­tion de ce précieux forfait data, me disant que de toute façon, ça repar­ti­rait à zéro le 1er octobre
  • bien évidem­ment, j’ai explosé le forfait hier juste après ma jour­née de travail et ça ne repart… que le 8 octobre
  • le débit après le dépas­se­ment de forfait n’ar­rive qu’à grand peine à me permettre de rele­ver mes mails :-(

Bref, avec les tests avec un autre modem dont il a fallu que je le mette à jour et le recon­fi­gure avant les tests, je n’ai pas eu le temps de prépa­rer mon arti­cle…

Merci, avec un peu de retard donc, et profi­tant d’une pointe de stabi­lité de ma ligne ADSL, à :

Pour ce qui est des contre­par­ties physiques… à ma grande honte, je suis en retard :-( Il faut que je me décide sur la photo de mon chat à impri­mer :-)

PS : j’ai mis des liens sur mes tipeurs pour lesquels j’avais une idée d’un site kiva­bien, mais si vous voulez ajou­ter, modi­fier ou suppri­mer votre lien, il n’y a qu’à me le dire :-)

Parta­ger

Flattr this!

by Luc at October 01, 2016 02:55 PM

September 20, 2016

Florent Peterschmitt

Linux Kernel Network Namespaces et dnsmasq

Bien souvent, nos clients nous mettent à disposition des VPN pour pouvoir les aider à distance pour les cas de support.

Parmis ces VPN, on a Juniper Network Connect, qui touche aux routes et ne permet pas de les modifier (il les remet comme il le souhaite).

Du coup aujourd’hui je suis obligé de passer par une VM/conteneur. C’est peu pratique, mais on va voir comment s’en sortir avec les namespaces réseau et dnsmasq.

Network Namespaces

Un article très intéressant détail ce que sont les namespaces, et je vous en recommande la lecture avant de lire la suite ici. Car en bonne feignasse… voilà.

En gros :

With network namespaces, you can have different
and separate instances of network interfaces and
routing tables that operate independent of each other.

Un peu de théorie

L’objectif est d’avoir un environnement réseau indépendant du reste du système, pour que la connexion VPN puisse y vivre sa vie, sans venir m’enquiquiner sur le reste de mes connexions.

Pour y arriver, j’ai choisi d’utiliser une configuration natée (le VPN est ipv4 uniquement) avec une interface virtuelle qui servira de pont entre mon interface physique et l’interface du namespace.

Mise en place du namespace

Création du namespace :

ip netns add juniper

Mais où sont passées nos interfaces ! ;-)

ip netns exec juniper ip l
ip netns exec juniper iptables -nL

On créer une paire d’interfaces :

  • jun1 : interface dédiée au namespace
  • jun0 : pont entre le lien physique (eth0) et l’interface du namespace (jun1)
ip link add jun0 type veth peer name jun1

On migre jun1 dans le namespace :

ip link set jun1 netns juniper
ip netns exec juniper ip l # Oooooh !

On configure le réseau comme on le ferait avec n’importe quel système. Note : j’utilise ip mais on pourrait utiliser ifconfig…

ip netns exec juniper ip a add 10.252.0.1/24 dev jun1
ip netns exec juniper ip l set jun1 up
ip netns exec juniper ip r add default via 10.252.0.254 dev jun1

On positionne jun0 comme passerelle :

ip a add 10.252.0.254/24 dev jun0
ip l set jun0 up
iptables -t nat -A POSTROUTING -s 10.252.0.0/24 -j MASQUERADE

Voilà, notre namespace réseau juniper est configuré et actif. Maintenant on va pouvoir lancer notre VPN dans ce namespace :

ip netns exec juniper openconnect --juniper <endpoint>

Une histoire de résolution

Le problème avec ce VPN, c’est le fichier /etc/resolv.conf qui sera écrasé par openconnect. Hé oui, on a isolé le réseau, mais rien de plus. Donc on va toujours pouvoir faire ping 8.8.8.8, mais par contre pour la résolution… ça va être compliqué.

Ou pas : avec dnsmasq, on peut faire ce qu’on veut !

Du coup, comme /etc/resolv.conf est partagé pour tous les namespaces… mais que chaque namespace dispose de sa propre pile réseau… on va pouvoir lancer un dnsmasq sur le système hôte, et un autre dans le namespace : chacun écoutera sur le port 53 de son namespace, et n’entrera pas en conflict avec son voisin !

Le but du jeu, c’est que le dnsmasq du namespace fasse les résolutions DNS pour ce qui concerne notre VPN, et l’autre fasse les résolutions habituelles.

En imaginant que mon VPN me donne accès à un réseau 10.0.0.0/8, que le serveur DNS “du VPN” soit 10.9.8.253 et que le domaine soit domaine.prive :

/etc/dnsmasq.conf

server=/domaine.prive/10.9.8.253
/etc/resolv.conf :
nameserver 127.0.0.1
nameserver <votre DNS public favoris>

Avec cette conf, dnsmasq va tout seul comprendre qu’il faudra forwarder les requêtes auxquels il ne peut répondre aux autres serveurs DNS configurés (resolv.conf), mais va en revanche contacter les serveurs DNS pour les domaines précisés, ici domaine.prive.

Une fois qu’on a fait ça, on démarre dnsmasq sur notre “hôte”, et dans le namespace :

# on se met bien dans notre namespace
ip netns exec juniper /bin/bash
ip a add 127.0.0.1/8 dev lo
ip l set lo up
dnsmasq -d

On pourra même se targuer d’un chattr +i /etc/resolv.conf pour que personne ne vienne casser la conf. Et là, on est royal :

ip netns exec juniper su - wrk -c "export DISPLAY=:0; firefox"

Notre firefox est lancé dans un namespace réseau, donc il est dans le VPN juniper, pendant que le reste de notre système vit sa vie.

Un petit schéma peut-être ?

schema

by Florent Peterschmitt at September 20, 2016 02:58 PM

Linux Kernel Network Namespaces et dnsmasq

Bien souvent, nos clients nous mettent à disposition des VPN pour pouvoir les aider à distance pour les cas de support.

Parmis ces VPN, on a Juniper Network Connect, qui touche aux routes et ne permet pas de les modifier (il les remet comme il le souhaite).

Du coup aujourd’hui je suis obligé de passer par une VM/conteneur. C’est peu pratique, mais on va voir comment s’en sortir avec les namespaces réseau et dnsmasq.

Network Namespaces

Un article très intéressant détail ce que sont les namespaces, et je vous en recommande la lecture avant de lire la suite ici. Car en bonne feignasse… voilà.

En gros :

With network namespaces, you can have different
and separate instances of network interfaces and
routing tables that operate independent of each other.

Un peu de théorie

L’objectif est d’avoir un environnement réseau indépendant du reste du système, pour que la connexion VPN puisse y vivre sa vie, sans venir m’enquiquiner sur le reste de mes connexions.

Pour y arriver, j’ai choisi d’utiliser une configuration natée (le VPN est ipv4 uniquement) avec une interface virtuelle qui servira de pont entre mon interface physique et l’interface du namespace.

Mise en place du namespace

# création du namespace
ip netns add juniper

# mais où sont passées nos interfaces ! ;-)
ip netns exec juniper ip l
ip netns exec juniper iptables -nL

# on créer une paire d’interfaces :
# jun1 : interface dédiée au namespace
# jun0 : pont entre le lien physique (eth0) et l’interface du namespace (jun1)
ip link add jun0 type veth peer name jun1

# on migre jun1 dans le namespace
ip link set jun1 netns juniper

ip netns exec juniper ip l # Oooooh !

# on configure le réseau comme on le ferait avec n’importe quel système.
# Note : j’utilise ip mais on pourrait utiliser ifconfig...
ip netns exec juniper ip a add 10.252.0.1/24 dev jun1
ip netns exec juniper ip l set jun1 up
ip netns exec juniper ip r add default via 10.252.0.254 dev jun1

# on positionne jun0 comme passerelle
ip a add 10.252.0.254/24 dev jun0
ip l set jun0 up
iptables -t nat -A POSTROUTING -s 10.252.0.0/24 -j MASQUERADE

Voilà, notre namespace réseau est configuré et actif. Maintenant on va pouvoir lancer notre VPN dans ce namespace :

ip netns exec juniper openconnect --juniper <endpoint>

Une histoire de résolution

Le problème avec ce VPN, c’est le fichier /etc/resolv.conf qui sera écrasé par openconnect. Hé oui, on a isolé le réseau, mais rien de plus. Donc on va toujours pouvoir faire ping 8.8.8.8, mais par contre pour la résolution… ça va être compliqué.

Ou pas : avec dnsmasq, on peut faire ce qu’on veut !

Du coup, comme /etc/resolv.conf est partagé pour tous les namespaces… mais que chaque namespace dispose de sa propre pile réseau… on va pouvoir lancer un dnsmasq sur le système hôte, et un autre dans le namespace : chacun écoutera sur le port 53 de son namespace, et n’entrera pas en conflict avec son voisin !

Le but du jeu, c’est que le dnsmasq du namespace fasse les résolutions DNS pour ce qui concerne notre VPN, et l’autre fasse les résolutions habituelles.

En imaginant que mon VPN me donne accès à un réseau 10.0.0.0/8, que le serveur DNS “du VPN” soit 10.9.8.253 et que le domaine soit domaine.prive :

/etc/dnsmasq.conf

server=/domaine.prive/10.9.8.253
/etc/resolv.conf :
nameserver 127.0.0.1
nameserver <votre DNS public favoris>

Avec cette conf, dnsmasq va tout seul comprendre qu’il faudra forwarder les requêtes auxquels il ne peut répondre aux autres serveurs DNS configurés (resolv.conf), mais va en revanche contacter les serveurs DNS pour les domaines précisés, ici domaine.prive.

Une fois qu’on a fait ça, on démarre dnsmasq sur notre “hôte”, et dans le namespace :

# on se met bien dans notre namespace
ip netns exec juniper /bin/bash
ip a add 127.0.0.1/8 dev lo
ip l set lo up
dnsmasq -d

On pourra même se targuer d’un chattr +i /etc/resolv.conf pour que personne ne vienne casser la conf. Et là, on est royal :

ip netns exec juniper su - wrk -c "export DISPLAY=:0; firefox"

Notre firefox est lancé dans un namespace réseau, donc il est dans le VPN juniper, pendant que le reste de notre système vit sa vie.

Un petit schéma peut-être ?

schema

by Florent Peterschmitt at September 20, 2016 02:58 PM

September 09, 2016

Luc Didry

L’art et le libre

Ça gueule un peu en ce moment dans le monde de la BD. C’est un peu la faute à David Revoy, aux licences libres et à l’édi­teur Glénat et surtout aux auteurs de BD (puisque c’est eux qui gueulent :P).

Un peu de contexte

David est l’au­teur de Pepper & Carrot, un webco­mic libre (en CC-BY) qui raconte l’his­toire d’une jeune sorcière maladroite et de son chat.
Il a choisi une voie pour le moins coura­geuse : faire appel à son public pour se finan­cer notam­ment via les plate­formes Patreon et Tipeee.
Pour en savoir plus sur David, allez lire son inter­view sur le Frama­blog par votre servi­teur.

2015-12-14_pour-framasoft_net-1024x763

Glénat est un éditeur de BD tout ce qu’il y a de clas­sique, avec ceci de parti­cu­lier qu’il a la répu­ta­tion d’avoir des oursins dans les poches et que son nom est apparu dans les Panama papers.

Un évène­ment

Glénat a sorti une version papier de Pepper & Carrot.

Comme c’est du CC-BY, il n’y a pas de contrat clas­sique entre l’au­teur et l’édi­teur :

  • pas d’avance
  • pas de droits d’au­teur

Par contre, sans doute histoire de ne pas faire le gros rat, Glénat joint les contri­bu­teurs sur Patreon à hauteur de 350$ par mois (mais rien ne l’em­pêche d’ar­rê­ter du jour au lende­main). Et puis la BD est vendue à un prix infé­rieur au prix habi­tuel d’une BD de cette taille.

Les réac­tions

Parmi les fans de David, de ce que j’en ai constaté, c’est un évène­ment appré­cié.

Parmi les fans du libre aussi : si les logi­ciels libres sont assez bons pour être aujourd’­hui utili­sés par les plus grosses boîtes d’in­for­ma­tique du monde, la culture libre, elle, n’est pas très visible. Et là, ça change.

La shits­torm

La mèche a été allu­mée par Cali­maq, avec son article Pepper et Carrot : une bande dessi­née Open Source publiée chez Glénat.

Cali­maq en parle comme d’« un événe­ment inté­res­sant, qui montre comment la Culture Libre et l’in­dus­trie cultu­relle mains­tream peuvent arri­ver à entrer en syner­gie, avec des béné­fices mutuels à la clé. ». Bref, il s’en réjouit (je vous laisse lire l’ar­ticle).

Là-dessus, des dessi­na­teurs (Béhé et Boulet, et peut-être d’autres, mais ce sont les deux seuls dont j’ai reconnu le nom) sont inter­ve­nus dans les commen­taires pour appor­ter un gros bémol (on passe même dans l’oc­tave du dessous). Je vais essayer de résu­mer le gros problème que ça leur pose :

  • la situa­tion des auteurs de BD, c’est un peu la merde : payés à coup de lance-pierre, des coti­sa­tions retraite qui augmentent alors qu’ils ont à peine de quoi manger… Ça, c’est un fait établi et un autre fait établi.
  • David fout en l’air le seul outil qui leur permet­tait (aux auteurs de BDs) de faire respec­ter quelques droits en permet­tant à un éditeur qui est loin d’être à la rue de sortir un bouquin en payant des clopi­nettes à l’au­teur. Ça, c’est une opinion.
  • David est un pigeon qui se fait plumer par l’édi­teur. Ça aussi c’est une opinion.

De là, plusieurs articles sont parus :

  • Vues Éphé­mères – Rentrée 2016, qui fait une synthèse plutôt inté­res­sante du débat, avec un penchant pour contrat d’au­teur clas­sique (« C’est sans aucun doute l’er­reur majeure du « doux rêveur » (tel qu’il se décrit lui-même), que de ne pas avoir choisi une licence CC-BY-NC ») ;
  • Glénat, licences libres et crowd­fun­ding : la tech­nique de la boule de cris­tal de Neil Jomunsi, qui pèse fort bien le pour et le contre, remet le choix final dans les mains de l’au­teur (« Doit-on empê­cher un auteur de publier son travail en CC-BY au motif que le modèle proposé pour­rait donner des idées à d’autres éditeurs et que c’est pas très sympa pour les autres ? ») et pose la ques­tion fort perti­nente (d’un point de vue comme de l’autre) : « Est-ce que ça conta­mi­nera l’édi­tion ?  » ;
  • Droits d’au­teur : ambiance poivrée dans la BD de Quen­tin Girard, dont on peut se passer. Même si la synthèse de la situa­tion semble équi­li­brée à première vue, j’ai lu beau­coup de mépris pour l’œuvre de David Revoy dans cet article. Morceau choi­sis :
    • « Le récit, sans grande qualité graphique, narra­tive ou comique » Certes, les aven­tures de Pepper & Carrot sont dans le registre du mignon, qui ne convient pas à tout le monde. Mais de là à en nier la qualité graphique, il y a un monde.
    • « Comme le montre son shéma (sic), son but est de chan­ger la chaîne de diffu­sion (niant par la même occa­sion l’uti­lité des éditeurs et des libraires). » Qui a dit que David niait leur utilité ? Sur son site, au-dessus du schéma, il a plutôt indiqué « Aucun éditeur, distri­bu­teur ou commer­cial ne peut exer­cer des chan­ge­ments sur Pepper&Carrot afin de le faire rentrer dans une case du ‘mar­ché’. ». Ainsi David indique préfé­rer rester maître de son œuvre, et donc ne pas subir de pres­sions pour que ce soit plus commer­cial. 2015-02-09_philosophy_06-industry-change
    • Infan­ti­li­sa­tion de David, tactique clas­sique de déni­gre­ment : « Si jamais David Revoy, amateur des animés du Club Doro­thée et de mangas en géné­ral ».
    • Et une dernière pique, qui vise aussi le lecteur : « A moins que vous ayez 8 ans ou que vous soyez un grand amateur un peu régres­sif de sorcières colo­rées et de chats mignons (quelle origi­na­lité !), vous pouvez passer votre chemin, ou, au pire, aller lire des Mélu­sine. »

Et alors ?

Et alors, j’ai envie de donner mon avis que vous n’avez pas osé solli­ci­ter (sans doute par pudeur, bien sûr, et sûre­ment pas par ton-avis-tu-peux-te-le-mettre-où-je-pensisme). Bref. Vous ne m’avez rien demandé, mais je l’ouvre quand même. (Merci Neil pour la para­phrase)

Disclai­merS :

  • j’aime la BD. Je l’adore. Je claque un budget non négli­geable dans la BD tous les mois. J’ai fait des études de libraire (si, si, j’ai un DUT Métiers du livre option librai­rie, j’ai du me réorien­ter faute de boulot). J’aime beau­coup ce que fait Boulet, et j’ai beau­coup appré­cié les quelques BDs de Béhé que j’ai lues. Je ne souhaite donc pas leur dire « Vous avez tort et moi raison », juste leur montrer ce que moi je vois.
  • j’aime le Libre. Je l’adore. Je passe un temps non négli­geable à faire du libre tous les mois. J’ai fait des études dans le Libre (si, si, j’ai une licence Admin Sys et Réseaux à base de Logi­ciels Libres). Pour tout dire, je mange même grâce au Libre.

Je déve­loppe des logi­ciels libres. Je ne suis pas payé pour ça, je fais ça sur mon temps libre. « Ha bah voilà, faut avoir un boulot à côté pour se permettre de faire du Libre ». Non. Y en a qui sont payés pour ça. Chez Red Hat par exemple. Ou l’au­teur de l’appli Goblim, une appli­ca­tion Android qui utilise Lutim, un des logi­ciels libres que j’ai déve­loppé. Ou les gars de Odoo. Bref, on peut faire du Libre et être payé pour.
Tout comme David fait du Libre pour lui-même et pour ses patrons : les gens qui le soutiennent finan­ciè­re­ment (dont je fais par ailleurs partie).

David a fait un choix, person­nel. Est-ce qu’il créera un précé­dent ? Je crois que c’est déjà fait. Est-ce qu’une personne va faire bascu­ler l’en­semble du secteur de l’édi­tion vers une recherche féroce d’au­teurs libristes de qualité pour leur piquer leurs œuvres ? Est-ce que les éditeurs vont se mettre à dire « Oh, mais tu demandes trop toi, tu sais, moi, j’ai qu’à me pencher sur le web pour trou­ver des auteurs libristes que je pour­rais éditer sans rien leur rever­ser. » Fran­che­ment, vous y croyez ?

S’il y avait des milliers de David, finan­cés par leurs lecteurs et non pas par un éditeur, qui faisaient de la BD libre et que les éditeurs ne se mettaient à ne publier que ça, oui, les auteurs de BD auraient du souci à se faire… Mais ça n’ar­ri­vera pas avant un bon bout de temps, soyons lucides.

La BD est mal en point, entre surpro­duc­tion, salaire de misère et coti­sa­tions trop lourdes. Je pense qu’au contraire, l’exemple de David est une source d’es­poir : un auteur non publié a réussi à se consti­tuer un lecto­rat solide qui le rému­nère. Pourquoi ne pas tenter la même chose ?

« On va quand même pas bosser pour des prunes en atten­dant d’avoir un lecto­rat solide ! Maliki a réussi son pari parce qu’elle est déjà connue ! » Alors, déjà, avant de trou­ver un éditeur, j’ima­gine que les auteurs de BD bossent pour présen­ter un book, parce que se poin­ter la gueule enfa­ri­née et les mains dans les poches en disant « Je suis dessi­na­teur/scéna­riste, vous voulez m’em­bau­cher ? », ça doit pas marcher des masses. Donc la publi­ca­tion des travaux sur le net, ça peut faire double emploi : créa­tion du book et consti­tu­tion du lecto­rat. Où est le mal ? De plus, si vous réus­sis­sez à avoir suffi­sam­ment de mécènes, est-ce que ça ne renver­se­rait pas le rapport de force avec l’édi­teur ? Est-ce que vous ne pour­riez pas lui dire de se mettre son contrat là où le soleil ne brille jamais si vous savez que vous aurez un salaire versé par des gens qui aiment sincè­re­ment ce que vous faites ? Et si vous ne gagnez pas assez avec le mécé­nat pour vous consa­crer à plein temps à votre art, est-ce que ce n’est pas un complé­ment de revenu qui fait toujours plai­sir ?

fr_pepper-and-carrot_by-david-revoy_e10p05

« Oui, bon, ok, mais alors pas de licence libre ! » Ça c’est toi qui voit mon coco, on t’oblige à rien. David a effec­ti­ve­ment fait un pari risqué avec sa licence très libre (plus libre que ça, y a que la CC-0, qui est l’équi­valent du domaine public). Et il y a un éditeur qui a profité du système. OK. C’est le jeu ma pauvre Lucette. Mais grâce à sa licence libre, David permet de démul­ti­plier la diffu­sion de Pepper & Carrot au travers de multiple médias. Et la licence libre me permet à moi, de repos­ter ici des images de Pepper & Carrot sans risquer quoi que ce soit. Tu peux même choi­sir une licence non-libre qui te permet quand même de permettre beau­coup de choses sauf l’usage commer­cial (la clause NC des licences Crea­tive Commons).

EDIT : une licence libre n’in­ter­dit pas de passer des contrats, clas­siques ou non, avec des éditeurs. Les Frama­books sont des livres libres, et les auteurs ont bien passé un contrat avec verse­ment de droits d’au­teur (15% du prix du livre).

fr_pepper-and-carrot_by-david-revoy_e15p01

« La noto­riété, ça paye pas les factures. » Dans le cas de David, si, puisque plus d’au­dience, c’est plus de mécènes poten­tiels. Et Maliki, c’est pas sa noto­riété qui lui paye ses factures aujourd’­hui ?

Le problème du riche éditeur qui tond le pauvre libris­te… Mais Inter­net ne serait pas ce qu’il serait sans les libristes, ces doux rêveurs, ces commu­nistes, ces liber­ta­riens, ces liber­taires ! (choi­sis­sez l’ana­thème de votre choix)
Google existe grâce à Linux et Python, Face­book utilise PHP, les serveurs webs libres équipent plus la moitié des sites web les plus popu­laires, Word­press est le CMS le plus utilisé au monde, vous vous servez sans doute souvent de Wiki­pé­dia… Même Windows avait piqué sa pile réseau à BSD ! Et vous note­rez que les logi­ciels non-libres n’ont pas disparu pour autant… vous voyez, faut pas avoir peur :-)

Qui nous dit que la culture libre n’aura pas le même impact que les logi­ciels libres dans 10, 20 ou 30 ans ? Est-ce que ce ne serait pas agréable de se dire qu’on y a contri­bué ?

Le mal-être actuel des auteurs de BD est peut-être bien l’oc­ca­sion de repen­ser le métier. Beau­coup de métiers ont évolués ou dispa­rus, presque du jour au lende­main (pour encore citer Neil : « Télé­graphe, maré­chal-ferrand, allu­meur de becs de gaz, vendeur de jour­naux à la criée »), pourquoi ne pas faire évoluer celui d’au­teur de BD ? (et pas que de BD)

Pourquoi reje­ter forcé­ment une autre voie et vouloir répa­rer un système (et je ne parle même pas du droit d’au­teur mais du système édito­rial actuel) qui semble si malade ?

EDIT 2 : Neil a écrit un nouvel article qui rejoint tout à fait mon point de vue.

Cet article est diffusé sous licence CC-0
Crédits :

  • illus­tra­tions David Revoy, CC-BY
  • cita­tion de Cali­maq, CC-0
  • cita­tions de Neil Jomunsi, CC-BY-SA
  • cita­tions de Quen­tin Girard, ©
Parta­ger

Flattr this!

by Luc at September 09, 2016 09:44 PM

September 05, 2016

Florent Peterschmitt

Check Delivery - SMTP, IMAP, IRC, FTP…

Initialement, je voulais vérifier que je ne m’étais pas gouré dans la configuration de mon serveur mail, et automatiser la vérification de l’envoi/réception interne/externe.

Ça existe déjà, ça s’appelle check_mail_delivery et ça propose sans doute plus de fonctionnalités que ce que j’ai à proposer. Et pour certains mordus de Perl, c’est écrit en Perl ;-)

Néanmoins, comme je suis pas fan de Perl, ni de ce programme, j’en suis venu à coder un petit chéri, en Python 3, sous license MIT : Check Delivery

Check Delivery

Le mail c’est une chose, mais je me suis dit que ça serait sympa de proposer d’autres choses. Au final, le but du jeu, c’est de s’assurer qu’une chaîne délivrant, peu importe le moyen, des messages, fonctionne : FTP, IRC, des fichiers…

Pour fonctionner, on lui précise un sender et un receiver, sous forme d’une URL (voir exemples), ou bien un fichier de conf.

Selon comme le sender et receiver est codé, le receiver sera connecté (ou disponible) avant que le sender ne commence à bosser, ce qui dans le cas de SMTP/IMAP est inutile, mais dans le cas d’IRC, est obligatoire.

Si à l’avenir on prenait XMPP par exemple, il faudrait avoir les deux modes : livraison du message après connexion de l’utilisateur, et livraison en direct.

Le format de sortie est configurable et on peut coder son propre format.

Fonctionnalités

Pour l’instant, voici ce qui est disponible :

  • smtp, smtps, smtp + starttls, en envoi uniquement
  • imap, imaps, imap + starttls, en réception uniquement
  • irc, irc + tls, deux modes
  • ftp, ftps, deux modes
  • file (en local), deux modes
  • sorties Nagios et JSON
  • fichier de configuration

Exemple

[creds]
user = user%40peterschmitt.fr:password

[senders]
smtp = smtpstarttls://${creds:user}@peterschmitt.fr:587

[receivers]
imap = imapstarttls://${creds:user}@peterschmitt.fr:143

[scenarios]
smtp.to.imap.send = ${senders:smtp}
smtp.to.imap.recv = ${receivers:imap}
$ check_delivery --conf config.ini --play smtp.to.imap --wait 3
$ OK - Token found in message b'1'
$ echo $?
0

Le sender nommé arbitrairement smtp va envoyer un token, une somme SHA512, et si tout se passe bien, on devrait récupérer ce message via notre serveur IMAP, configuré dans le receiver arbitrairement nommé imap.

L’option --wait fait attendre la vérification trois secondes après que le sender ai terminé son travail.

Le nom des sections est au choix, sauf scenarios, de même que le nom des clefs, on fait sa vie comme on veut.

Installation

Pas encore d’enregistrement sur pypi, donc on passera par une installation par le dépôts GitHub.

# From local clone
pip install -e .
pip install -e .[irc] # with IRC delivery

# Or from GitHub
pip install -e "git+https://github.com/Leryan/check_delivery.git#egg=check_delivery"
pip install -e "git+https://github.com/Leryan/check_delivery.git#egg=check_delivery[irc]"

Il vous faudra Python 3.2 minimum.

Sécurité

Pour les modes avec chiffrement, on pourra utiliser, dans l’URL, le paramètre ssl_verify.

Par défaut, un certificat reconnu est demandé.

Évolutivité

En prenant exemple sur le file delivery, combiné avec le point d’entrée du programme de référence check_delivery, on peut obtenir assez facilement ce qu’on souhaite.

Il suffira de passer un dictionnaire classmap à cette fonction, l’exécuter et retourner le code de retour en sortie de script, et c’est fini.

#!/usr/bin/env python

import sys

import check_delivery

from check_delivery import Method

class MMBase(Method):

    def connect(self):
        ...

class MMSend(MMBase):

    def send(self, message):
        ...

class MMRecv(MMBase):

    def recv(self, message):
        ...

def mycd():
    classmap = {
        "__methods": {
            "mamethode": {
                "send": MMSend,
                "recv": MMRecv
            }
        }
    }

    return check_delivery.check_delivery(custom_classmap=classmap)

if __name__ == '__main__':
    sys.exit(mycd())

À noter que l’utilisation de deux classes distinctes pour l’envoi et la réception n’est pas nécessaire, il suffira d’implémenter send() et recv(), qui recevront en paramètre le token à envoyer / recevoir.

Évolutions

  • Pouvoir configurer des retry, configurables bien entendu.

  • Si possible coder une gestion évènementielle de la réception du token, ce qui permettrait de demander un timeout sur la réception du token, mais également de fournir une information de performance.

  • Dans le cas où l’évènementiel n’est pas possible, une configuration de l’interval entre deux essais, et un nombre d’essais maximum.

  • Pouvoir lancer le test sur plusieurs receivers. Dans le cas du mail ça serait IMAP et POP3 par exemple.

  • Proposer un mode évènementiel pour ce qui peut l’être, comme ZeroMQ par exemple.

  • Paramétrer la connexion des receivers : avant ou après le sender ?

by Florent Peterschmitt at September 05, 2016 05:23 PM

Check Delivery - SMTP, IMAP, IRC, FTP…

Initialement, je voulais vérifier que je ne m’étais pas gouré dans la configuration de mon serveur mail, et automatiser la vérification de l’envoi/réception interne/externe.

Ça existe déjà, ça s’appelle check_mail_delivery et ça propose sans doute plus de fonctionnalités que ce que j’ai à proposer. Et pour certains mordus de Perl, c’est écrit en Perl ;-)

Néanmoins, comme je suis pas fan de Perl, ni de ce programme, j’en suis venu à coder un petit chéri, en Python 3, sous license MIT : Check Delivery

Check Delivery

Le mail c’est une chose, mais je me suis dit que ça serait sympa de proposer d’autres choses. Au final, le but du jeu, c’est de s’assurer qu’une chaîne délivrant, peu importe le moyen, des messages, fonctionne : FTP, IRC, des fichiers…

Pour fonctionner, on lui précise un sender et un receiver, sous forme d’une URL (voir exemples), ou bien un fichier de conf.

Selon comme le sender et receiver est codé, le receiver sera connecté (ou disponible) avant que le sender ne commence à bosser, ce qui dans le cas de SMTP/IMAP est inutile, mais dans le cas d’IRC, est obligatoire.

Si à l’avenir on prenait XMPP par exemple, il faudrait avoir les deux modes : livraison du message après connexion de l’utilisateur, et livraison en direct.

Le format de sortie est configurable et on peut coder son propre format.

Fonctionnalités

Pour l’instant, voici ce qui est disponible :

  • smtp, smtps, smtp + starttls, en envoi uniquement
  • imap, imaps, imap + starttls, en réception uniquement
  • irc, irc + tls, deux modes
  • ftp, ftps, deux modes
  • file (en local), deux modes
  • sorties Nagios et JSON
  • fichier de configuration

Exemple

[creds]
user = user%40peterschmitt.fr:password

[senders]
smtp = smtpstarttls://${creds:user}@peterschmitt.fr:587

[receivers]
imap = imapstarttls://${creds:user}@peterschmitt.fr:143

[scenarios]
smtp.to.imap.send = ${senders:smtp}
smtp.to.imap.recv = ${receivers:imap}
$ check_delivery --conf config.ini --play smtp.to.imap --wait 3
$ OK - Token found in message b'1'
$ echo $?
0

Le sender nommé arbitrairement smtp va envoyer un token, une somme SHA512, et si tout se passe bien, on devrait récupérer ce message via notre serveur IMAP, configuré dans le receiver arbitrairement nommé imap.

L’option --wait fait attendre la vérification trois secondes après que le sender ai terminé son travail.

Le nom des sections est au choix, sauf scenarios, de même que le nom des clefs, on fait sa vie comme on veut.

Installation

Pas encore d’enregistrement sur pypi, donc on passera par une installation par le dépôts GitHub.

# From local clone
pip install -e .
pip install -e .[irc] # with IRC delivery

# Or from GitHub
pip install -e "git+https://github.com/Leryan/check_delivery.git#egg=check_delivery"
pip install -e "git+https://github.com/Leryan/check_delivery.git#egg=check_delivery[irc]"

Il vous faudra Python 3.2 minimum.

Sécurité

Pour les modes avec chiffrement, on pourra utiliser, dans l’URL, le paramètre ssl_verify.

Par défaut, un certificat reconnu est demandé.

Évolutivité

En prenant exemple sur le file delivery, combiné avec le point d’entrée du programme de référence check_delivery, on peut obtenir assez facilement ce qu’on souhaite.

Il suffira de passer un dictionnaire classmap à cette fonction, l’exécuter et retourner le code de retour en sortie de script, et c’est fini.

#!/usr/bin/env python

import sys

import check_delivery

from check_delivery import Method

class MMBase(Method):

    def connect(self):
        ...

class MMSend(MMBase):

    def send(self, message):
        ...

class MMRecv(MMBase):

    def recv(self, message):
        ...

def mycd():
    classmap = {
        "__methods": {
            "mamethode": {
                "send": MMSend,
                "recv": MMRecv
            }
        }
    }

    return check_delivery.check_delivery(custom_classmap=classmap)

if __name__ == '__main__':
    sys.exit(mycd())

À noter que l’utilisation de deux classes distinctes pour l’envoi et la réception n’est pas nécessaire, il suffira d’implémenter send() et recv(), qui recevront en paramètre le token à envoyer / recevoir.

Évolutions

  • Pouvoir configurer des retry, configurables bien entendu.

  • Si possible coder une gestion évènementielle de la réception du token, ce qui permettrait de demander un timeout sur la réception du token, mais également de fournir une information de performance.

  • Dans le cas où l’évènementiel n’est pas possible, une configuration de l’interval entre deux essais, et un nombre d’essais maximum.

  • Pouvoir lancer le test sur plusieurs receivers. Dans le cas du mail ça serait IMAP et POP3 par exemple.

  • Proposer un mode évènementiel pour ce qui peut l’être, comme ZeroMQ par exemple.

  • Paramétrer la connexion des receivers : avant ou après le sender ?

by Florent Peterschmitt at September 05, 2016 05:23 PM

August 31, 2016

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet dernier, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… avec un peu de retard, la voici !

Merci donc à Neil Jomunsi et e-Jim qui m’ont tipé ! Ainsi qu’à l’ano­nyme qui a fait un don via Libe­ra­pay :-)

Je souhai­tais initia­le­ment écrire cette page au début de mois mais… procras­ti­na­tion, boulot, vacances, chaleur étouf­fan­te… tout ça n’aide pas à se moti­ver.
Du coup, je décide que cette page mensuelle de remer­cie­ments paraî­tra chaque dernier jour du mois :P

Comme les choses vont reve­nir à un rythme normal en septembre, j’en­ver­rais les contre­par­ties physiques en septembre :-)

Parta­ger

Flattr this!

by Luc at August 31, 2016 12:02 PM

August 21, 2016

Luc Didry

Joyeux Ray’s day à tou·­te·s !

Le Ray’s day, c’est la fête de la lecture, quelle qu’elle soit, quel que soit le support. Ce qui compte, ce sont les histoires, leurs auteurs et les lecteurs. Le Ray’s day a lieu le 22 août, jour de l’an­ni­ver­saire de Ray Brad­bury grand amou­reux des livres disparu en 2012 et qui a inspiré Neil Jomunsi pour créer cette jour­née spéciale :-)

N’écri­vant pas (j’ai bien essayé de m’y mettre l’an­née dernière, mais je n’ai jamais fini), que pouvais-je faire pour célé­brer ce jour si parti­cu­lier ? Qu’ai-je dans mes poches ? Un esprit libriste, des compé­tences en infor­ma­tiques… Diffi­cile. Puis j’ai repensé à ce que j’avais fait l’an­née dernière : outre un tirage au sort pour gagner un epub, j’avais fait un livre numé­rique du web-comic de mon cousin.

Bien, un epub, ça c’est dans mes cordes. Mais que mettre dedans ? Il faut que ce soit libre, que ce soit inté­res­sant, qu’il y en assez pour remplir un livre… Et j’ai pensé au Copy­right Madness de Lionel Maurel et Thomas Four­meux. Toutes les semaines, ils traquent les dérives de la « propriété intel­lec­tuelle » et nous rappellent que « Si la propriété, c’est le vol ; la propriété intel­lec­tuelle, c’est le LOL ! »

Un petit script en Perl par ci, un peu de Sigil par là, saupou­dré d’une pincée de feuille de style de Frama­book et d’huile de coude et voilà !

Je vous livre un recueil 2015–2016 du Copy­right Madness !

Merci à nos deux senti­nelles vigi­lantes de nous offrir cette revue hebdo­ma­daire en CC-0 et tout spécia­le­ment à Lionel Maurel d’avoir écrit la préface du recueil :-)

PS : le recueil ne court que de 2015 à 2016 car avant 2015, le Copy­right Madness se basait sur Storify et je ne suis pas sûr que ça n’en­freigne pas leurs termes de service (« Attempt to access or search the Storify Service or Service Content or down­load Service Content from the Storify Service through the use of any engine, soft­ware, tool, agent, device or mecha­nism (inclu­ding spiders, robots, craw­lers, data mining tools or the like) other than the soft­ware and/or search agents provi­ded by Storify or other gene­rally avai­lable third party web brow­sers; ») :-P

Parta­ger

Flattr this!

by Luc at August 21, 2016 10:01 PM

August 16, 2016

Sebastien Badia

Prosopopee ♥

Après avoir longtemps cherché la solution répondant à mes besoins en terme de galerie photos, je crois que j'ai trouvé :)

Solutions testées

  • ZenPhoto, Plus en mode CMS, il y a une tonne de plugins, et d'intégration, nécessite une base de données.
  • Lychee, alternative séduisante (graphiquement), assez actif niveau dev. mais pareil il faut une base de données, et la visu est en mode galerie.
  • Lazygal, bon là c'est statique, mais… il faut avoir des dons en CSS si on veut que ça ressemble à qqch :)

Prosopopee

« More or less a small clone of exposure.co in form of a static generator. For those of you who don't know what exposure.co is, this allows you to tell a story with your pictures. »

  • prosopopee, C'est une galerie statique, mais qui permet de raconter une histoire, plus en mode fil, que simple galerie. J'adore!

J'ai d'ailleurs commencé à remplir mes pérégrinations…

Tips

Bon, une galerie photo, c'est cool, mais quid de la taille des photos et de l'aisance de visualisation (petite ligne ADSL…), la solution vient peut être avec le jpeg progressif !!

Avec un petit script rapide :)

#!/bin/sh
file=$1
set -ex
# On optimse :)
jpegtran -copy none -optimize "${file}" > "temp_${file}.jpg"
rm -f "${file}"
# Puis on passe l'encodage en "Progressive DCT, Huffman coding"
jpegtran -copy none -progressive "temp_${file}.jpg" > "${file}"
rm -f "temp_${file}.jpg"
# Et enfin on vire les metadata (exif)
mat "${file}"

Il reste donc plus qu'a écrire l'histoire :)

by Sebastien Badia at August 16, 2016 06:00 AM

August 13, 2016

Florent Peterschmitt

ActiveSync avec Z-Push, le mail

Z-Push est une implémentation en PHP du protocol ActiveSync de Microsoft. Il permet de synchroniser ses mails, calendriers et contacts. Pour l’instant je ne couvrirai que le mail, le calendrier viendra plus tard éventuellement.

Le guide d’installation est assez spartiate.

Comme d’hab, je fais mes install sur CentOS 7 et avec PHP-FPM.

PHP

Déjà, installez PHP 5.6. Ça ne fonctionnera pas du tout avec PHP 7, pour le moment en tout cas. J’ai testé, laissez tomber l’idée. À moins d’avoir du temps pour dev, mais si eux n’ont pas encore sorti une version “PHP 7 proof”, c’est que ça n’est sans doute pas si simple.

https://webtatic.com/packages/php56/

IMAP et SMTP

Avoir un serveur IMAP et SMTP disponible et déjà configuré.

Normalement ces deux bouzins là sont assez connus pour qu’Internet soit truffé de tutos…

Paquets

Les paquets ne sont pas signés malheureusement :/

/etc/yum.repos.d/z-push.repo

[z-push]
name=Z-Push noarch Enterprise Linux 7 - $basearch
baseurl=http://repo.z-hub.io/z-push:/final/RHEL_7
failovermethod=priority
enabled=1
gpgcheck=0
yum makecache
yum install z-push-common z-push-backend-imap z-push-ipc-sharedmemory

On pourra utiliser z-push-ipc-memcached à la place de sharedmemory.

Nginx et PHP-FPM

/etc/nginx/conf.d/peterschmitt.fr.conf

server {
    server_name peterschmitt.fr;

    location /Microsoft-Server-ActiveSync {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;

        include fastcgi_params_z-push;
        fastcgi_param SCRIPT_FILENAME /usr/share/z-push/index.php;
        fastcgi_param DOCUMENT_ROOT /usr/share/z-push/;
        fastcgi_pass unix:/srv/php-fpm/socks/z-push;
    }
}

La configuration automatique tente de joindre le domaine de l’adresse mail à configurer, sur la location détaillée ici.

J’ai récupéré cette information depuis la configuration Apache de Z-Push.

/etc/php-fpm.d/z-push.conf

[z-push]
access.log = access.log
listen = /srv/php-fpm/socks/z-push
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

user = z-push
group = z-push

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

slowlog = www-slow.log

chdir = /usr/share/z-push

catch_workers_output = yes

php_flag[display_errors] = on
php_admin_value[error_log] = php-error.log
php_admin_flag[log_errors] = on

php_value[session.save_handler] = files
php_value[session.save_path] = /session

Système

Les paquets sont configurés pour l’utilisateur apache, car il existe un paquet embarquant de la conf Apache. On adapte tout ça :

useradd z-push
chgrp z-push /etc/z-push/*
chown -R z-push:z-push /var/log/z-push/
chown -R z-push:z-push /var/lib/z-push/
systemctl restart php-fpm
systemctl restart nginx

Configuration

Faire in tour dans /etc/z-push/imap.conf.php et adapter les dossiers IMAP en fonction de ce qui est actif sur le serveur IMAP, puis passer la define IMAP_FOLDER_CONFIGURED à true.

Configurez-y aussi la connexion au serveur IMAP.

Pour SMTP, cherchez la variable $imap_smtp_params. Le fichier de configuration est très bien documenté, l’idéal étant une configuration du type :

<?php
$imap_smtp_params = array(
    'host' => 'ssl://smtp.peterschmitt.fr',
    'port' => 465,
    'auth' => true,
    'localhost' => 'smtp.peterschmitt.fr',
    'username' => 'imap_username',
    'password' => 'imap_password');

Test

Accéder à http://localhost/Microsoft-Server-ActiveSync et tester l’authentification.

Si déjà ça a fonctionné, vous pouvez passer à la suite, à savoir configurer un client mail voulant causer ActiveSync, comme un client mail mobile par exemple.

Enfin, testez l’envoi de mail en scrutant les logs de votre serveur mail.

by Florent Peterschmitt at August 13, 2016 07:33 PM

ActiveSync avec Z-Push, le mail

Z-Push est une implémentation en PHP du protocol ActiveSync de Microsoft. Il permet de synchroniser ses mails, calendriers et contacts. Pour l’instant je ne couvrirai que le mail, le calendrier viendra plus tard éventuellement.

Le guide d’installation est assez spartiate.

Comme d’hab, je fais mes install sur CentOS 7 et avec PHP-FPM.

PHP

Déjà, installez PHP 5.6. Ça ne fonctionnera pas du tout avec PHP 7, pour le moment en tout cas. J’ai testé, laissez tomber l’idée. À moins d’avoir du temps pour dev, mais si eux n’ont pas encore sorti une version “PHP 7 proof”, c’est que ça n’est sans doute pas si simple.

https://webtatic.com/packages/php56/

IMAP et SMTP

Avoir un serveur IMAP et SMTP disponible et déjà configuré.

Normalement ces deux bouzins là sont assez connus pour qu’Internet soit truffé de tutos…

Paquets

Les paquets ne sont pas signés malheureusement :/

/etc/yum.repos.d/z-push.repo

[z-push]
name=Z-Push noarch Enterprise Linux 7 - $basearch
baseurl=http://repo.z-hub.io/z-push:/final/RHEL_7
failovermethod=priority
enabled=1
gpgcheck=0
yum makecache
yum install z-push-common z-push-backend-imap z-push-ipc-sharedmemory

On pourra utiliser z-push-ipc-memcached à la place de sharedmemory.

Nginx et PHP-FPM

/etc/nginx/conf.d/peterschmitt.fr.conf

server {
    server_name peterschmitt.fr;

    location /Microsoft-Server-ActiveSync {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;

        include fastcgi_params_z-push;
        fastcgi_param SCRIPT_FILENAME /usr/share/z-push/index.php;
        fastcgi_param DOCUMENT_ROOT /usr/share/z-push/;
        fastcgi_pass unix:/srv/php-fpm/socks/z-push;
    }
}

La configuration automatique tente de joindre le domaine de l’adresse mail à configurer, sur la location détaillée ici.

J’ai récupéré cette information depuis la configuration Apache de Z-Push.

/etc/php-fpm.d/z-push.conf

[z-push]
access.log = access.log
listen = /srv/php-fpm/socks/z-push
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

user = z-push
group = z-push

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

slowlog = www-slow.log

chdir = /usr/share/z-push

catch_workers_output = yes

php_flag[display_errors] = on
php_admin_value[error_log] = php-error.log
php_admin_flag[log_errors] = on

php_value[session.save_handler] = files
php_value[session.save_path] = /session

Système

Les paquets sont configurés pour l’utilisateur apache, car il existe un paquet embarquant de la conf Apache. On adapte tout ça :

useradd z-push
chgrp z-push /etc/z-push/*
chown -R z-push:z-push /var/log/z-push/
chown -R z-push:z-push /var/lib/z-push/
systemctl restart php-fpm
systemctl restart nginx

Configuration

Faire in tour dans /etc/z-push/imap.conf.php et adapter les dossiers IMAP en fonction de ce qui est actif sur le serveur IMAP, puis passer la define IMAP_FOLDER_CONFIGURED à true.

Configurez-y aussi la connexion au serveur IMAP.

Pour SMTP, cherchez la variable $imap_smtp_params. Le fichier de configuration est très bien documenté, l’idéal étant une configuration du type :

<?php
$imap_smtp_params = array(
    'host' => 'ssl://smtp.peterschmitt.fr',
    'port' => 465,
    'auth' => true,
    'localhost' => 'smtp.peterschmitt.fr',
    'username' => 'imap_username',
    'password' => 'imap_password');

Test

Accéder à http://localhost/Microsoft-Server-ActiveSync et tester l’authentification.

Si déjà ça a fonctionné, vous pouvez passer à la suite, à savoir configurer un client mail voulant causer ActiveSync, comme un client mail mobile par exemple.

Enfin, testez l’envoi de mail en scrutant les logs de votre serveur mail.

by Florent Peterschmitt at August 13, 2016 07:33 PM

August 12, 2016

Florent Peterschmitt

Commentaires auto-hébergés avec Isso

MAJ 2016/08/18 : sécurité : owner root:root et dossier var séparé accessible à l’utilisateur isso.

Isso, petit service sympathique, écrit en Python et qui permet d’auto-héberger des commentaires sur un blog, par exemple.

Il se présente comme une alternative à Disqus

D’après la documentation de la configuration du serveur Isso, on y trouve :

  • Une instance peut gérer plusieurs sites
  • Une modération
  • Nodifications par mail
  • Anti-spam léger, qui correspond plutôt à un rate-limit

Installation

https://posativ.org/isso/docs/install/

L’installation ne semble pas bien fonctionner, il m’a fallu installer quelques packages python en plus.

Voir cette issue GitHub

yum install -y python-virtualenv python-setuptools python-devel sqlite gcc make sqlite
useradd -m isso -s /sbin/nologin
chown root:root /home/isso
mkdir /home/isso/var
chown isso:isso /home/isso/var
export HOME=/home/isso
virtualenv /home/isso/pyvenv-isso
source /home/isso/pyvenv-isso/bin/activate
pip install isso
pip install werkzeug
pip install configparser
pip install ipaddr

Configuration Isso

Documentation

/home/isso/isso.ini

[general]
dbpath = /home/isso/var/isso.db
host = https://florent.peterschmitt.fr
log-file = /home/isso/var/isso.log
notify = smtp
max-age = 15m

[server]
listen = http://localhost:8081

[smtp]
host = localhost
port = 25
security = none
to = comments@peterschmitt.fr
from = "Isso" <isso@peterschmitt.fr>

[guard]
enabled = true
ratelimit = 2
direct-reply = 3
reply-to-self = false
require-email = false

Configuration Nginx

server {
    server_name florent.peterschmitt.fr;

    location /isso/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:8081/;
    }
}

Autostart

/etc/systemd/system/isso.service

[Unit]
Description=Isso Blog Comment

[Service]
User=isso
ExecStart=/home/isso/pyvenv-isso/bin/isso -c /home/isso/isso.ini run

[Install]
WantedBy=multi-user.target

Exéctuter ensuite

systemctl daemon-reload
systemctl enable isso.service
systemctl restart isso.service

Intégration

Autant aller voir la documentation directement : https://posativ.org/isso/docs/quickstart/#integration

Pour ma part le thème octopress de Pelican s’en charge via l’option ISSO_SITEURL="https://florent.peterschmitt.fr/isso".

Si samarchpa

Ouvrez la console de développement de votre navigateur, et trouvez les erreurs que JS pourrait remonter. Accédez aux URL Isso à la main, avec curl par exemple, depuis l’extérieur et depuis l’intérieur.

Exemple :

curl -H "Host: florent.peterschmitt.fr" "http://localhost:8081/?uri=%2Fletsencrypt-certbot-naemon.html&nested_limit=5"

On ne doit pas avoir de message du type il me manque l’uri.

by Florent Peterschmitt at August 12, 2016 09:58 AM

Commentaires auto-hébergés avec Isso

MAJ 2016/08/18 : sécurité : owner root:root et dossier var séparé accessible à l’utilisateur isso.

Isso, petit service sympathique, écrit en Python et qui permet d’auto-héberger des commentaires sur un blog, par exemple.

Il se présente comme une alternative à Disqus

D’après la documentation de la configuration du serveur Isso, on y trouve :

  • Une instance peut gérer plusieurs sites
  • Une modération
  • Nodifications par mail
  • Anti-spam léger, qui correspond plutôt à un rate-limit

Installation

https://posativ.org/isso/docs/install/

L’installation ne semble pas bien fonctionner, il m’a fallu installer quelques packages python en plus.

Voir cette issue GitHub

yum install -y python-virtualenv python-setuptools python-devel sqlite gcc make sqlite
useradd -m isso -s /sbin/nologin
chown root:root /home/isso
mkdir /home/isso/var
chown isso:isso /home/isso/var
export HOME=/home/isso
virtualenv /home/isso/pyvenv-isso
source /home/isso/pyvenv-isso/bin/activate
pip install isso
pip install werkzeug
pip install configparser
pip install ipaddr

Configuration Isso

Documentation

/home/isso/isso.ini

[general]
dbpath = /home/isso/var/isso.db
host = https://florent.peterschmitt.fr
log-file = /home/isso/var/isso.log
notify = smtp
max-age = 15m

[server]
listen = http://localhost:8081

[smtp]
host = localhost
port = 25
security = none
to = comments@peterschmitt.fr
from = "Isso" <isso@peterschmitt.fr>

[guard]
enabled = true
ratelimit = 2
direct-reply = 3
reply-to-self = false
require-email = false

Configuration Nginx

server {
    server_name florent.peterschmitt.fr;

    location /isso/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:8081/;
    }
}

Autostart

/etc/systemd/system/isso.service

[Unit]
Description=Isso Blog Comment

[Service]
User=isso
ExecStart=/home/isso/pyvenv-isso/bin/isso -c /home/isso/isso.ini run

[Install]
WantedBy=multi-user.target

Exéctuter ensuite

systemctl daemon-reload
systemctl enable isso.service
systemctl restart isso.service

Intégration

Autant aller voir la documentation directement : https://posativ.org/isso/docs/quickstart/#integration

Pour ma part le thème octopress de Pelican s’en charge via l’option ISSO_SITEURL="https://florent.peterschmitt.fr/isso".

Si samarchpa

Ouvrez la console de développement de votre navigateur, et trouvez les erreurs que JS pourrait remonter. Accédez aux URL Isso à la main, avec curl par exemple, depuis l’extérieur et depuis l’intérieur.

Exemple :

curl -H "Host: florent.peterschmitt.fr" "http://localhost:8081/?uri=%2Fletsencrypt-certbot-naemon.html&nested_limit=5"

On ne doit pas avoir de message du type il me manque l’uri.

by Florent Peterschmitt at August 12, 2016 09:58 AM

August 11, 2016

Florent Peterschmitt

Let’s Encrypt, Certbot et Naemon

Ou comment automatiser le renouvellement des certificats avec la supervision.

Le choix de Naemon s’est fait pour quelques raisons :

  • Je n’ai qu’un petit serveur et Naemon n’est pas lourd
  • Comme il n’y a qu’une seule machine, pas besoin d’un truc extra pour la conf
  • Je me fiche d’avoir une sup poussée ou d’avoir des graphes, pour mes besoins perso, même si c’est cool

En fait peu importe la méthode de supervision : il s’agit en fait de déclencher la génération des certificats en peu en avance, sur détection de l’expiration.

Alors, oui, je sais qu’on peut simplement demander à Certbot de mettre à jour et il va se débrouiller pour savoir si le certificat est sur le point d’expirer. Mais autant les graphes c’est cool, et je m’en fiche, autant un truc qui ne va se mettre en route que quand il y en a vraiment besoin, c’est d’autant plus cool =D

Principe

  • On met de la sup sur son certificat. Chez moi la vérification passe par un plugin qui check directement le service, ici un nginx
  • On configure un event handler sur cette sup
  • L’event handler va lancer certbot, via sudo et relancer les services qui ont besoin de prendre en compte les nouveaux certificats

Conf

/etc/sudoers.d/naemon

Defaults    !requiretty
naemon      ALL=(ALL) NOPASSWD: /opt/cert-renew.sh

/etc/naemon/conf.d/sup.cfg

define command {
  command_name          evth_sudo_cert_renew
  command_line          /opt/evth-cert-renew.sh $SERVICESTATE$
}

define service {
  name                  certbot-domain
  use                   generic-service
  max_check_attempts    1
  check_interval        720 ; conformement a la doc certbot, on check toutes les 12 heures
  event_handler_enabled 1
  event_handler         evth_sudo_cert_renew
  register              0
}

define service {
  service_description   Web: https://peterschmitt.fr
  host_name             localhost
  use                   local-service
  check_command         check_http!-u / -H peterschmitt.fr -S -e 403
}

define service {
  service_description   x509: peterschmitt.fr
  host_name             localhost
  use                   certbot-domain
  check_command         check_ssl_expiry!peterschmitt.fr -p 443 -c 3 -w 4 ; la commande qui vous plaira pour la verif des certificats
}

define servicedependency {
  host_name                     localhost
  service_description           Web: https://peterschmitt.fr

  dependent_host_name           localhost
  dependent_service_description x509: peterschmitt.fr

  execution_failure_criteria    p,w,c,u
}

Scripts

/opt/evth-cert-renew.sh

#!/bin/sh
#echo "evth $0: args: $*" >> /tmp/evth
case "$1" in
    CRITICAL)
        #echo "evth $0: cert-renew.sh" >> /tmp/evth
        sudo /opt/cert-renew.sh 2>&1 >> /tmp/evth
        #echo "evth $0: rcode: $?" >> /tmp/evth
        ;;
esac
exit 0

/opt/cert-renew.sh

#!/bin/sh
certbot renew --force-renewal
cat /etc/letsencrypt/live/peterschmitt.fr/privkey.pem > /etc/nginx/ssl/peterschmitt.fr.key.pem
cat /etc/letsencrypt/live/peterschmitt.fr/fullchain.pem > /etc/nginx/ssl/peterschmitt.fr.crt.pem
systemctl restart nginx

Pour les tests on pourra ajouter --dry-run à la commande certbot renew pour, il me semble, éviter de consommer le nombre max d’essais par jour.

Améliorations possibles

Ici, dès la première erreur, on lance la génération et ça sera seulement au prochain check qu’on saura si tout va bien.

On pourrait plutôt mettre deux retry, se servir de l’état SOFT pour déclencher le renouvellement, et si lors du prochain check on passe en HARD, ce qui veut dire que le renouvellement a échoué, on envoie une notification.

Pour faire ça il faudra se servir de la macro $SERVICESTATETYPE$ dans le script de l’event handler.

Ensuite, ça serait vachement mieux de laisser un outil tel que SaltStack faire le déploiement des certificats et gérer la relance des services, surtout que dans cette configuration, le renouvellement se fera trois jours à l’avance. De quoi laisser le temps à ce genre d’outil s’occuper de tout. Mais… quand on fait les choses à La Rache® parce qu’on a La Flemme®… et que ça marche… osef.

by Florent Peterschmitt at August 11, 2016 11:01 AM

Let’s Encrypt, Certbot et Naemon

Ou comment automatiser le renouvellement des certificats avec la supervision.

Le choix de Naemon s’est fait pour quelques raisons :

  • Je n’ai qu’un petit serveur et Naemon n’est pas lourd
  • Comme il n’y a qu’une seule machine, pas besoin d’un truc extra pour la conf
  • Je me fiche d’avoir une sup poussée ou d’avoir des graphes, pour mes besoins perso, même si c’est cool

En fait peu importe la méthode de supervision : il s’agit en fait de déclencher la génération des certificats en peu en avance, sur détection de l’expiration.

Alors, oui, je sais qu’on peut simplement demander à Certbot de mettre à jour et il va se débrouiller pour savoir si le certificat est sur le point d’expirer. Mais autant les graphes c’est cool, et je m’en fiche, autant un truc qui ne va se mettre en route que quand il y en a vraiment besoin, c’est d’autant plus cool =D

Principe

  • On met de la sup sur son certificat. Chez moi la vérification passe par un plugin qui check directement le service, ici un nginx
  • On configure un event handler sur cette sup
  • L’event handler va lancer certbot, via sudo et relancer les services qui ont besoin de prendre en compte les nouveaux certificats

Conf

/etc/sudoers.d/naemon

Defaults    !requiretty
naemon      ALL=(ALL) NOPASSWD: /opt/cert-renew.sh

/etc/naemon/conf.d/sup.cfg

define command {
  command_name          evth_sudo_cert_renew
  command_line          /opt/evth-cert-renew.sh $SERVICESTATE$
}

define service {
  name                  certbot-domain
  use                   generic-service
  max_check_attempts    1
  check_interval        720 ; conformement a la doc certbot, on check toutes les 12 heures
  event_handler_enabled 1
  event_handler         evth_sudo_cert_renew
  register              0
}

define service {
  service_description   Web: https://peterschmitt.fr
  host_name             localhost
  use                   local-service
  check_command         check_http!-u / -H peterschmitt.fr -S -e 403
}

define service {
  service_description   x509: peterschmitt.fr
  host_name             localhost
  use                   certbot-domain
  check_command         check_ssl_expiry!peterschmitt.fr -p 443 -c 3 -w 4 ; la commande qui vous plaira pour la verif des certificats
}

define servicedependency {
  host_name                     localhost
  service_description           Web: https://peterschmitt.fr

  dependent_host_name           localhost
  dependent_service_description x509: peterschmitt.fr

  execution_failure_criteria    p,w,c,u
}

Scripts

/opt/evth-cert-renew.sh

#!/bin/sh
#echo "evth $0: args: $*" >> /tmp/evth
case "$1" in
    CRITICAL)
        #echo "evth $0: cert-renew.sh" >> /tmp/evth
        sudo /opt/cert-renew.sh 2>&1 >> /tmp/evth
        #echo "evth $0: rcode: $?" >> /tmp/evth
        ;;
esac
exit 0

/opt/cert-renew.sh

#!/bin/sh
certbot renew --force-renewal
cat /etc/letsencrypt/live/peterschmitt.fr/privkey.pem > /etc/nginx/ssl/peterschmitt.fr.key.pem
cat /etc/letsencrypt/live/peterschmitt.fr/fullchain.pem > /etc/nginx/ssl/peterschmitt.fr.crt.pem
systemctl restart nginx

Pour les tests on pourra ajouter --dry-run à la commande certbot renew pour, il me semble, éviter de consommer le nombre max d’essais par jour.

Améliorations possibles

Ici, dès la première erreur, on lance la génération et ça sera seulement au prochain check qu’on saura si tout va bien.

On pourrait plutôt mettre deux retry, se servir de l’état SOFT pour déclencher le renouvellement, et si lors du prochain check on passe en HARD, ce qui veut dire que le renouvellement a échoué, on envoie une notification.

Pour faire ça il faudra se servir de la macro $SERVICESTATETYPE$ dans le script de l’event handler.

Ensuite, ça serait vachement mieux de laisser un outil tel que SaltStack faire le déploiement des certificats et gérer la relance des services, surtout que dans cette configuration, le renouvellement se fera trois jours à l’avance. De quoi laisser le temps à ce genre d’outil s’occuper de tout. Mais… quand on fait les choses à La Rache® parce qu’on a La Flemme®… et que ça marche… osef.

by Florent Peterschmitt at August 11, 2016 11:01 AM

August 05, 2016

Florent Peterschmitt

Vieux Centreon et réplica MySQL/MariaDB : objectif MAJ

Il sera question ici de la migration d’un vieux Centreon tout moisi, fonctionnant avec du Nagios et NDOUtils, vers un Centreon 2.7.6, un peu mieux, avec du Centreon Engine et Centreon Broker.

Cette migration a été faite chez un client et s’est passée les doigts dans le pif, et sans trop de coupures.

Je ne vais pas détailler le processus de MAJ de Centreon, ni son installation, la documentation de Centreon se suffit à elle-même, et je vais aussi partir du principe que vous connaissez les fichiers de configuration de Centreon, ainsi que les merdouilles liées au processus d’upgrade (modifier les fichiers de migration SQL à la main, tout ça…).

Ici on va parler réplication MySQL / MariaDB et reprise de service en douceur.

Note : j’ai écris de billet après la prestation, et de mémoire, en relisant la doc faite chez le client et les morceaux de tâches Ansible qui m’ont aidé pour le setup des pollers. S’il y a des erreurs, un petit mail et je corrige.

État des lieux

  • CentOS 6.x x86_64
  • Base de données MySQL 5.1
  • Centreon 2.3.3 installé avec les sources
  • Nagios 3.x + NDOUtils compatible avec Centreon
  • 5 pollers dont un local (sur la machine BDD + Web)

Objectif et étapes

L’objectif est de migrer la totalité des composants vers des outils 100% made in Centreon, et avec le moins de temps de coupure possible, et le must, sans faire de trous dans les graphes \o/

  • CentOS 6.x x86_64
  • Base de donnée MariaDB 5.5 packagée par CES (Centreon)
  • Centreon 2.7.6 installé par les paquets
  • Centreon Broker Daemon, ou cbd, remplace ndo2db
  • Centreon Engine + Centreon Broker Module, remplace Nagios et ndomod
  • Réinstallation de l’instance BDD + Web sur une autre machine, ainsi que son poller local
  • Installation de Centreon Engine en parallèlle des Nagios.

La ré-installation de la BDD + Web sur une autre machine est en fait facultative, ici c’était parce que le client avec des thunes à mettre dans une grosse machines avec des gros SSD dégoulinants d’amour tout plein.

Aussi, pour passer facilement de Nagios à Centreon Engine, on va devoir utiliser temporairement la version 2.6.6 de Centreon, qui est la dernière version à prendre en charge Nagios et NDO. Au delà, le support est largué au profit de Centreon* uniquement.

Réplication de la BDD

La première étape, c’est de répliquer tranquillement les données en base. Centreon fonctionne quasi exclusivement avec sa BDD MySQL. On s’assure ainsi un dump complet de la base, et une récupération de l’état courant sans jamais oublier personne en chemin.

Note : même si on peut voir des modules InfluxDB apparaître pour Centreon-Broker, je ne l’ai pas testé (et Centreon n’étant pas une techno qui m’intéresse particulièrement, j’ai pas trop envie de m’y coller) et de toute façon le client n’aurait pas forcément souhaité installer grafana en plus.

Configuration

Déjà, il vous faut, de préférence, une base MySQL identique à la première : même configuration et même version.

Ensuite, on va configurer comme suit notre MySQL “master”, qui est la base qui contient présentement les données :

[mysqld]
net_write_timeout = 3600
max_allowed_packet = 1G
log-bin=mysqld-log-bin
server_id=1
open-files-limit = 32000
binlog_format=MIXED

Et sur notre MySQL “slave”, qui ne contient rien du tout pour le moment :

[mysqld]
relay-log=mysqld-log-relay
net_write_timeout = 3600
max_allowed_packet = 1G
server_id=2
read-only
open-files-limit = 32000
slave-skip-errors = 1062

Pour la réplication, un utilisateur dédié est nécessaire. Le/les slave(s) vont se connecter au master via cet utilisateur.

Création sur le master :

create user 'replication_user'@'%' identified by 'the_super_password';
grant replication slave on *.* to replication_user;
flush privileges;

Enfin il ne coûte rien de vérifier que nos MySQL vont pouvoir causer entre eux :

$ mysql
MariaDB [(none)]> show variables like 'skip_networking';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   |
+-----------------+-------+
1 row in set (0.00 sec)


$ netstat -laputen|grep 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:\*                   LISTEN

Et là on peut redémarrer nos deux MySQL pour prendre en compte la configuration.

service mysqld restart

Initialisation

Cette étape consiste à charger un gros dump en live dans notre slave, pour ensuite lui dire de rejouer les binlog à partir d’un certain point.

Attention : il vous faut impérativement vérifier l’espace disque disponible sur vos machines, et estimer le temps que ce dump va mettre. Sinon vous risquez de ne plus avoir de place pour les binlog, et je ne vous fait pas un dessin : ça va tout planter !

Bon, déjà, je n’ai pas vraiment trouvé de bonne méthode pour faire ça très proprement, vous allez voir.

Sur le master, on va exécuter ça :

mysqldump -uroot -ppassword --all-databases --skip-lock-tables --single-transaction --flush-logs --master-data=1 --quick | head -n 30|grep '^CHANGE MASTER TO'

On va se prendre un Got errno 32 on write, ce qui est normal vu qu’avec head on a fermé stdin alors que mysqldump contiuait à écrire. C’est la même erreur qu’on se prendrait en cas de fulldisk si je ne m’abuse.

Retenez cette valeur : MASTER_LOG_POS=XXX

Exemple de retour : CHANGE MASTER TO MASTER_LOG_FILE=’mariadb-log-bin.000018’, MASTER_LOG_POS=106;

Dans l’exemple, la valeur à retenir est 106. On va s’en servir pour faire démarrer notre slave à la bonne position de départ dans le prochain log-bin qui va être créé quand on démarrera le dump.

Pour les options utilisées dans la commande mysqldump, je vous laisse man mysqldump, c’est très bien expliqué.

Bien, maintenant on va réellement lancer le dump. Préparez deux shell : un dans un screen ou tmux, et l’autre sur la console MySQL de votre master.

Dans le premier, faites feu :

mysqldump -uroot -ppassword --all-databases --skip-lock-tables --single-transaction --flush-logs --master-data=1 --quick | gzip | ssh root@host_slave "zcat | mysql -uroot"

Sans attendre, dans le second :

mysql> SHOW MASTER STATUS\G
... bla bla bla ...
Master_Log_File: mysqld-log-bin.XXXXXX
... bla bla bla ...

Ça les amis, c’est le fichier à partir duquel notre slave va devoir rejouer les instructions, pour commencer la récupération.

Donc on se retrouve au final avec ces deux infos :

MASTER_LOG_POS=106
MASTER_LOG_FILE=mysqld-log-bin.XXXXXX

Ah ouais, heu, XXXXXX, ça va être des chiffres. Mettons, pour la suite, que ce nombre est 000002.

Mise en marche du slave

Déjà, attendez que votre mysqldump ai terminé et sans erreur. À la moindre coupure, vous pouvez tout recommencer.

Si ça arrive, sachez que vous pouvez supprimer les binlog du master qui ne sont plus en activité : ils ne servent plus à rien.

Par contre, si tout va bien, ne supprimez rien du tout, car naturellement, on va en avoir besoin.

Ouvrez une console MySQL sur le slave, on va changer sa configuration et lancer le processus de réplication.

Exécutez cette commande, en adaptant avec vos valeur pour MASTER_LOG_POS et MASTER_LOG_FILE :

CHANGE MASTER TO
  MASTER_HOST='host_master',
  MASTER_USER='replication_user',
  MASTER_PASSWORD='the_super_password',
  MASTER_PORT=3306,
  MASTER_CONNECT_RETRY=10,
  MASTER_LOG_FILE='mysqld-log-bin.000002',
  MASTER_LOG_POS=106;

Vous pouvez vérifier que les infos ont bien été prises en compte avec la commande SHOW SLAVE STATUS\G.

Quand tout va bien, exécutez SLAVE START;.

Tout au long de la récupération du slave sur le master, on devra avoir quelque chose comme ça :

show slave status \G;
# On ne doit pas trouver d’erreur :
    Last_IO_Errno: 0
    Last_IO_Error: 
    Last_SQL_Errno: 0
    Last_SQL_Error:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

# Le compteur de retard ne doit pas sans cesse s’incrémenter :
    Seconds_Behind_Master: XXXXX

Le compteur Seconds_Behind_Master va devoir tendre vers 0 avec le temps. Il pourra momentanément augmenter, mais s’il ne fait que d’augmenter, alors vous avez un problème : votre slave n’est pas capable d’absorber la charge ou votre master ne répond pas assez vite, ou les deux.

Vous vous souvenez de l’option slave-skip-errors = 1062 dans la configuration ? Visitez directement ce lien : http://www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/

Ça va vous arriver, en tout cas avec Centreon. Je n’ai pas eu le temps d’investiguer sur le pourquoi du comment, en revanche je sais qu’il n’y a pas réellement de problème et qu’il n’y aura pas de corruption. Ce genre d’erreur est à confronter avec votre environnement et la/les application(s) qui utilisent vos bases.

En tout cas, il est nécessaire de zapper cette erreur, sinon vous vous retrouverez à devoir manuellement, ou scriptemochement, sauter les erreurs. MySQL a déjà une option pour ça, utilisons la.

Quand le compteur Seconds_Behind_Master tombe à zéro, on pourra poursuivre la migration.

Transfert du master vers le slave (arrêt du master)

On va maintenant reconfigurer notre slave pour être utilisé en temps que master, et abandonner le master actuel.

Connectez-vous sur votre Centreon et modifiez la conf des ndomod (ou faites le à la main, je m’en fiche du moment que c’est fait) pour qu’ils aient un fichier de rétention en cas d’injoignabilité de ndo2db.

Modifiez aussi la configuration ndo2db pour pointer sur la BDD slave. Ne relancez surtout pas ndo2db pour le moment.

Appliquez cette conf, et faites un petit test pour vous assurer que le fichier est bien créé consommé lorsqu’une règle iptables empêche notre Nagios de causer avec ndo2db, puis consommé quand on la retire.

Arrêtez tous les services Centreon (centcore et centstorage).

Quand c’est fait, coupez vos instances de ndo2db. Et là encore, attention à l’espace disque sur les pollers : il ne s’agirait pas de faire un full parce que /var est taillé à la serpe.

Avant toute chose, vérifiez que votre slave a bien fini de se synchroniser avec le master.

Arrêtez l’instance de MySQL sur le master.

Ensuite, avec MySQL 5.1, on va devoir redémarrer le slave une fois pour repasser en mode “normal”.

  1. Supprimez la configuration qui a été ajoutée pour le slave
  2. Exécutez sur le slave slave stop; reset slave;
  3. Redémarrez mysqld du slave
  4. Vérifiez avec show slave status\G que vous n’obtenez plus rien. Si ce n’est pas le cas, je me suis vautré dans les commandes précédentes \^_\^

Eh bah là on est bon les enfants. On va pouvoir redémarrer ndo2db, qui, avec sa nouvelle conf, va venir peupler notre nouvelle base, et modifier les fichiers de configuration Centreon pour que centcore et centstorage viennent taper sur notre nouvelle base.

Les fichiers de conf sont normalement dans /etc/centreon, mais si c’est une installation par les sources, vous les avez peut-être dans /usr/local/centreon/etc/. Adaptez la conf des bases.

Reprise de service

Redémarrez donc ndo2db, centcore et centstorage. Constatez la bonne reprise du service.

Pour l’instant, seule la base SQL a été migrée. On va pouvoir passer aux choses sérieuses avec la MAJ.

MAJ

Coupez encore une fois ndo2db, centcore et centstorage.

Débrouillez-vous pour passer en version 2.6.6. Avec yum-plugin-versionlock, voici le versionlock.list approprié :

centreon-2.6.6-5.el6.noarch
centreon-base-2.6.6-5.el6.noarch
centreon-base-config-nagios-2.6.6-5.el6.noarch
centreon-common-2.6.6-5.el6.noarch
centreon-installed-2.6.6-5.el6.noarch
centreon-perl-libs-2.6.6-5.el6.noarch
centreon-web-2.6.6-5.el6.noarch
centreon-plugins-2.6.6-5.el6.noarch
centreon-plugin-meta-2.6.6-5.el6.noarch
centreon-trap-2.6.6-5.el6.noarch
ndoutils-1.4b9-6.el6.x86_64
centreon-broker-2.10.5-2.el6.x86_64
centreon-broker-cbmod-2.10.5-2.el6.x86_64
centreon-broker-core-2.10.5-2.el6.x86_64
centreon-broker-cbd-2.10.5-2.el6.x86_64
centreon-broker-storage-2.10.5-2.el6.x86_64
ndoutils-1.4b9-6.el6.x86_64

Installez Centreon en utilisant centreon et centreon-base-config-nagios, copiez les fichiers de conf Centreon, puis passez le processus de MAJ de Centreon.

Vous pouvez maintenant redémarrer vos ndo2db, centcore et centstorage, et vérifier que ça marche.

Passage en Centreon-Engine + Centreon Broker

  1. Installer centreon-engine et centreon-broker-cbmod sur les pollers
  2. Installer centreon-broker-daemon sur votre Central
  3. Configurez chaque future instance de centreon-engine, ainsi que centreon-broker-module et centreon-broker-daemon
  4. Copiez le ~/.ssh de l’utilisateur centreon sur votre nouvelle machine, c’est nécessaire pour joindre les pollers

Pour cela, la documentation de centreon devrait suffire, sinon il y a d’autres tutos qui expliquent comment configurer tout ce beau monde.

Une fois que vous avez tout configuré, poussez vous conf mais ne démarrez rien.

  1. Démarrez cbd sur le central, vérifiez qu’il tourne bien et accepte les connexions
  2. Arrêtez ndo2db, votre supervision continueras de tourner et en cas de pépin, la reprise de service avec NDO est faisable simplement en relançant le service
  3. Configurez Centreon pour utiliser Centreon Broker. Ça se trouve dans les paramètres d’administration
  4. De là vous ne devriez plus avoir de status, car cbd écrit dans centreon_storage, alors que NDO écrit dans centreon_status. Le fait d’avoir configuré Centreon en mode Centreon Broker fait qu’il regarde dans centreon_storage.
  5. Lancer vos Centreon Engine. Les status devraient montés quasi immédiatement. Si ça n’est pas le cas (du style le compte d’hôte qui passe de 0 à 100, puis re à 0, puis à 200, puis à 0 etc… vous vous êtes viandé dans la conf des instances de pollers)

À partir de là, si tout fonctionne, arrêtez vos Nagios

MAJ version Centreon 2.7.x

Ben là ya pas plus simple : on arrête les services Centreon du central, on retire le versionlock.list, on upgrade tout le monde (pollers compris, centreno-engine et cbmod), et on relance.

Vous devrez aussi lancer une reconstruction des graphes à partir des données en base. Les migrations des RRD n’ont jamais bien fonctionné, même avec les rrddump et rrdrestore.

Aussi faites gaffe, vous aurez peut-être besoin de faire du nettoyage pour certaines métriques inexistantes :

use centreon_storage; # adapter...
delete from metrics where (select count(*) from data_bin as db where db.id_metric=metric_id) = 0;

by Florent Peterschmitt at August 05, 2016 09:22 AM

Vieux Centreon et réplica MySQL/MariaDB : objectif MAJ

Il sera question ici de la migration d’un vieux Centreon tout moisi, fonctionnant avec du Nagios et NDOUtils, vers un Centreon 2.7.6, un peu mieux, avec du Centreon Engine et Centreon Broker.

Cette migration a été faite chez un client et s’est passée les doigts dans le pif, et sans trop de coupures.

Je ne vais pas détailler le processus de MAJ de Centreon, ni son installation, la documentation de Centreon se suffit à elle-même, et je vais aussi partir du principe que vous connaissez les fichiers de configuration de Centreon, ainsi que les merdouilles liées au processus d’upgrade (modifier les fichiers de migration SQL à la main, tout ça…).

Ici on va parler réplication MySQL / MariaDB et reprise de service en douceur.

Note : j’ai écris de billet après la prestation, et de mémoire, en relisant la doc faite chez le client et les morceaux de tâches Ansible qui m’ont aidé pour le setup des pollers. S’il y a des erreurs, un petit mail et je corrige.

État des lieux

  • CentOS 6.x x86_64
  • Base de données MySQL 5.1
  • Centreon 2.3.3 installé avec les sources
  • Nagios 3.x + NDOUtils compatible avec Centreon
  • 5 pollers dont un local (sur la machine BDD + Web)

Objectif et étapes

L’objectif est de migrer la totalité des composants vers des outils 100% made in Centreon, et avec le moins de temps de coupure possible, et le must, sans faire de trous dans les graphes \o/

  • CentOS 6.x x86_64
  • Base de donnée MariaDB 5.5 packagée par CES (Centreon)
  • Centreon 2.7.6 installé par les paquets
  • Centreon Broker Daemon, ou cbd, remplace ndo2db
  • Centreon Engine + Centreon Broker Module, remplace Nagios et ndomod
  • Réinstallation de l’instance BDD + Web sur une autre machine, ainsi que son poller local
  • Installation de Centreon Engine en parallèlle des Nagios.

La ré-installation de la BDD + Web sur une autre machine est en fait facultative, ici c’était parce que le client avec des thunes à mettre dans une grosse machines avec des gros SSD dégoulinants d’amour tout plein.

Aussi, pour passer facilement de Nagios à Centreon Engine, on va devoir utiliser temporairement la version 2.6.6 de Centreon, qui est la dernière version à prendre en charge Nagios et NDO. Au delà, le support est largué au profit de Centreon* uniquement.

Réplication de la BDD

La première étape, c’est de répliquer tranquillement les données en base. Centreon fonctionne quasi exclusivement avec sa BDD MySQL. On s’assure ainsi un dump complet de la base, et une récupération de l’état courant sans jamais oublier personne en chemin.

Note : même si on peut voir des modules InfluxDB apparaître pour Centreon-Broker, je ne l’ai pas testé (et Centreon n’étant pas une techno qui m’intéresse particulièrement, j’ai pas trop envie de m’y coller) et de toute façon le client n’aurait pas forcément souhaité installer grafana en plus.

Configuration

Déjà, il vous faut, de préférence, une base MySQL identique à la première : même configuration et même version.

Ensuite, on va configurer comme suit notre MySQL “master”, qui est la base qui contient présentement les données :

[mysqld]
net_write_timeout = 3600
max_allowed_packet = 1G
log-bin=mysqld-log-bin
server_id=1
open-files-limit = 32000
binlog_format=MIXED

Et sur notre MySQL “slave”, qui ne contient rien du tout pour le moment :

[mysqld]
relay-log=mysqld-log-relay
net_write_timeout = 3600
max_allowed_packet = 1G
server_id=2
read-only
open-files-limit = 32000
slave-skip-errors = 1062

Pour la réplication, un utilisateur dédié est nécessaire. Le/les slave(s) vont se connecter au master via cet utilisateur.

Création sur le master :

create user 'replication_user'@'%' identified by 'the_super_password';
grant replication slave on *.* to replication_user;
flush privileges;

Enfin il ne coûte rien de vérifier que nos MySQL vont pouvoir causer entre eux :

$ mysql
MariaDB [(none)]> show variables like 'skip_networking';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   |
+-----------------+-------+
1 row in set (0.00 sec)


$ netstat -laputen|grep 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:\*                   LISTEN

Et là on peut redémarrer nos deux MySQL pour prendre en compte la configuration.

service mysqld restart

Initialisation

Cette étape consiste à charger un gros dump en live dans notre slave, pour ensuite lui dire de rejouer les binlog à partir d’un certain point.

Attention : il vous faut impérativement vérifier l’espace disque disponible sur vos machines, et estimer le temps que ce dump va mettre. Sinon vous risquez de ne plus avoir de place pour les binlog, et je ne vous fait pas un dessin : ça va tout planter !

Bon, déjà, je n’ai pas vraiment trouvé de bonne méthode pour faire ça très proprement, vous allez voir.

Sur le master, on va exécuter ça :

mysqldump -uroot -ppassword --all-databases --skip-lock-tables --single-transaction --flush-logs --master-data=1 --quick | head -n 30|grep '^CHANGE MASTER TO'

On va se prendre un Got errno 32 on write, ce qui est normal vu qu’avec head on a fermé stdin alors que mysqldump contiuait à écrire. C’est la même erreur qu’on se prendrait en cas de fulldisk si je ne m’abuse.

Retenez cette valeur : MASTER_LOG_POS=XXX

Exemple de retour : CHANGE MASTER TO MASTER_LOG_FILE=’mariadb-log-bin.000018’, MASTER_LOG_POS=106;

Dans l’exemple, la valeur à retenir est 106. On va s’en servir pour faire démarrer notre slave à la bonne position de départ dans le prochain log-bin qui va être créé quand on démarrera le dump.

Pour les options utilisées dans la commande mysqldump, je vous laisse man mysqldump, c’est très bien expliqué.

Bien, maintenant on va réellement lancer le dump. Préparez deux shell : un dans un screen ou tmux, et l’autre sur la console MySQL de votre master.

Dans le premier, faites feu :

mysqldump -uroot -ppassword --all-databases --skip-lock-tables --single-transaction --flush-logs --master-data=1 --quick | gzip | ssh root@host_slave "zcat | mysql -uroot"

Sans attendre, dans le second :

mysql> SHOW MASTER STATUS\G
... bla bla bla ...
Master_Log_File: mysqld-log-bin.XXXXXX
... bla bla bla ...

Ça les amis, c’est le fichier à partir duquel notre slave va devoir rejouer les instructions, pour commencer la récupération.

Donc on se retrouve au final avec ces deux infos :

MASTER_LOG_POS=106
MASTER_LOG_FILE=mysqld-log-bin.XXXXXX

Ah ouais, heu, XXXXXX, ça va être des chiffres. Mettons, pour la suite, que ce nombre est 000002.

Mise en marche du slave

Déjà, attendez que votre mysqldump ai terminé et sans erreur. À la moindre coupure, vous pouvez tout recommencer.

Si ça arrive, sachez que vous pouvez supprimer les binlog du master qui ne sont plus en activité : ils ne servent plus à rien.

Par contre, si tout va bien, ne supprimez rien du tout, car naturellement, on va en avoir besoin.

Ouvrez une console MySQL sur le slave, on va changer sa configuration et lancer le processus de réplication.

Exécutez cette commande, en adaptant avec vos valeur pour MASTER_LOG_POS et MASTER_LOG_FILE :

CHANGE MASTER TO
  MASTER_HOST='host_master',
  MASTER_USER='replication_user',
  MASTER_PASSWORD='the_super_password',
  MASTER_PORT=3306,
  MASTER_CONNECT_RETRY=10,
  MASTER_LOG_FILE='mysqld-log-bin.000002',
  MASTER_LOG_POS=106;

Vous pouvez vérifier que les infos ont bien été prises en compte avec la commande SHOW SLAVE STATUS\G.

Quand tout va bien, exécutez SLAVE START;.

Tout au long de la récupération du slave sur le master, on devra avoir quelque chose comme ça :

show slave status \G;
# On ne doit pas trouver d’erreur :
    Last_IO_Errno: 0
    Last_IO_Error: 
    Last_SQL_Errno: 0
    Last_SQL_Error:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

# Le compteur de retard ne doit pas sans cesse s’incrémenter :
    Seconds_Behind_Master: XXXXX

Le compteur Seconds_Behind_Master va devoir tendre vers 0 avec le temps. Il pourra momentanément augmenter, mais s’il ne fait que d’augmenter, alors vous avez un problème : votre slave n’est pas capable d’absorber la charge ou votre master ne répond pas assez vite, ou les deux.

Vous vous souvenez de l’option slave-skip-errors = 1062 dans la configuration ? Visitez directement ce lien : http://www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/

Ça va vous arriver, en tout cas avec Centreon. Je n’ai pas eu le temps d’investiguer sur le pourquoi du comment, en revanche je sais qu’il n’y a pas réellement de problème et qu’il n’y aura pas de corruption. Ce genre d’erreur est à confronter avec votre environnement et la/les application(s) qui utilisent vos bases.

En tout cas, il est nécessaire de zapper cette erreur, sinon vous vous retrouverez à devoir manuellement, ou scriptemochement, sauter les erreurs. MySQL a déjà une option pour ça, utilisons la.

Quand le compteur Seconds_Behind_Master tombe à zéro, on pourra poursuivre la migration.

Transfert du master vers le slave (arrêt du master)

On va maintenant reconfigurer notre slave pour être utilisé en temps que master, et abandonner le master actuel.

Connectez-vous sur votre Centreon et modifiez la conf des ndomod (ou faites le à la main, je m’en fiche du moment que c’est fait) pour qu’ils aient un fichier de rétention en cas d’injoignabilité de ndo2db.

Modifiez aussi la configuration ndo2db pour pointer sur la BDD slave. Ne relancez surtout pas ndo2db pour le moment.

Appliquez cette conf, et faites un petit test pour vous assurer que le fichier est bien créé consommé lorsqu’une règle iptables empêche notre Nagios de causer avec ndo2db, puis consommé quand on la retire.

Arrêtez tous les services Centreon (centcore et centstorage).

Quand c’est fait, coupez vos instances de ndo2db. Et là encore, attention à l’espace disque sur les pollers : il ne s’agirait pas de faire un full parce que /var est taillé à la serpe.

Avant toute chose, vérifiez que votre slave a bien fini de se synchroniser avec le master.

Arrêtez l’instance de MySQL sur le master.

Ensuite, avec MySQL 5.1, on va devoir redémarrer le slave une fois pour repasser en mode “normal”.

  1. Supprimez la configuration qui a été ajoutée pour le slave
  2. Exécutez sur le slave slave stop; reset slave;
  3. Redémarrez mysqld du slave
  4. Vérifiez avec show slave status\G que vous n’obtenez plus rien. Si ce n’est pas le cas, je me suis vautré dans les commandes précédentes \^_\^

Eh bah là on est bon les enfants. On va pouvoir redémarrer ndo2db, qui, avec sa nouvelle conf, va venir peupler notre nouvelle base, et modifier les fichiers de configuration Centreon pour que centcore et centstorage viennent taper sur notre nouvelle base.

Les fichiers de conf sont normalement dans /etc/centreon, mais si c’est une installation par les sources, vous les avez peut-être dans /usr/local/centreon/etc/. Adaptez la conf des bases.

Reprise de service

Redémarrez donc ndo2db, centcore et centstorage. Constatez la bonne reprise du service.

Pour l’instant, seule la base SQL a été migrée. On va pouvoir passer aux choses sérieuses avec la MAJ.

MAJ

Coupez encore une fois ndo2db, centcore et centstorage.

Débrouillez-vous pour passer en version 2.6.6. Avec yum-plugin-versionlock, voici le versionlock.list approprié :

centreon-2.6.6-5.el6.noarch
centreon-base-2.6.6-5.el6.noarch
centreon-base-config-nagios-2.6.6-5.el6.noarch
centreon-common-2.6.6-5.el6.noarch
centreon-installed-2.6.6-5.el6.noarch
centreon-perl-libs-2.6.6-5.el6.noarch
centreon-web-2.6.6-5.el6.noarch
centreon-plugins-2.6.6-5.el6.noarch
centreon-plugin-meta-2.6.6-5.el6.noarch
centreon-trap-2.6.6-5.el6.noarch
ndoutils-1.4b9-6.el6.x86_64
centreon-broker-2.10.5-2.el6.x86_64
centreon-broker-cbmod-2.10.5-2.el6.x86_64
centreon-broker-core-2.10.5-2.el6.x86_64
centreon-broker-cbd-2.10.5-2.el6.x86_64
centreon-broker-storage-2.10.5-2.el6.x86_64
ndoutils-1.4b9-6.el6.x86_64

Installez Centreon en utilisant centreon et centreon-base-config-nagios, copiez les fichiers de conf Centreon, puis passez le processus de MAJ de Centreon.

Vous pouvez maintenant redémarrer vos ndo2db, centcore et centstorage, et vérifier que ça marche.

Passage en Centreon-Engine + Centreon Broker

  1. Installer centreon-engine et centreon-broker-cbmod sur les pollers
  2. Installer centreon-broker-daemon sur votre Central
  3. Configurez chaque future instance de centreon-engine, ainsi que centreon-broker-module et centreon-broker-daemon
  4. Copiez le ~/.ssh de l’utilisateur centreon sur votre nouvelle machine, c’est nécessaire pour joindre les pollers

Pour cela, la documentation de centreon devrait suffire, sinon il y a d’autres tutos qui expliquent comment configurer tout ce beau monde.

Une fois que vous avez tout configuré, poussez vous conf mais ne démarrez rien.

  1. Démarrez cbd sur le central, vérifiez qu’il tourne bien et accepte les connexions
  2. Arrêtez ndo2db, votre supervision continueras de tourner et en cas de pépin, la reprise de service avec NDO est faisable simplement en relançant le service
  3. Configurez Centreon pour utiliser Centreon Broker. Ça se trouve dans les paramètres d’administration
  4. De là vous ne devriez plus avoir de status, car cbd écrit dans centreon_storage, alors que NDO écrit dans centreon_status. Le fait d’avoir configuré Centreon en mode Centreon Broker fait qu’il regarde dans centreon_storage.
  5. Lancer vos Centreon Engine. Les status devraient montés quasi immédiatement. Si ça n’est pas le cas (du style le compte d’hôte qui passe de 0 à 100, puis re à 0, puis à 200, puis à 0 etc… vous vous êtes viandé dans la conf des instances de pollers)

À partir de là, si tout fonctionne, arrêtez vos Nagios

MAJ version Centreon 2.7.x

Ben là ya pas plus simple : on arrête les services Centreon du central, on retire le versionlock.list, on upgrade tout le monde (pollers compris, centreno-engine et cbmod), et on relance.

Vous devrez aussi lancer une reconstruction des graphes à partir des données en base. Les migrations des RRD n’ont jamais bien fonctionné, même avec les rrddump et rrdrestore.

Aussi faites gaffe, vous aurez peut-être besoin de faire du nettoyage pour certaines métriques inexistantes :

use centreon_storage; # adapter...
delete from metrics where (select count(*) from data_bin as db where db.id_metric=metric_id) = 0;

by Florent Peterschmitt at August 05, 2016 09:22 AM

August 02, 2016

Luc Didry

Encore un bug avec Ganeti (mais pas tout à fait de sa faute)

Comme je l’ai dit hier, j’uti­lise Ganeti pour gérer les VMs de Frama­soft.

J’uti­lise la version 2.15, des dépôts back­ports de Debian Jessie.

Manque de pot, la version de socat des back­ports, 1.7.3.1–1~b­po8+1, pose des problèmes à Ganeti.

En effet, j’ai voulu dépla­cer une VM sur un autre nœud du clus­ter, et paf :

"disk/0 failed to receive data: Exited with status 1 (recent output: socat: E openssl-method="TLSv1": method unknown or not provided by library\n0+0 records in\n0+0 records out\n0 bytes (0 B) copied, 0.00308621 s, 0.0 kB/s)"

Heureu­se­ment, contrai­re­ment à hier, je n’ai pas du cher­cher bien loin pour trou­ver la solu­tion.

Les chan­ge­ments entre socat 1.7.2 et 1.7.3 font plan­ter le trans­fert. Il n’y a donc qu’à down­gra­der socat pour que ça roule :

apt-get install socat=1.7.2.4-2

Deux articles sur des problèmes de Ganeti coup sur coup, ça fait un peu « Mais c’est de la merde ce truc ». Bah non, je trouve que ça reste une très bonne solu­tion pour faire de la virtua­li­sa­tion sur ses serveurs de façon simple et fiable. Si, si, fiable : même quand Ganeti plante, la virtua­li­sa­tion tourne toujours. C’est le prin­cipe de Ganeti. Il n’est pas « utile » pour faire tour­ner les VMs, mais pour les mani­pu­ler. Et ça j’aime beau­coup :-)

Parta­ger

Flattr this!

by Luc at August 02, 2016 05:04 PM

August 01, 2016

Luc Didry

LE bug de merde dans Ganeti 2.15

La semaine dernière, j’ai passé tous les serveurs du clus­ter Ganeti de Frama­soft en Debian Jessie (pour ceux qui ne l’étaient pas encore).

Et là, paf, je rencontre un vilain bug : le dæmon luxid qui segfault à tout bout de champ. Bah oui, le clus­ter était encore en 2.11, la version de wheezy-back­ports. Et Ganeti 2.11 + systemd (qui nous est arrivé par la grâce de la mise à jour en Jessie), ça ne fait pas bon ménage.

Qu’à cela ne tienne, je peux passer en 2.15, la version de jessie-back­ports.

gnt-cluster upgrade --to 2.15

Hop, nickel, luxid tient la route, je suis content.

Là, je me mets à vouloir ajou­ter un nœud au clus­ter.

gnt-node add foo.exemple.org

Bam. Ça foire.

Failure: command execution error:
need more than 1 value to unpack

En cher­chant bien, on tombe sur cette page où les mecs farfouillent beau­coup pour trou­ver le problème. Ça va de « Est-ce que c’est pas la version d’openssl qui serait pas la même » à « Ajoute telle option à ton sshd_config ».

Je vous la fais courte : c’est juste que l’er­reur n’est pas correc­te­ment détec­tée. C’est un bête problème de More than one node group exists. Target group must be specified explicitly..

Donc la solu­tion est de spéci­fier le groupe auquel ratta­cher le nouveau nœud :

gnt-node -g le_groupe foo.exemple.org

Raah, il m’aura bien fait courir ce bug-là !

Parta­ger

Flattr this!

by Luc at August 01, 2016 02:27 PM

July 24, 2016

Luc Didry

Retour sur le « No poo »

Suite à mon jour­nal sur le Seitan sur LinuxFr (ou à la paru­tion de mon article de blog sur Diaspo­ra*, je sais plus), on m’a parlé du « No poo » et notam­ment de cet article. C’est un mouve­ment qui consiste à ne plus se laver les cheveux.

« Beurk, c’est dégueu­lasse ! » me direz-vous. Et bien non :-)

J’ai donc essayé le No poo. Ça fait un peu plus de deux mois main­te­nant que je ne me lave plus les cheveux qu’au bicar­bo­nate et jus de citron.

« Mais pourquoi donc faire cela ? »

Ma foi, j’ai toujours trouvé cela embê­tant de me mettre sur les cheveux un truc dont la compo­si­tion est impos­sible à comprendre à moins d’avoir un docto­rat en chimie.

Un peu moins de chimie dans la vie dans la vie quoti­dienne, ça ne peut pas faire de mal :-)

Résul­tat au bout de deux mois : je ne me lave plus les cheveux tous les jours, ils sont plus épais et plus doux, et après un lavage, ils sont aussi bien démê­lés qu’a­vec un sham­pooing clas­sique (j’ai les cheveux longs et légè­re­ment bouclés, ils s’em­mêlent faci­le­ment). Le prix ? J’ai pas fait trop gaffe… un paquet de 500g de bicar­bo­nate coûte un peu moins de 4€ et on en a pour plus de 2 mois. ± 3€ pour 50cl de jus de citron, qui dure plus de 2 mois… Alors oui, les bouteilles de sham­pooing peuvent coûter moins cher, mais si je ne dis pas de bêtises, je les vidais vite. Pour moi, c’est gagnant au niveau qualité et au niveau prix.

Je ne peux donc que vous encou­ra­ger à tester :-)

EDIT : dans le jour­nal LinuxFr que j’ai fait de cet article, Wendigo a pointé ce docu­men­taire. C’est sur le gel douche, mais ce qui s’y dit doit être valable pour les sham­pooings.

Parta­ger

Flattr this!

by Luc at July 24, 2016 12:20 PM

July 18, 2016

Luc Didry

Mise à jour de Lufi

Je viens de pous­ser la correc­tion de failles sur Lufi. Pour ceux qui l’ont installé sur leur serveur, mettez à jour rapi­de­ment !

Pour ceux qui utilisent https://demo.lufi.io ou https://frama­drop.org, ces deux instances ont été mises à jour dans la foulée du commit.

Parta­ger

Flattr this!

by Luc at July 18, 2016 12:56 PM

July 14, 2016

Luc Didry

Lance­ment de mes pages Tipeee et Libe­ra­pay

Libre ne veut pas dire gratuit. Et oui, les déve­lop­peurs de logi­ciels libres doivent manger aussi.

Le problème est que cet état de fait n’est pas toujours dans les têtes de tout le monde, parti­cu­liers comme entre­prises. Des exemples ?

Heureu­se­ment, certaines orga­ni­sa­tions comme Frama­soft (dont je suis sala­rié), à force de péda­go­gie, de répé­ti­tion et de campagnes de dons, arrivent à faire passer le message (certes, Frama­soft ne produit pas (enfin si, mais très peu) de logi­ciel, mais four­nit un énorme effort pour faire connaître le logi­ciel libre au grand public et contri­bue au logi­ciel libre par des traduc­tions, des tuto­riels, des patchs, des rapports de bugs, etc).

Mais qu’en est-il pour les déve­lop­peurs isolés ? Ceux qui n’ont pas le temps de faire leur promo ? Géné­ra­le­ment, on a droit à un pauvre petit bouton paypal sur le site du logi­ciel ou leur site person­nel. C’est déjà ça, mais ça limite le soutien à ceux qui ont un compte paypal (oui, je sais, on peut aussi payer par carte bancaire, mais je sais d’ex­pé­rience qu’il faut que la personne qui met le bouton confi­gure sa page paypal pour ça et que paypal ne s’amuse pas à chan­ger ses confi­gu­ra­tions sans rien dire) et à un don ponc­tuel. Et la sauce de Flattr n’a malheu­reu­se­ment pas pris.

Heureu­se­ment, il y a main­te­nant de nouvelles façons de soute­nir les personnes que l’on souhaite aider : Tipeee, Libe­ra­pay, Patreon et autres plate­formes de dons.

Ces plate­formes ont l’avan­tage de permettre les dons récur­rents et de four­nir une page person­na­li­sée pour le créa­teur, lui permet­tant d’ex­pliquer ce qu’il fait, pourquoi il propose de le soute­nir, et même pour certaines d’entre elles de propo­ser des contre­par­ties.

« Oui mais on peut déjà faire une page sur son site ». Oui mais c’est beau­coup plus simple de créer la page sur ces outils et surtout, cette page est la même que celle où l’on peut donner, détail d’im­por­tance.

Bref, tout ça pour dire que je lance mes pages Tipeee (pour l’as­pect plate­forme connue) et Libe­ra­pay (pour être sur une plate­forme libre, on ne se refait pas :D ).

À ma connais­sance, il n’y a pas de déve­lop­peur de logi­ciel libre sur ce genre de plate­forme (Tipeee, tout du moins), je teste­rai donc :-)
Il faut bien tester les diffé­rentes pistes à notre dispo­si­tion en atten­dant le revenu de base ou le salaire à vie.

Soyons clair : je ne cherche pas à gagner suffi­sam­ment de sous pour vivre de mes logi­ciels (bossant pour Frama­soft, je gagne déjà ma vie grâce au logi­ciel libre). Par contre, je permets à ceux qui le souhaitent de me remer­cier en me donnant de quoi me payer une bière de temps en temps, tout en rece­vant une contre­par­tie. Car oui, je propose des contre­par­ties :-) Vous pouvez voir lesquelles sur https://www.tipeee.com/fiat-tux (et quelles sont mes réali­sa­tions dans le domaine du logi­ciel libre sur https://luc.frama.io/, en cliquant sur Réali­sa­tions).

Et histoire de donner le bon exemple, sachez que je soutiens :

  • Neil Jomunsi, écri­vain libre
  • JcFrog, musi­cien/chan­teur/inter­prète paro­dique libre
  • Gee, dessi­na­teur libre
  • ZeMar­mot, film d’ani­ma­tion libre

N’hé­si­tez pas à les soute­nir, ainsi que Frama­soft, la Quadra­ture du Net et l’April :-)

Me soutenir sur Tipeee Me soutenir sur Liberapay

Parta­ger

Flattr this!

by Luc at July 14, 2016 11:15 AM

July 08, 2016

Sebastien Badia

Let's Encrypt using DNS challenge

Logo Let's Encrypt

On va encore parler de Let's Encrypt, non pas du fait que Comodo a essayé d'enregistrer la marque « Let's Encrypt » (oui rien que ça… ils ne doutent rien ces gens… voir cet article).

Mais on va parler de la possibilité de faire du challenge/response DNS pour la génération de nos certificats. En effet dans un précédant article, j'expliquais comment utiliser le client acme-tiny afin de générer des certificats SSL. Le soucis avec cette méthode (et le challenge/response en HTTP) c'est, comme son nom l'indique, qu'il utilise du HTTP(s); il faut donc obligatoirement avoir un serveur web qui va répondre aux challenges (afin de vérifier que nous avons bien le contrôle du domaine que nous souhaitons certifier).

Dans certains cas, il est nécessaire de générer des certificats sans disposer d'un serveur web (soit parce que le service est en interne et donc pas accessible depuis internet, ou alors c'est du mail ou autre… (dans mon cas)).

Yet another script to manage Let's Encrypt...

Après acme-tiny, voici letsencrypt.sh, l'avantage de celui-ci est qu'il est ultra modulaire! Il supporte les challenges par http (classique), mais aussi par DNS (ajout d'un enregistrement txt dans la zone correspondante, voir la doc pour plus d'infos).

Donc nous disions, le truc cool c'est qu'il fonctionne via des hooks, et ils sont nombreux!. Lorraine Data Network n'a pas encore de DNS contrôlé via une API, il faut donc faire un hook spécifique (en mode old-school via puppet/git :-D)

Cas concret avec l'infra de Lorraine Data Network

./letsencrypt.sh -c -t dns-01 -d webmail.ldn-fai.net -d bender.ldn-fai.net -k ./hooks/ldn.sh

Le hook en question, ce petit bout de bash fait donc:

  • Mise à jour du dépot puppet LDN local
  • Ajout de l'enregistrement TXT correspondant au domaine à certifier
  • Mise à jour du serial de la zone
  • Commit et push, puis lancement de puppet
  • Attente d'une validation / certificat de la part de letsencrypt
  • Nettoyage du TXT

Tout cela pour montrer que c'est assez trivial de tout automatiser avec ce système de hooks.

by Sebastien Badia at July 08, 2016 04:00 PM