Lubuntu sur iMac G3 & eMac G4

Pour les besoins un ami directeur d’une école primaire, ayant récupéré à droite à gauche des iMac G3 & G4 j’ai fait une installation de lubuntu (version plus Light d’ubuntu)

Préambule : la version lubuntu est plus légère dans sont utilisation mais moins pratique à administrer. (moins d’interface prévue pour les tâches peu courante.. normal c’est plus liégé…) il va donc falloir se familiariser avec le terminal…

Boot sur CD

Il faut bien évidemment préalablement avoir téléchargé & gravé lubuntu PowerPC (ppc) dans sa version 12.04 (car c’est la dernière LTS) : lubuntu-12.04-alternate-powerpc.iso

Insérer le CD et maintenez la touche « C » du clavier appuyé

Pour éjecter le CD lors du démarrage laissé le clique sourie enfoncé

Installation

Je vais passer l’étape d’installation qui doit se faire sans problème en suivant les étapes.

[G3] Graphique

Si jamais, comme moi, sur le G3 l’interface graphique ne se lance pas et que vous vous retrouvez avec le terminal « login:  » connectez-vous et configuré l’interface graphique d’une des façons ci-après (non cumulable) :

Avec internet

Taper la commande ci-dessous pour obtenir une adresse IP :

sudo dhclient -v eth0

Puis taper la commande suivante pour télécharger le fichier de configuration de Xorg (trouvé ici)

sudo wget "http://pastebin.com/raw.php?i=RXFdwC80" -O /etc/X11/xorg.conf

Pour finir taper la commande pour redémarrer l’ordinateur

sudo reboot

Avec une clef USB

Depuis un autre ordinateur, créer un fichier sur une clef USB (formaté en FAT32) qui s’appelle xorg.conf à la racine de votre clef et ajouter lui le contenu qui se trouve à cette adresse : http://pastebin.com/RXFdwC80

Ensuite connecter la clef sur le iMac et taper les commandes suivantes :

sudo mount /dev/sdb1 /mnt/
sudo cp /mnt/xorg.conf /etc/X11/xorg.conf
sudo reboot

 A la main

Éditer le fichier à la main :

sudo nano /etc/X11/xorg.conf

Le contenu du fichier est disponible à cette adresse : http://pastebin.com/RXFdwC80 il ne faut faire aucune faute de frappe, bon courage !

[G3] Réseau

Il est possible que le réseau soit directement détecté dans ce cas ne toucher à rien mais si ce n’est pas le cas deux solutions s’offre à vous (non cumulable)

a) Le rc.local

Ouvrer l’application LXterminal et taper la commande

sudo leafpad /etc/rc.local

Et comme sur l’image ci-dessous ajouter avant le « exit 0 » l’instruction suivante :

dhclient eth0

Puis redémarrer l’ordinateur.

rc.local edit leopad

b) Network-manager

La procédure trouvée consiste à éditer le fichier /etc/network/interfaces avec la commande :

sudo leafpad /etc/network/interfaces

Et d’y supprimer toutes les lignes sauf les 2 lignes suivantes :

auto lo

iface lo inet loopback

Connexion automatique

Pour que l’utilisateur se connecte directement sans mot de passe. La procédure trouvée consiste à éditer le fichier /etc/lightdm/lightdm.conf :

sudo leafpad /etc/lightdm/lightdm.conf

Le contenu doit être le suivant :

[SeatDefaults]

autologin-user=votre_nom_d_utilisateur    (pour nous : bourg)

autologin-user-timeout=0

user-session=Lubuntu

greeter-session=lightdm-gtk-greeter

Ajouter un logiciel

De façon graphique vous avez deux possibilités de le faire :

Ces deux programmes se trouve dans Outils système

Imprimante Rico MP 3350

L’imprimante devrait s’installer facilement car un pilote libre est disponible (ci-après) il faut surtout, si elle n’est pas reconnue dans la recherche automatique, déterminer son adresse IP (souvent il est possible d’imprimer la configuration et l’adresse IP se trouve dans la rubrique « réseau ».

Modifier les menus :

La procédure consiste à installer le logiciel alacarte. Vous pouvez l’appeler par Menu / Préférences / Main Men

Optimisation

Désactiver mise à jour

Je conseils de désactiver les mise à jour automatique et de les faire manuellement de temps en temps.

Pour ce faire rendez-vous dans Outil système / Gestion des mises à jour puis dans Paramètres… / Mise à jour / Vérifier automatiquement les mises à jour : Jamais

lubuntu stop safe-upgrade

Paramètre de session

Désactiver un maximum de choses inutiles dans le démarrage afin d’accélérer la vitesse : Préférences / Paramètres de Session

Décocher tout sauf Réseau & file d’attente

Supprimer superflus

Virer de façon graphique (Outil système / Gestionnaire de paquet synaptic) ou via LXterminal : apt-xapi-index

sudo aptitude remove apt-xapian-index

Conclusion

Le G3 est franchement limité en ressource je pense qu’augmenter la RAM et éventuellement opter pour un disque dur plus rapide ne serait pas un mal. (Il y a plein de HowTo sur internet pour ça juste en tapant par exemple : « upgrade RAM imac g3 » dans votre moteur de recherche préféré – d’ailleurs c’est ce que les gens semble faire…

Le G4 beaucoup moins de problèmes et bien plus performant sans aucun doute, ça peut tourner comme ça même si c’est pas non plus une foudre de guerre.

ISPconfig – service email : DKIM & Amavis

By Nemo (Public Domain CC0)

Edit 13/04/2015 : Ajout d’@mynetworks pour que les réseaux connus soient marqués DKMI.

DKIM (DomainKeys Identified Mail)  est une norme d’authentification par clef publique/privé du nom de domaine de l’expéditeur d’un courrier électronique. Une partie de la signature est comprise dans l’entête du message & une autre dans un enregistrement DNS TXT dédié.

Elle constitue une protection efficace contre le spam et l’hameçonnage. Elle permet aussi surtout (et c’est en ça qu’elle nous intéresse le plus) d’éviter de se faire considérer comme SPAM.

Je parle d’ISPconfig dans mon titre car c’est ce qui motorise mon serveur en ce moment, mais je pense que la procédure fonctionne avec Amavis en règle générale.

Mise en place

Il faut déjà préparer le terrain :

srv:~$ mkdir /etc/amavis/pki
srv:~$ ln -s /etc/amavis/pki /var/lib/amavis/pki

Ensuite on génère la clef :

srv:~$ amavisd-new genrsa /var/lib/amavis/pki/dkmi-mercereau.info-key.pem

Puis il faut créer le fichier /etc/amavis/conf.d/99-dkmi avec la configuration suivante :

$enable_dkim_verification = 1;
$enable_dkim_signing = 1;
dkim_key('mercereau.info', 'default', '/var/lib/amavis/pki/dkmi-mercereau.info-key.pem');
@dkim_signature_options_bysender_maps = (
    { '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } 
);
@mynetworks = qw(0.0.0.0/8 
                127.0.0.0/8     
                123.123.123.123/32  # IP maison 1
                456.456.456.456/32  # IP boulot
);

Ensuite il faut redémarrer le service Amavis :

srv:~$ service amavis restart

Ensuite récupérer la clef DKIM qu’il va falloir insérer dans votre enregistrement DNS avec la commande suivante : :

srv:~$ amavisd-new showkeys
; key#2, domain mercereau.info, /var/lib/amavis/pki/dkmi-mercereau.info-key.pem
default._domainkey.mercereau.info.    3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvF925xN7NeMekLrSMSTtZaSx6"
  "9u6njS+mG99DcM1kqj+9RW79KsdKxNXlMull3Mcp6KwKHV7eb8bSvx2TeJ0YUxuA"
  "hZK0dc971R+F6Xmq4fYW02PeuF1fiyl2oL/rxojGT20anxEc9hzFR8jaCFv4CXhh"
  "1efU2BxngTD/onYQVQIDAQAB")

Il faut donc créer un enregistrement DNS comme tel :

default._domainkey 18000 TXT « v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
[..]
QVQIDAQAB »

Vérification

Après propagation DNS (que vous pouvez vérifier avec l’outil Dig), vous pouvez lancer la commande :

srv:~$ amavisd-new testkeys
TESTING#2: default._domainkey.mercereau.info => pass

Pour être vraiment certain que votre message est signé vous pouvez vous envoyer un email sur une adresse externe et vérifier les entêtes. Sinon vous pouvez envoyer un email à : check-auth [arobase] verifier.port25.com et vous reverser un rapport complet sur « l’état de votre port 25 »

==========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham

[…]
———————————————————-
SpamAssassin check details:
———————————————————-
SpamAssassin v3.3.1 (2010-03-16)

Result: ham (-2.0 points, 5.0 required)

La partie importante pour nous est donc le DKIM check qui doit être à « pass ». D’autre part je ne peux que vous conseiller d’ajouter aussi un enregistrement SPF.

Le rapport m’indique que j’ai un SpamAssassin score de -2 ce qui est très bon car la configuration par défaut de SpamAssassin annonce les messages en SPAM lorsqu’il dépasse un score de +5.

Ressources :

ImapSpamScan.pl – Anti-spam IMAP distant / déporté

imapSpamScan.pl - scriptPour des besoins personnels j’ai codé un petit script en Perl (toujours sous licence beerware) afin de pouvoir scanner un répertoire IMAP avec la puissance de SpamAssassin à distance. ça s’avère très pratique :

  • Quand on ne maîtrise pas le serveur de messagerie ;
  • Qu’il n’y a pas d’anti-spam (ou un anti-spam tout pourrit) ;
  • Que votre serveur est trop « petit » (en terme de ressource) pour accueillir un SpamAssassin ;

Des solutions anti-spam déporté existait ici ou et même mais elle ne me satisferaient pas pleinement.. Du coup j’ai pris mes petits doigts et c’est partie…

Commentaire

Petit commentaire sur le code (visible dans ma bébé forge) :

  1. Je n’ai pas trouvé mieux que la base sqlite pour dire « hey toi je t’ai déjà scanner je passe mon chemin » Ma première idée était de créer un flags IMAP personnalisé (genre « SpamChecked ») d’après ce que j’ai lu ça n’est pas permis dans le protocole IMAP standard… c’est moche…
  2. (Une amélioration à penser) Il faudrait pouvoir stocker le mot de passe en crypté.. le hic est qu’il faut que ça soit réversible pour le servir au serveur IMAP (?) là si quelqu’un à des idées je suis preneur…

Utilisation

Installer les lib perl dépendante :

Sous Ubuntu/Debian :

$ aptitude install libmail-imapclient-perl libmail-spamassassin-perl  libdbi-perl libdbd-sqlite3-perl

Sinon pour les perl compilé ou autres systèmes :

$ cpan -i Mail::SpamAssassin Mail::IMAPClient DBI

Télécharger  :

$ git clone https://forge.zici.fr/source/vrac.git
$ mkdir /opt/imapSpamScan
$ cp vrac/imapSpamScan.pl /opt/imapSpamScan
$ chmod +x imapSpamScan/imapSpamScan.pl

La commande à mettre au lancement de votre poste (dans /etc/xdg/autostart.. ou /etc/rc.local ou .bashrc ou … ou …)

$ /opt/imapSpamScan/imapSpamScan.pl --daemon --imapsrv=serveur.a.scanner.fr --imapuser=brad --imappassword=pitt --db=~/.config/imapSpamScan.db

LA Licence Beerware

beerwareUne belle licence qui invite à la rencontre, au partage et pourtant si méconnu…

Au départ de l’écriture de ce billet, je voulais  fustiger les postes sur des forums / blogs dans ce style :

J’ai fait un super script qui permet d’être gentil avec son système, j’en profite pour vous le partager :

#!/bin/bash
# Copyright MOI MOI <MOI@MOI.MOI>. This program is free software;
# you can redistribute it and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2 of the License,
# or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# Please take a look at http://www.gnu.org/licenses/gpl.html
if ! [ -z "$1" ]
then
    ionice -c3 -p$1 ; renice -n 19 -p $1
else
    ionice -c3 -p$$ ; renice -n 19 -p $$
fi

Pourquoi ?  Parce que quand je vois 3 lignes de code dans un forum et que je vois une licence :

  • Copyright : ça me déprime;
  • Copyleft : ça me chiffonne ;

J’ai envie de savoir s’il est vraiment pertinent de mettre sous licence pour 3 lignes de codes ? (je pense que non)

A l’arrivée : je viens de passer ce blog d’une licence Créative Commons By à une licence Beerware…  je ne vais pas vous faire un dessin sur le cheminement qui mis a conduit… c’est probablement l’aboutissement de {m|l}a démarche libriste…

Ce que dit la licence :

La licence dit :

/*
 * --------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <phk@FreeBSD.ORG> wrote this file. As long as you retain this 
 * notice you can do whatever you want with this stuff. If we meet 
 * some day, and you think this stuff is worth it, you can buy me
 * a beer in return Poul-Henning Kamp
 * ---------------------------------------------------------------
 */

Traduction en français (sources) :

/*
 * ----------------------------------------------------------------
 * « LICENCE BEERWARE » (Révision 42):
 * <phk@FreeBSD.ORG> a créé ce fichier. Tant que vous conservez cet 
 * avertissement,vous pouvez faire ce que vous voulez de ce truc. 
 * Si on se rencontre un jour et que vous pensez que ce truc vaut le 
 * coup, vous pouvez me payer une bière en retour. Poul-Henning Kamp
 * -----------------------------------------------------------------
 */

Donc, comme le dit la licence, si le contenu de ce blog vous plaît et qu’on ce croise offrez-moi une bière « en retour ».

pongSmtp.pl – Tester le bon fonctionnement de votre serveur mail

J’ai mis en place un bébé service pour tester du bon fonctionnement d’un serveur SMTP. En gros vous envoyer un email à ping [arobase] zici [point] fr (en l’occurrence) et vous recevrez en retour un email « pong » avec les entêtes du message reçu par le serveur.

Le mettre en place à la maison

Pré-requis : Perl & un serveur smtp configuré (pour moi c’est Postfix)

Ensuite 4 commandes et c’est réglé :

$ mkdir /opt/pongsmtp
$ git clone http://forge.zici.fr/source/vrac.git
$ cd vrac
$ # Sinon le code est ici : https://forge.zici.fr/source/vrac/browse/master/pongSmtp.pl
$ cp pongSmtp.pl /opt/pongsmtp
$ echo "ping: \"| perl /opt/pongsmtp/pongSmtp.pl\"" >> /etc/aliases
$ newaliases

Note : Si vous mettez en place ce script n’hésitez pas à m’en faire part. Une petite liste de « ping@dom1.com, ping@dom2.com…. » peut être intéressante…

Rien de plus à ajouter… si vous voyez des améliorations n’hésite pas !

Linutop 3 – Adaptateur alimentation disque 2,5 pouces

Un beau jour (ou peut être une nuit…) le boîtier de mon disque dur externe 2.5 décéda. C’est moche mais le principal, c’est que mon disque dur externe lui, ne l’est pas. Cela fait maintenant 2 ans et demie que je possède un Linutop 3 (dont je suis très content), je me suis justement rappelé qu’il y avait des ports SATA et donc la possibilité d’y connecter un disque dur.

J’ouvre donc la bête et là que ne fut pas ma stupeur : effectivement il y avait un connecteur SATA mais pas de câble d’alimentation SATA standard. Je regarde sur la boutique de linutop, ça ne semble pas être standard… Je me dit « bon 30€ l’adaptateur… je les aime bien chez linutop… j’achète ! (même si c’est quand même super cher pour ce que c’est…) » je me lance dans la commande et là : +15€ de frais de port ça fait un total de 45€…  A ce prix là je peux largement m’acheter un autre boîtier pour disque dur externe.

Borné, j’ouvre de nouveau la bête. Je remarque qu’il y a 2 Berg connector mâles (utilisés pour les disquettes), ce qui semble vaguement ressembler à la photo de l’adaptateur sur la boutique de linutop… Après d’autres recherches , je découvre que l’alimentation d’un disque dur SATA 2.5 pouces se fait en 5V + la masse. Parfait c’est ce qu’offre le connecteur Berg ! (le secret de polichinelle est percé 😮 )

Allez Hop une vielle alimentation de PC qui ne fonctionne plus, je découpe le connecteur Berg ainsi que le connecteur d’alimentation SATA, je fais 2 mini soudures, je branche…et…et…et… ça marche !!!

Conclusion : Linutop c’est bien !

Créer/publier un plugin wordpress simple : « Adblock invite »

Suite à mon article « Incitateur anti-pub« , des demandes ont émergé concernant un plugin WordPress. Très enthousiaste, je l’ai réalisé. Il s’appelle adblock-invite et il est sous licence Beerware. C’est le premier plugin wordpress que je réalise, il est relativement simple et me semble un bon moyen concret de commencer avec WordPress (plus sympa que le « hello world »).

Note : pour ceux qui souhaitent un anti-pub standalone réferez-vous à cet article.

Le but du plugin est simple ; il s’agit d’un Widget avec un champs « titre » (pour le titre du bloc) et un champs « message ». Ce widget ne s’affichera que lorsque le visiteur n’aura pas d’anti-pub.

Créer, tester votre code

Dans le répertoire wp-content/plugins/ nous allons créer arborescence suivante :

$ cd wp-content/plugins/
$ mkdir adblock-invite
$ tree
.
+--- screenshot-1.png
+--- screenshot-2.png
+--- testads
|   +--- banners.js
+--- widget.php
+--- style.css
+--- readme.txt

Détail de l’arborescence :

  • screenshot-*.(png|jpg|jpeg|gif) : Les captures d’écrans du résultat final
  • testads/banners.js : Présent pour simuler une publicité
  • widget.php : Le code PHP d »exécution du script (Détaillé ci-après)
  • style.css : une mini feuille de style simplement destiné à mettre un « display: none » à l’initialisation du widget
  • readme.txt : Très important, pour construire le vôtre, référez vous au readme.txt standard & au readme validator de wordpress

Le fichier widget.php est le cœur du plugin, voici son contenu (A l’heure ou j’écris il est en  0.1)

<?php
/*
Plugin Name: Adblock invite (Yes Adblock)
Plugin URI: http://adblock-invite.zici.fr
Description: Detects if the visitor have AdBlock (or another) plugin/extension installed and if not, gives URL to download it.
Author: David Mercereau
Author URI: http://david.mercereau.info
Version: 0.1
License: Beerware
License URI: http://en.wikipedia.org/wiki/Beerware
*/

// Ajout de code dans le pied de page du thème :

function adblockInviteScriptFooter(){ 
	?>
	<script language="JavaScript" type="text/javascript" src="<?php echo plugins_url('testads/banners.js', __FILE__); ?>"></script>
	<script language="JavaScript" type="text/javascript">
		function widgetAdlblockInviteID(tag) {
                        var regexpParam=/adblock_invite_widget-*/;
                        var tagParam=tag;
                        tagParam = (tagParam === undefined) ? '*' : tagParam;
                        var elementsTable = new Array();
                        for(var i=0 ; i<document.getElementsByTagName(tagParam).length ; i++) {
                                if(document.getElementsByTagName(tagParam)[i].id && document.getElementsByTagName(tagParam)[i].id.match(regexpParam)) {
                                        document.getElementsByTagName(tagParam)[i].style.display='block';
                                }
                        }
		}
		var divAds = document.getElementById("adstest");
		if(divAds) {
			widgetAdlblockInviteID('div');
			widgetAdlblockInviteID('aside');
		}
	</script>
	<?php
} 
add_action('wp_footer', 'adblockInviteScriptFooter'); 

// Ajout d'une feuille de style dans le head (la feuille contenu dans wp-content/plugins/adblock-invite/style.css :

add_action('wp_print_styles', 'addstyle');
function addstyle() {
        wp_enqueue_style('adblock-invite-styles', plugins_url('style.css', __FILE__));
}

// Le code du widget (front et back) :

add_action( 'widgets_init', create_function('', 'return register_widget("adblockInviteWidget");') );
class adblockInviteWidget extends WP_Widget {

	function adblockInviteWidget() {
		$widget_ops = array( 
							'classname' => 'adblock_invite_widget_class', 
							'description' => 'Detects if the visitor have AdBlock (or another) plugin/extension installed and if not, gives URL to download it.' 
							); 
		$this->WP_Widget('adblock_invite_widget', 'Adblock invite', $widget_ops);
	}

	// Formulaire d'administration

	function form($instance) {
		$instance = wp_parse_args( (array) $instance, array( 'title' => 'You do not block ads?', 'message' => '<p>It seems that you don\'t have AdBlock (or another) installed in your browser. I encourage you to install it for free</p> <p><a href="http://adblockplus.org" target="_blank">Download AdBlock</a></p>' ) );
		$title = $instance['title'];
		$message = $instance['message'];
		?>
			<p>
				<label for="<?php echo $this->get_field_id('title'); ?>">Title: </label>
				<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo attribute_escape($title); ?>" />
			</p>
			<p>
				<label for="<?php echo $this->get_field_id('message'); ?>">Message: </label>
				<textarea class="widefat" id="<?php echo $this->get_field_id('message'); ?>" name="<?php echo $this->get_field_name('message'); ?>" cols="30" rows="4"><?php echo attribute_escape($message); ?></textarea>
			</p>
		<?php
	}

	// Enregistrement du contenu

	function update($new_instance, $old_instance) {
		$instance = $old_instance;
		$instance['title'] = $new_instance['title'];
		$instance['message'] = $new_instance['message'];
		return $instance;
	}

	// Affichage du widget en front

	function widget($args, $instance) {
		extract($args);

		echo $before_widget;

		$title = apply_filters( 'widget_title', $instance['title'] );
		$message = empty( $instance['message'] ) ? '&nbsp;' : $instance['message'];

		if ( !empty( $title ) ) { echo $before_title . $title . $after_title; };

		echo $message;

		echo $after_widget;
	}
}

Vous pouvez tester votre plugin en l’activant dans le panel d’administration (Extensions / Extensions installées)

Publier sur WordPress.orgadblock-invite-search

Le saint graal pour un plugin WordPress étant d’être dans l’annuaire afin que l’utilisateur final n’est qu’à faire une recherche via son blog pour pouvoir installer d’un seul clic le dit plugin.

Pour ce faire il faut d’abord créer un compte sur wordpress.org puis proposer votre plugin. Une étape de modération est nécessaire.

Vous allez ensuite recevoir un email avec l’URL de votre plugin dont vous serez administrateur. (pour moi c’est http://wordpress.org/extend/plugins/adblock-invite/) Il vous faut ensuite faire le premier commit afin de rendre la page public. Voici la démarche :

$ # Création d'un répertoire de travail
$ cd ~/Projets
$ mkdir adblock-invite
$ cd adblock-invite/
$ # Récupération de arborescence svn
$ svn co http://plugins.svn.wordpress.org/adblock-invite/ .
$ # Copie et ajout du code
$ cp /var/www/wp-content/plugins/adblock-invite/* trunk/
$ svn add trunk/*
$ # Copie des screenshots pour le site de wordpress
$ cp trunk/screenshot-* assets/
$ svn add assets/*
$ # Commit et envoi 
$ svn ci -m 'Adding first version of my plugin'

Pour en savoir plus sur svn rapporté à WordPress vous pouvez vous rendre sur wordpress.org/extend/plugins/about/svn.
Et voilà c’est terminé vous devriez avoir votre page administrable sur wordpress.org & votre plugin doit être disponible dans l’annuaire.

Les ressources

Les liens qui’ m’ont bien aidé dans ma démarche :

N’hésitez pas à me faire part de point à améliorer dans ce plugin ou dans ce tuto (je l’ai fait à posteriori il est donc possible qu’il manque des étapes)

En continuant à utiliser le site, vous acceptez l’utilisation des cookies (au chocolat) Plus d’informations

Les cookies sont utilisés à des fin de statistique de visite du blog sur une plateforme indépendante que j'héberge moi même. Les statistiques sot faites avec un logiciel libre. Aucune information n'est redistribué à google ou autre. Je suis seul autorisé à lire ces informations

Fermer