Deblan blog

Développement

Domaines de développement - Apache2

Aujourd'hui j'ai eu besoin d'une configuration particulière d'Apache : j'ai décidé que les sous-domaines de deblan.org de type "dev-XXX" devaient être gérés de tel sorte que "XXX" corresponde à un sous-répertoire de dev.deblan.org. Ainsi, dev-01.deblan.org est l'équivalent de dev.deblan.org/01/.

Jusque là, rien de bien méchant sauf que j'ai une contrainte : je souhaite que ce soit automatique (ou le plus possible). Donc je ne souhaite pas ajouter/modifier des Virtualhost, je veux qu'un sous-domaine puisse être supprimé dans me prendre la tête.

La solution est au final simple (mais un peu tordue) :

Etape 1. Créer un fichier de mapping

L'idée est la suivante : comme tout ne sera pas automatique, je m'autorise l'édition d'un seul fichier pour traiter la correspondance d'un nom et de son répertoire de destination (en quelque sorte son DocumentRoot).

Ce fichier sera placé à la racine du compte associé à dev.deblan.org. Sur mon serveur, c'est le chemin suivant :

/services/web/www/dev-xx.deblan.org/vhost.map

Ce fichier contient ces informations :

dev.deblan.org /var/www/service-web/www/dev-xx.deblan.org/public_html/
dev-01.deblan.org /var/www/service-web/www/dev-xx.deblan.org/public_html/01
dev-foo.deblan.org /var/www/service-web/www/dev-xx.deblan.org/public_html/foo

On a donc à gauche le nom de domaine et à droite le répertoire web associé.

A travers une connexion au compte dev.deblan.org (via SSH ou en FTP par exemple), je peux modifier ce fichier.

Etape 2. Création du VirtualHost d'Apache
<VirtualHost *:80>
	# On définit le domaine de base
	ServerName dev.deblan.org
	# On indique les alias de domaine à prendre en compte 
	ServerAlias dev-*.deblan.org

	# La partie la plus importante : les règles qui permettront de traiter ma demande
	RewriteEngine on

	# C'est ici que tout se passe
	RewriteMap lowercase int:tolower
	# On charge le fichier pour le mapping
	RewriteMap vhost txt:/services/web/www/dev-xx.deblan.org/vhost.map
	# On prend le soin de travailler de tout mettre en minuscules (donc attention à la casse !)
	RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
	RewriteCond ${vhost:%1} ^(/.*)$
	# On "simule" le DocumentRoot du domaine
	RewriteRule ^/(.*)$ %1/$1

	[...]
</VirtualHost>
Etape 3. Création d'un script de mise à jour d'Apache

Le fichier de mapping n'est chargé qu'une seule fois et c'est quand on relance ou reload Apache. Il faut donc, à des temps réguliers, vérifier si le fichier de mapping a été modifié et si on doit relancer Apache.

Il existe plusieurs méthodes, moi je vous propose un truc très simple :

(Fichier /root/apache2/reload)

#!/bin/sh

# On indique le fichier de mapping
MAPPING=/services/web/www/dev-xx.deblan.org/vhost.map

# On indique le fichier qui va contenir le retour de "ls -l" sur le fichier de mapping
LS_FILE=/root/apache2/ls

[ -f "$LS_FILE" ] || touch "$LS_FILE"

LS=$(ls -l "$MAPPING")

# Si il y une différence entre le "nouveau" ls et l'ancien ls, alors le fichier à été modifié
# Donc on relance apache et on met à jour $LS_FILE
if [ "$LS" != "$(cat "$LS_FILE")" ]; then
	/usr/sbin/service apache2 reload
	echo "$LS" > "$LS_FILE"
fi

Il ne vous reste plus qu'à placer ça dans un crontab avec par exemple cette ligne de conf :

*/1 * * * * /root/apache2/reload 2>&1 >/dev/null

Ici le script est exécuté toutes les minutes.

Normalement tout devrait fonctionner :)

Si vous avez d'autres solutions, je suis prenneur !


Réécriture du wall de deblan

Le colorisateur syntaxique que je met à disposition des développeurs a été complétement refait. L'interface a radicalement changé et je m'appui encore une fois sur le bootsrap Twitter. J'en ai profité pour rendre l'envoi de code plus simple et plus rapide, et je met à disposition le code suivant pour envoyer et récupérer rapidement tout ça depuis votre application : afficher le code.


CMS Installer, lancement du projet !

CMS Installer est un projet né ce weekend.

L'objectif de ce projet est de faciliter l'installation des CMS en proposant plusieurs choses. D'une part, il est possible de configurer plusieurs versions d'un même CMS. Chaque version d'un système se caractérise par une adresse de téléchargement et au final, plus besoin d'aller chercher soit même son archive sur internet, CMS Installer le fait pour vous ! D'autre part, chacune de ces versions peut se voir attribué un installateur personnalisé, ainsi vous pourrez avoir par défaut des éléments sans devoir le faire manuellement à chaque installation.

Tout est prévu en ligne de commande et CMS Installer sera multi-plateformes (Unix/Linux, Windows).

A l'heure actuelle, seuls Wordpress et Pluxml sont configurés entièrement. Cependant, vous trouverez des configs minimales de Joomla et Drupal. Il est très simple d'ajouter des dépots pour vos CMS favoris et si vous le souhaitez, ajouter votre installateur.

Voici une présentation vidéo de la première version du projet.

(La vidéo est déjà out of date ^^)

Rien n'est encore documenté mais le projet va évoluer très vite. Si vous avez envie de prendre part au projet, contactez-moi. Les sources sont dispos sur un dépot GIT :

$ git clone git://git.deblan.org/cms-installer.git cms-installer

Parcourir les sources en ligne.


Sources du blog

Comme je l'avais indiqué il y a quelques semaines, je souhaite libérer les sources du moteur de ce blog.

La publication de code n'implique pas de ma part un support technique. Je ne suis pas responsable si une faille de sécurité est utilisée à travers mon code.

Pour être honnête avec vous, il n'est pas du tout terminé mais il est fonctionnel. Je n'ai aucune prétention a dévoilant les sources.

Il y a encore des traces de moi dans le code. Je vous invite à faire le tour du module "page" présent dans le répertoire "apps/www/".

Pour télécharger et installer le blog, suivant les instructions suivantes :

1. Configurer votre virtualhost

Configurer votre virtualhost pour que le domaine du blog pointe sur le répertoire "web" présent dans le zip (que vous allez bientôt télécharger)

2. Se place dans le répertoire du site puis :
$ wget https://www.deblan.io/uploads/sources_blog.zip
$ unzip sources_blog.zip
3. Configurer les accès à la base

Il faut éditer le fichier "config/database.yml".

N'utiliser pas des tabulations mais des espaces.
[...]
dsn:        mysql:dbname=NOM_BASE;host=localhost
username:   UTILISATEUR
password:   MOT_DE_PASSE
[...]
4. Lancement de la "procédure" d'installe du blog :
# on vide le cache
$ ./symfony cc
# on crée les tables pour la base de données
$ ./symfony propel:build-all
$ mysql -uUTILISATEUR -p NOM_BASE < data/sql/permissions.sql
# création de l'admin
$ ./symfony guard:create-user admin password
$ ./symfony guard:promote admin
$ ./symfony guard:add-permission admin Rédaction
$ ./symfony guard:add-permission admin Administrer

Le design est cassé (web/css/main.css est vide). Je vous invite à faire le votre.

J'avoue c'est un peu posté à l'arrache mais je n'ai pas spécialement le temps de faire mieux en ce moment :)

Note : on accède au backoffice via /admin.php

Enjoy!


Contrer des robots stupides sans captcha

Ceux qui côtoyaientt mon ancien blog devaient rentrer un captcha pour poster un commentaire.

Le problème c'est que personnellement, ça me gonfle de me cogner une image presque illisible à lire pour un simple message. Seulement il y a toujours et encore nos amis les robots pour casser l'ambiance.

Comment bloquer ces robots sans captcha ?

Pour vous j'ai une astuce simple qui depuis 2 jours a permis de bloquer un peu plus de 300 robots (tout les robots qui ont essayé de poster d'ailleurs).

Cette technique ne fonctionne que pour les robots complétements cons et qui ne sont pas développés spécifiquement !

Étape 1 : créer une page dédiée à la gestion des robots

Vous devez (pouvez) créer une page qui va réceptionner les robots détectés et qui leur laissera un joli message de bienvenue. De mon coté, j'ai aussi décidé d'enregistrer les informations réceptionnées ($_POST, $_GET, $_COOKIE, $_SERVER).

J'ai décidé de rendre accessible cette page avec l'url "/bot"

Étape 2 : préparer les formulaires à sécuriser

Comme je l'ai écrit, c'est simple et pour ce faire, il suffit d'ajouter l'url de la page pour les robots dans l'action du formulaire.

Par exemple, voila ce que vous trouverez dans le code source de ce blog :

<form method="post" id="comment_form" action="/bot?/post/429/Contrer-des-robots-stupides-sans-captcha#comment_form" enctype="multipart/form-data">

Il vaut évidement remarquer le "/bot?" ajouté à la vraie action du formulaire.

Étape 3 : owned le bot

Comme les robots sont cons et qu'ils sont souvent démunis d'un tas d'outils, il suffit d'utiliser l'un d'eux : javascript.

Pour se faire, on va définir que si la personne bouge la souris sur la page, alors elle n'est pas un bot. Par conséquent, il suffit de supprimer "/bot?" de l'action du formulaire :

<script type="text/javascript">
$(document).ready(function() {
	$(document).mousemove(function() {
		var action = $('#comment_form').attr('action').replace(/^\/bot\?/, '');
		$('#comment_form').attr('action', action);
	});
});
</script>

Edit : Une optimisation du code a été proposée par GromNaN et je la préconise. La voici :

<script type="text/javascript">
$(document).ready(function() {
	$(document).one('mousemove', function() {
		var $form = $('#comment_form');
		var action = $form.attr('action').replace(/^\/bot\?/, '');
		$form.attr('action', action);
	});
});
</script>

Rien de plus simple et ça semble très bien fonctionner.

Seul petit bémol : ça implique que les internautes ont le javascript activé.