Archives pour la catégorie ‘Réalisations’

Roundcubemail : plugin rc-vacation 0.4

La version 0.4 du plugin rc-vacation est disponible. Au programme, l’inclusion d’un driver pour maildrop. Niveau interface, il est possible de configurer une date d’activation et d’expiration du message d’absence.  L’installation du plugin jquery-ui est d’ailleurs conseillée afin de bénéficier des sélecteurs de date jQuery. Plusieurs adresses de redirection sont acceptées. Suite aux nombreuses demandes, des exemples de configuration sont fournis, notamment les schémas SQL.

Dépôt Git : http://github.com/bhuisgen/rc-vacation
Tarball : rc-vacation-0.4.tar.gz

nginx-etag-module : module de gestion des etags pour Nginx

Le protocole HTTP définit un mécanisme de cache par validation des ressources Web : les Entity Tags. Son intérêt est d’autoriser les requêtes conditionnelles afin d’optimiser la gestion de la bande passante des clients et des serveurs Web. Ainsi, à chaque requête, le serveur calcule et ajoute un Etag, matérialisé par un identifiant unique associé à la ressource et à sa version.

En pratique, la première requête envoie le statut HTTP 200 – OK et l’etag calculé par le serveur. Si le client demande à nouveau la ressource et s’il soumet en information l’etag précédent, le serveur est capable de déterminer sa validité. Si les etags matchent, la ressource est à jour côté client et le serveur renvoie un statut HTTP 304 – Content Not Modified sans les données. Les Etags sont donc un moyen simple et fiable de gestion cache des ressources.

Je vais vous présenter le module que j’ai développé pour effectuer ce job sous Nginx : ngx-http-etag-module. Le calcul de l’etag est indépendant du filesystem afin de permettre une utilisation en cluster. A cela, j’y ai couplé une option permettant de forcer le calcul sur un fichier précis, quelque soit la ressource statique demandée. C’est cette raison qui m’a incité à développer ce module, car elle me permet de conserver le cache des proxys frontaux suite à une mise à jour des fichiers. Seul un touch sur le fichier permet d’invalider l’ensemble du cache et propager les modifications.

Installation

$ git clone git://github.com/bhuisgen/nginx-etag-module.git ./nginx-etag-module
Initialized empty Git repository in /private/tmp/nginx-etag-module/.git/
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 21 (delta 6), reused 0 (delta 0)
Receiving objects: 100% (21/21), 4.62 KiB, done.
Resolving deltas: 100% (6/6), done.
$ cd nginx-etag-module/

Le code de Nginx doit également être récupéré, compilation statique oblige :

$ wget http://nginx.org/download/nginx-0.7.67.tar.gz
--2010-09-03 20:35:46--  http://nginx.org/download/nginx-0.7.67.tar.gz
Résolution de nginx.org (nginx.org)... 81.19.68.137
Connexion vers nginx.org (nginx.org)|81.19.68.137|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 608462 (594K) [application/octet-stream]
Sauvegarde en : «nginx-0.7.67.tar.gz»
100%[===================================================================
=======================>] 608.462     64,9K/s   ds 8,5s
2010-09-03 20:35:54 (70,0 KB/s) - «nginx-0.7.67.tar.gz» sauvegardé [608462/608462]
$ tar xzf nginx-0.7.67.tar.gz
$ cd nginx-0.7.67
$ ./configure --add-module=../

Le script configure doit détecter la présence du module :

adding module in ../
 + ngx_http_etag_module was configured

Comme d’habitude, compilation puis installation :

$ make
$ sudo make install

Configuration

Pour activer la prise en charge des etags :

server {
   listen       8000;
   server_name  localhost;
   root /usr/local/www/html;
   index index.php;

   location / {
      etag on;
   }
   location ~ \.php$ {
      include        fragments/php.conf;
   }
}

Pour rediriger le calcul des etags sur un unique fichier :

server {
   listen       8000;
   server_name  localhost;
   root /usr/local/www/html;
   index index.php;

   location / {
      etag on;
      etag_file /opt/local/var/www/etag_file
   }
   location ~ \.php$ {
      include        fragments/php.conf;
   }
}

Exemple :

Roundcube : plugin vacation 0.3.2

Quelques corrections mineures ont été apportées. Merci à Achim J.Latz et Zanda pour leurs rapports.

Plugin : rc-vacation-0.3.2.tar.gz
Dépôt Git : http://github.com/bhuisgen/rc-vacation

eZ Publish : traduction des fichiers PHP UTF-8

Ayant participé à la migration ezPublish 4 d’un site bancaire luxembourgeois au cours de l’année précédente, mon collègue m’avait reporté un problème concernant l’outil de traduction ezlupdate chargé d’extraire les chaînes à internationaliser. L’outil fourni par eZ à cette époque n’acceptait pas l’extraction de chaînes depuis des fichiers PHP au format UTF-8, alors qu’il le supportait  au niveau des templates.

J’ai donc dû modifier les sources de la version Qt 3 et générer un nouveau parseur. L’outil a rempli son rôle et je vous en fait part : ezlupdate-source-hb-20090217.tar.gz

Pour compiler les sources :

cd /<ezroot>/support
tar czf ezlupdate-source-hb-20090217.tar.gz
cd ezlupdate-HB
qmake ezlupdate.pro
make

N’oubliez pas d’installer Qt 3 et ses outils de développement pour la commande qmake. Pour l’utiliser, il faut ajouter l’option –utf8 pour pouvoir créer le fichier de traduction :

/bin/linux/ezlupdate -e extension/test/ -no eng-GB --utf8

Note : la nouvelle version d’ezlupdate basée sur Qt 4 semble à présent gérer les scripts PHP UTF-8 – quasiment un an après – mais il subsiste des problèmes avec les traductions commentées et les traductions dans les javascripts.

Roundcube : plugin vacation disponible sur github

Je viens d’ouvrir un dépôt git public sur github pour mon plugin vacation RoundCube. C’est par ici : http://github.com/bhuisgen/rc-vacation/.

Pour cloner le dépôt, lancez la commande suivante :

$ git clone git://github.com/bhuisgen/rc-vacation.git

Roundcube : plugin vacation 0.3.1

Cette version 0.3.1 fixe une erreur liée aux options de configuration LDAP.

plugin-vacation-0.3.1.tar.gz

Roundcube : plugin de gestion des vacations

Voici la nouvelle version de mon plugin de gestion des répondeurs pour RoundCube version 0.3. Elle s’appuie à présent sur l’API plugin de RoundCube, ce qui permet une installation en moins de cinq minutes. Au niveau des nouveautés, les drivers de stockage permettent une configuration sur mesure. Sont fournis le driver SQL et le driver LDAP qui couvrent entre autres l’utilisation de PostfixAdmin et Gnarwl. Si cela ne suffit pas, à vous de coder votre driver !

plugin_vacation

plugin-vacation-0.3-20091008.tar.gz

ChangeLog :
- support de l’API plugin RC.
- driver de stockage : SQL, LDAP.
- support des messages au format HTML.

hbIRCS : version 0.2.0-UNSTABLE-20090726

Comme je l’avais évoqué dans un billet précédent, le nouveau build de développement d’hbIRCS intègre une fonctionnalité majeure : le support des connexions sécurisées SSL/TLS. Le reste du travail a porté sur la réécriture du code existant avec comme objectif l’optimisation du temps d’exécution des cycles lecture/écriture, des algorithmes de parsing et un allocation optimisées des buffers.

hbIRCS-0.2.0-UNSTABLE-20090726
- support des connexions sécurisées SSL/TLS.
- optimisation de la gestion des buffers : allocation par pool, support des vues et des buffers systèmes.
- optimisation des algorithmes I/O : cycles de lecture/décodage/process et encodage/écriture.
- optimisation d’exécution des tâches planifiées.
- tuning des paramètres Listener, Connection, SSLEngine, AcceptExecutor/ReadExecutor & ThreadPool.
- fix bug commandes RESTART & DIE.
- fix bug socket bind.

Voici l’ensemble des options de configuration d’un écouteur réseau  :

<Listener>
   ListenAddress ::1
   ListenPort 9999
   ListenBackLog 128

   MaxConnections 256
   ACL local_client

   <Connection>
      UseSSLEngine true
      <SSLEngine>
         KeyStoreFile ./hbircs.keystore
         KeyStorePassword "my$ecret"
      </SSLEngine>
      ReadBufferSize 4096
      WriteBufferSize 4096
      UseDirectBuffers true
      UseBufferFactory true
      WriteRetryAttempts 2
      WriteRetryTimeout 250
   </Connection>

   <AcceptExecutor>
      SelectorTimeout 0
      QueueTaskSize 64
      TaskRecycle true        
      UseThreadPool true
      <ThreadPool>
         MaxTasks 64
         MinThreads 1
         MaxThreads 4
         ThreadIncrement 1
         ThreadPriority 5
         ThreadTimeout 60000
      </ThreadPool>        
   </AcceptExecutor>

   <ReadExecutor>
      Executors 1
      SelectorTimeout 0
      QueueTaskSize 1024
      TaskRecycle true        
      UseThreadPool true
      <ThreadPool>
         MaxTasks -1
         MinThreads 4
         MaxThreads 16
         ThreadIncrement 2
         ThreadPriority 5
         ThreadTimeout 60000
      </ThreadPool>
   </ReadExecutor>
</Listener>

hbIRCS : support des connexions sécurisées SSL/TLS

Après 1 mois de travail laborieux, une javadoc bien trop légère sur le sujet, quasiment aucune aide Google (ce post fut tout de même déterminant), 3 implémentations différentes, pas loin d’une centaine de compilations et des sessions de debug interminables…  c’est fait : les connexions sécurisées SSL/TLS sont supportées par mon serveur IRC.

Évidemment, je n’utilise pas les sockets SSL de Java 1.4 – ce serait trop simple – mais le délicat SSLEngine de Java 5 qui apporte le support TLS/SSL aux sockets NIO, bref du TLS taillé pour des I/O non bloquantes en environnement multithreadé :

the SSLEngine can be used for a wide variety of I/O types, such as non-blocking I/O (polling), selectable non-blocking I/O, Socket and the traditional Input/OutputStreams, local ByteBuffers or byte arrays, future asynchronous I/O models , and so on.

Allez, si tout est stable, le code sera commité en fin de semaine.

[00:25:21]  * Looking up localhost
[00:25:21]  * Connecting to localhost (::1) port 9999...
[00:25:21]  * * Subject: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:21]  * * Issuer: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:21]  * * Subject: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:21]  * * Issuer: /C=FR/ST=Ile-de-France/L=Paris/O=HBIRCS/OU=HBIRCS/CN=localhost
[00:25:22]  * * Certification info:
[00:25:22]  *   Subject:
[00:25:22]  *     C=FR
[00:25:22]  *     ST=Ile-de-France
[00:25:22]  *     L=Paris
[00:25:22]  *     O=HBIRCS
[00:25:22]  *     OU=HBIRCS
[00:25:22]  *     CN=localhost
[00:25:22]  *   Issuer:
[00:25:22]  *     C=FR
[00:25:22]  *     ST=Ile-de-France
[00:25:22]  *     L=Paris
[00:25:22]  *     O=HBIRCS
[00:25:22]  *     OU=HBIRCS
[00:25:22]  *     CN=localhost
[00:25:22]  *   Public key algorithm: rsaEncryption (1024 bits)
[00:25:22]  *   Sign algorithm md5WithRSAEncryption
[00:25:22]  *   Valid since Jun  1 13:10:42 2009 GMT to Aug 30 13:10:42 2009 GMT
[00:25:22]  * * Cipher info:
[00:25:22]  *   Version: TLSv1/SSLv3, cipher DHE-RSA-AES256-SHA (256 bits)
[00:25:22]  * * Verify E: self signed certificate.? (18) -- Ignored
[00:25:22]  * Connected. Now logging in...
[00:25:22]  * Welcome to the hbIRCS IRC Network bhuisgen!bhuisgen@localhost
[00:25:22]  * Your host is irc.bhuisgen.fr, running version 0.2.0-UNSTABLE
[00:25:22]  * This server was created Tue Jun 30 00:24:22 CEST 2009
[00:25:22]  * irc.bhuisgen.fr 0.2.0-UNSTABLE aiwroOs abeiIklmnoOpqrstv
[00:25:22]  * NICKLEN=15 CHANNELLEN=50 TOPICLEN=4096 PREFIX=(ov)@+ CHANTYPES=#&+!
 CHANMODES=abeiIklmnoOpqrstv CASEMAPPING=UTF-8 NETWORK=hbIRCS IRC Network :are supported by this server
[00:25:22]  * There are 1 users and 0 invisible on 1 servers
[00:25:22]  * 0 :operator(s) online
[00:25:22]  * 0 :channels formed
[00:25:22]  * I have 1 clients and 0 servers.
[00:25:22]  * Current local users: 1 Max: 1
[00:25:22]  * Current global users: 1 Max: 1
[00:25:22]  * - irc.bhuisgen.fr Message of the Day -
[00:25:22]  * -
[00:25:22]  * -     _/        _/        _/_/_/  _/_/_/      _/_/_/    _/_/_/
[00:25:22]  * -    _/_/_/    _/_/_/      _/    _/    _/  _/        _/
[00:25:22]  * -   _/    _/  _/    _/    _/    _/_/_/    _/          _/_/
[00:25:22]  * -  _/    _/  _/    _/    _/    _/    _/  _/              _/
[00:25:22]  * - _/    _/  _/_/_/    _/_/_/  _/    _/    _/_/_/  _/_/_/
[00:25:22]  * -
[00:25:22]  * -                 Welcome on hbIRCS IRC server !
[00:25:22]  * End of /MOTD command
[00:25:22]  * Found your IP: [127.0.0.1]
[00:25:22]  * irc.bhuisgen.fr sets mode +w bhuisgen
[00:25:22]  * irc.bhuisgen.fr sets mode +i bhuisgen
[00:25:22]  * irc.bhuisgen.fr sets mode +s bhuisgen
[00:25:37]  * You are now an IRC operator

hbIRCS : version 0.2.0-UNSTABLE-20090523

Un nouveau build de développement pour hbIRCS 0.2, mon serveur IRC Java.

hbIRCS-0.2.0-UNSTABLE-20090523
- support des modes utilisateur et des modes salon (modes standards et avancés, cf RFC 2811).
- support des channels locaux et des safe channels.
- support étendu des commandes IRC client : WHO, WHOIS avec gestion de l’idle.
- paramètre de configuration du charset serveur (par défaut UTF-8).
- paramétrage complet de la gestion I/O (nombre de tâches,  recyclage des tâches, threads mini / maxi / incrément / priorité, gestion des buffers …)
- ajout d’une nouvelle implémentation du pool de threads, basée sur la classe Java ThreadPoolExecutor.

Pour tester ce build, vous pouvez essayer ce serveur : irc.hbis.fr, port 6667, salon #hbircs.

hbircs-20090524_01hbircs-20090524_02

Haut de page