<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.bonz.org/tech/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>ZenTech - freebsd</title>
  <link>http://www.bonz.org/tech/</link>
  <description>Om Mani Padme Hum</description>
  <language>fr</language>
  <pubDate>Tue, 16 Dec 2008 23:57:46 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Le log qui se voulait plus gros que le boeuf</title>
    <link>http://www.bonz.org/tech/post/2008/02/18/Le-log-qui-se-voulait-plus-gros-que-le-boeuf</link>
    <guid isPermaLink="false">urn:md5:79ce7425673a4818129a484571ec379e</guid>
    <pubDate>Thu, 21 Feb 2008 17:52:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>système</category>
        <category>freebsd</category><category>lighttpd</category><category>lighttpd 1.4</category>    
    <description>&lt;p&gt;C'est généralement au moment où on se retrouve avec une partition pleine que l'oubli de la rotation des logs refait surface. C'est ultra-classique et pourtant... Mais nous allons prendre les devants pour que lighty ne soit pas un mangeur d'espace.&lt;/p&gt;    &lt;p&gt;Sur &lt;a href=&quot;http://www.freebsd.org/&quot;&gt;FreeBSD&lt;/a&gt;, le gestionnaire de rotation de log de base s'appelle &lt;code&gt;newsyslog(8)&lt;/code&gt;, il est configuré par le fichier &lt;code&gt;/etc/newsyslog.conf&lt;/code&gt; (&lt;code&gt;newsyslog.conf(5)&lt;/code&gt;). Je suis habitué à &lt;code&gt;logrotate(8)&lt;/code&gt; et j'aime bien conserver tous mes fichiers de logs d'activité web, je vais donc faire la même chose avec &lt;code&gt;newsyslog(5)&lt;/code&gt;. Je souhaite donc faire tourner mes logs tous les jours à minuit, compresser les logs passés et les conserver &lt;em&gt;ad vitam eternam&lt;/em&gt;. Ces contraintes donnent l'entrée suivante dans le fichier de configuration&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# lighttpd rotates
/var/log/lighttpd/lighttpd.access.log   www:www   640  366 *   @T00   JC
&lt;/pre&gt;

&lt;p&gt;il faut spécifier un champ de gestion d'appartenance (propriétaire et groupe), lighttpd écrit les logs avec les droits www:www et ils seront déplacés en changeant le propriétaire en root:www.Les fichiers seront créés avec les droits &lt;code&gt;640&lt;/code&gt;, le champ suivant spécifie que les fichiers sont sauvegardés 366 fois avant d'éliminer les fichiers les plus anciens (1 an). Les 2 champs suivant provoquent une rotation à minuit tous les jours. Le dernier champ précise qu'on compresse les archive de log en bzip2 et que le fichier est créé si il n'existe pas.&lt;br /&gt;
Le champ 'count' n'est pas exhaustivement décrit dans la page de man, et j'espérais pouvoir utiliser une valeur qui me permettrait d'avoir un nombre infini de fichiers de logs. La lecture du &lt;a href=&quot;http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.sbin/newsyslog/newsyslog.c?rev=1.108&quot;&gt;code source&lt;/a&gt; m'a confirmé que je ne pouvais pas utiliser le même type de fonctionnement que pour &lt;code&gt;logrotate(8)&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Une entrée doit être créée pour chaque fichier de log de chaque vhost.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Un blog bien sous tout rapport</title>
    <link>http://www.bonz.org/tech/post/2008/02/14/Un-blog-bien-sous-tout-rapport</link>
    <guid isPermaLink="false">urn:md5:0389153de5dab650769cc255f2f8d6cb</guid>
    <pubDate>Thu, 14 Feb 2008 16:39:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>système</category>
        <category>dotclear 2</category><category>freebsd</category><category>lighttpd</category><category>lighttpd 1.4</category>    
    <description>&lt;p&gt;Ce blog est un &lt;a href=&quot;http://dev.dotclear.net/2.0/&quot;&gt;dotclear 2&lt;/a&gt; installé sur un système &lt;a href=&quot;http://www.freebsd.org/&quot;&gt;FreeBSD&lt;/a&gt; et servi par un &lt;a href=&quot;http://www.lighttpd.net/&quot;&gt;lighty&lt;/a&gt;. J'ai choisi dotclear pour la possibilité de gérer de multiples blogs à partir d'un seul code, &lt;a href=&quot;http://www.wordpress.com/&quot;&gt;wordpress&lt;/a&gt; ne donnait pas cette possibilité simplement au moment de mon choix. Mon premier déploiement n'a pas été fait dans les règles FreeBSD, il est temps de remédier à cet insupportable état de fait.&lt;/p&gt;    &lt;p&gt;Les applications web sont déployées dans &lt;code&gt;/usr/local/www&lt;/code&gt; sous FreeBSD, le contenu des sites se trouve dans &lt;code&gt;/usr/local/www/data&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;
# cd /usr/local/www
# tar zxvf ~/src/dotclear-2.0-beta7.tar.gz
# mv dotclear dotclear2
&lt;/pre&gt;

&lt;p&gt;Le renommage du répertoire permet d'éviter un conflit dans l'éventualité de l'installation d'un dotclear 1.&lt;/p&gt;


&lt;p&gt;Une fois le blog installé, il faut le &lt;a href=&quot;http://doc.dotclear.net/2.0/admin/install&quot;&gt;configurer&lt;/a&gt;. La configuration de lighty est très simple, il suffit d'ajouter l'alias suivant pour un blog qui est atteint par http://www.bon.org/blog par exemple&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
alias.url += (
        &amp;quot;/blog&amp;quot; =&amp;gt; &amp;quot;/usr/local/www/dotclear2&amp;quot;
)
&lt;/pre&gt;

&lt;p&gt;La suite de la configuration a déjà été abordée dans un autre &lt;a href=&quot;http://www.bonz.org/tech/post/2007/11/07/Et-si-je-racontais-ma-vie-avec-lighttpd&quot;&gt;billet&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Finalement la modification est assez mineure et revient uniquement à modifier le chemin d'alias pour tous les blogs hormis celui par défaut et ajouter un alias pour celui-ci.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>ALETER Out of memory</title>
    <link>http://www.bonz.org/tech/post/2008/02/13/ALETER-Out-of-memory</link>
    <guid isPermaLink="false">urn:md5:9804e411ea169baee893505ddeed88e0</guid>
    <pubDate>Wed, 13 Feb 2008 18:29:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>système</category>
        <category>dotclear 2</category><category>freebsd</category><category>mysql5</category>    
    <description>&lt;p&gt;Si comme &lt;a href=&quot;http://fr.wikipedia.org/wiki/Le_Monde_de_Nemo&quot;&gt;Doris&lt;/a&gt; vous avez de petits problèmes de mémoire avec &lt;a href=&quot;http://dev.dotclear.net/2.0/&quot;&gt;dotclear 2&lt;/a&gt; (dc2 beta7) lors du chargement de la page d'administration des utilisateurs, le problème vient probablement de MySQL.&lt;/p&gt;    &lt;p&gt;Je me retrouve actuellement devant l'erreur suivante lorsque j'essaie d'administrer mes utilisateurs via l'interface d'administration&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;Out of memory; restart server and try again (needed 65528 bytes) (1037)
&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://www.bonz.org/tech/public/tech/out_of_memory_dc2.png&quot; alt=&quot;Out of memory&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;
Le problème me semble venir du serveur MySQL, une petite recherche &lt;a href=&quot;http://www.google.com/search?q=Out+of+memory%3B+restart+server+and+try+again&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:en-US:official&amp;amp;client=firefox-a&quot;&gt;google&lt;/a&gt; me conforte dans cette idée, je mets donc un peu de code de debug dans &lt;code&gt;admin/users.php&lt;/code&gt; et je me retrouve avec cette requête SQL dantesque  générée par la fonction &lt;code&gt;getUsers()&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;SELECT U.user_id,user_super,user_status,user_pwd,user_name,user_firstname,user_displayname,user_email,user_url,user_desc, user_lang,user_tz, user_post_status,user_options, count(P.post_id) AS nb_post FROM dc_user U LEFT JOIN dc_post P ON U.user_id = P.user_id WHERE NULL IS NULL GROUP BY U.user_id,user_super,user_status,user_pwd,user_name,user_firstname,user_displayname,user_email,user_url,user_desc, user_lang,user_tz,user_post_status,user_options ORDER BY U.user_id ASC  LIMIT 30 OFFSET 0;
&lt;/pre&gt;

&lt;p&gt;Je comprends bien pourquoi mon petit serveur râle, devant l'adversité je me plie et je reconfigure mon serveur dans &lt;code&gt;/var/db/mysql/my.cnf&lt;/code&gt; en modifiant une seule ligne&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;sort_buffer_size = 128K
&lt;/pre&gt;

&lt;p&gt;Après un redémarrage du serveur MySQL, tout rentre dans l'ordre et everybody is content.
&lt;img src=&quot;http://www.bonz.org/tech/public/tech/users_dc2.png&quot; alt=&quot;Utilisateurs&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>HAL&gt; Affirmative, Dave, I read you.</title>
    <link>http://www.bonz.org/tech/post/2008/01/10/HAL-Affirmative-Dave-I-read-you</link>
    <guid isPermaLink="false">urn:md5:1b24cb50e2d7f4d973321a63fd0da31d</guid>
    <pubDate>Fri, 11 Jan 2008 17:39:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>code</category>
        <category>freebsd</category><category>irc</category><category>linux</category><category>python</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://www.bonz.org/tech/public/tech/Hal-9000.jpg&quot; alt=&quot;HAL&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt; Ah la vacuité d'une session &lt;a href=&quot;http://www.faqs.org/rfcs/rfc1459.html&quot; hreflang=&quot;en&quot;&gt;IRC&lt;/a&gt; sur un canal dirigé par un automate. Quoi de plus extraordinaire que pouvoir connaitre la météo de &lt;a href=&quot;http://www.mairie-felletin.fr/&quot; hreflang=&quot;fr&quot;&gt;Felletin dans la Creuse&lt;/a&gt; ou d'avoir une &lt;a href=&quot;http://eggnet.warpzone.org/moduledesc.php?module=9&quot; hreflang=&quot;en&quot;&gt;blague carambar&lt;/a&gt; à la demande. En ce moment je fais beaucoup de python, donc je me suis penché sur le problème pour un &lt;a href=&quot;http://www.binaries.fr/blog/&quot; hreflang=&quot;fr&quot;&gt;ami&lt;/a&gt;. Je vais essayer de vous exposer les clés de l'utilisation d'&lt;code&gt;&lt;a href=&quot;http://python-irclib.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;irclib&lt;/a&gt;&lt;/code&gt; pour construire un automate irc simple.&lt;/p&gt;    &lt;p&gt;L'automate est présenté ci-après, ses fonctions sont simplement la connexion à un serveur irc local sur le port 6667 et l'entrée dans le canal #test. L'automate s'attend à lire des commandes préfixées de '&lt;code&gt;!&lt;/code&gt;' dans le canal. La commande &lt;code&gt;!cycle&lt;/code&gt; demande à l'automate de partir et revenir sur le canal, la commande &lt;code&gt;!die&lt;/code&gt; provoque la déconnexion du serveur puis l'arrêt de l'automate. Le script de l'automate ci-après se trouve en téléchargement &lt;a href=&quot;http://www.bonz.org/files/mybot.py&quot;&gt;ici&lt;/a&gt; et peut être lancé par la commande &lt;code&gt;python mybot.py&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;
import sys
try:
    from ircbot import SingleServerIRCBot
    import irclib
except ImportError, e:
    print e
    sys.exit(1)

class pybot(SingleServerIRCBot):
    def __init__(self, server, nick, realname, chan):
        SingleServerIRCBot.__init__(self, server, nick, realname)
        self.chan = chan
        self.nick = nick

    ## Event callbacks
    def on_welcome(self, c, e):
        if self.chan:
            c.join(self.chan)

    def on_join(self, c, e):
        who = e.source().split('!', 1)
        if who[0] == self.nick:
            c.privmsg(e.target(), 'Hello world!')

    def on_pubmsg(self, c, e):
        msg = e.arguments()[0].strip()
        if msg.startswith('!'):
            cmd = msg[1:].split(' ', 1)[0]
            self.trigger(c, e, cmd)

    ## Command triggers
    def trigger(self, c, e, cmd):
        try:
            getattr(self, 'cmd_%s' % cmd)(c, e)
        except AttributeError:
            pass

    def cmd_cycle(self, c, e):
        chan = e.target()
        c.part(chan, 'cycle')
        c.join(chan)

    def cmd_die(self, c, e):
        SingleServerIRCBot.die(self, 'Argh')

## Here comes the real script
if __name__ == '__main__':
    server = [('localhost', 6667)]
    nick = 'monbot'
    realname = 'monbot'
    channel = '#test'

    bot = pybot(server, nick, realname, channel)
    try:
        bot.start()
    except KeyboardInterrupt:
        bot.connection.disconnect(&amp;quot;Ctrl-C m'a tuer&amp;quot;)
        bot.connection.close()
&lt;/pre&gt;


&lt;p&gt;La librairie &lt;code&gt;irclib&lt;/code&gt; est basée sur la gestion d'évènements, des méthodes vont être lancées sur apparition d'un évènement au sens IRC. Les méthodes de l'objet &lt;code&gt;pybot&lt;/code&gt; commençant par '&lt;code&gt;on_&lt;/code&gt;' sont les méthodes de gestion d'évènements, par exemple lorsqu'un message est envoyé sur un canal (&lt;code&gt;PUBMSG&lt;/code&gt;) la méthode on_pubsmg() est appelée. La création de l'automate se base sur la surcharge des méthodes de gestion d'évènements. Ces méthodes ont toutes la même définition d'appel&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
def on_foo(self, c, e):
    [...]
&lt;/pre&gt;

&lt;p&gt;La variable &lt;code&gt;c&lt;/code&gt; est un objet &lt;code&gt;ServerConnection&lt;/code&gt;, cet objet permet de manipuler tout ce qui concerne le serveur irc d'où provient l'évènement. On peut par exemple rejoindre un canal (&lt;code&gt;c.join()&lt;/code&gt;) ou envoyer un message à un canal ou une personne (commande &lt;code&gt;PRIVMSG&lt;/code&gt; via &lt;code&gt;c.privmsg()&lt;/code&gt;). La variable &lt;code&gt;e&lt;/code&gt; est un objet &lt;code&gt;Event&lt;/code&gt;, elle permet d'obtenir toutes les informations sur l'évènement qui a provoqué l'appel de la méthode. L'origine de l'évènement (&lt;code&gt;e.source()&lt;/code&gt;), la destination de cet évènement (&lt;code&gt;e.target()&lt;/code&gt;) ou encore les arguments de cet évènement (&lt;code&gt;e.arguments()&lt;/code&gt;). Toutes les informations sur ces 2 méthodes se trouvent dans le module irclib (&lt;code&gt;pydoc irclib&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;A partir de la connaissance de ces éléments de base, la construction d'un automate devient assez simple. Si l'automate doit effectuer des tâches régulières, les méthodes &lt;code&gt;execute_at()&lt;/code&gt; et &lt;code&gt;execute_delayed()&lt;/code&gt; (héritage de l'objet IRC parent de SingleServerIRCBot) peuvent être utilisées. Plus d'information sur &lt;code&gt;irclib&lt;/code&gt; devrait se trouver sur mon &lt;a href=&quot;http://wiki.bonz.org/python/irclib&quot; hreflang=&quot;fr&quot;&gt;wiki&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il est également possible d'utiliser &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.words.protocols.irc.html&quot; hreflang=&quot;en&quot;&gt;twisted.words&lt;/a&gt; pour effectuer la même chose mais ça me semble une librairie un peu imposante pour un simple automate.&lt;/p&gt;


&lt;p&gt;Il faut noter qu'on peut faire également le même genre de chose en &lt;a href=&quot;http://search.cpan.org/~bingos/POE-Component-IRC-5.48/lib/POE/Component/IRC.pm&quot; hreflang=&quot;en&quot;&gt;Perl&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>WOPR&gt; Global Thermonuclear War</title>
    <link>http://www.bonz.org/tech/post/2008/01/03/WOPR-Global-Thermonuclear-War</link>
    <guid isPermaLink="false">urn:md5:e11fe7ac496ab81a907768d677602a9c</guid>
    <pubDate>Thu, 03 Jan 2008 18:33:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>code</category>
        <category>freebsd</category><category>linux</category><category>python</category>    
    <description>&lt;p&gt;Dans mon parcours d'initiation à python, je me suis retrouvé face à un problème existentiel (ce qui donne tout le caractère initiatique au parcours, le problème, parce qu'il est existentiel ... laisse tomber). Lors de l'utilisation du module &lt;a href=&quot;http://docs.python.org/lib/module-cmd.html&quot; hreflang=&quot;en&quot;&gt;cmd&lt;/a&gt;, comment gérer correctement les interruptions classiques que sont &lt;code&gt;ctrl+D&lt;/code&gt; (&lt;code&gt;EOF&lt;/code&gt;) et &lt;code&gt;ctrl-C&lt;/code&gt; (&lt;code&gt;SIGINT&lt;/code&gt;).&lt;/p&gt;    &lt;p&gt;Ci-après, un squelette pour la gestion des 2 signaux évoqués. Juste après ci-après, les quelques explications qui s'imposent.&lt;/p&gt;
&lt;pre&gt;
import sys
import cmd

class shell(cmd.Cmd):
    def __init__(self):
        cmd.Cmd.__init__(self)

    # Let's handle ctrl+D signals and quit gently
    def do_EOF(self, str):
        # CLEAN HERE
        return 1

if __name__ == &amp;quot;__main__&amp;quot;:
    console = shell()
    try:
        console.cmdloop()
    except KeyboardInterrupt:
        # CLEAN HERE
        sys.exit(0)
&lt;/pre&gt;


&lt;h2&gt;&lt;code&gt;ctrl-D&lt;/code&gt; ou la fin du monde&lt;/h2&gt;

&lt;p&gt;Le manuel de &lt;a href=&quot;http://docs.python.org/lib/Cmd-objects.html#l2h-4880&quot; hreflang=&quot;en&quot;&gt;cmd&lt;/a&gt; nous dit&amp;nbsp;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;An end-of-file on input is passed back as the string 'EOF'.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ce qui signifie que la combinaison de touches &lt;code&gt;ctrl+D&lt;/code&gt; revient à gérer la commande &lt;code&gt;EOF&lt;/code&gt;, la méthode appelée est donc &lt;code&gt;do_EOF()&lt;/code&gt;.&lt;br /&gt;
Une autre information à propos de &lt;code&gt;cmdloop()&lt;/code&gt; donnée dans le manuel est&amp;nbsp;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This method will return when the postcmd() method returns a true value. The stop argument to postcmd() is the return value from the command's corresponding do_*() method.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Donc si la méthode &lt;code&gt;do_EOF()&lt;/code&gt; retourne simplement 1, la boucle va tout bêtement s'arrêter.&lt;/p&gt;


&lt;h2&gt;&lt;code&gt;ctrl-C&lt;/code&gt; ou la fin de l'univers&lt;/h2&gt;

&lt;p&gt;En Python, l'utilisation de &lt;code&gt;ctrl-C&lt;/code&gt; lève l'exception &lt;code&gt;&lt;a href=&quot;http://docs.python.org/lib/module-exceptions.html#l2h-111&quot; hreflang=&quot;en&quot;&gt;KeyboardInterrupt&lt;/a&gt;&lt;/code&gt;, en capturant cette interruption, on permet au script de sortir de façon maitrisée.&lt;/p&gt;


&lt;h2&gt;Evolution&lt;/h2&gt;

&lt;p&gt;Il est conseillé d'ajouter des actions de nettoyage au niveau des commentaires &lt;code&gt;# CLEAN HERE&lt;/code&gt; pour permettre une sortie de la console vraiment sans encombre. Il reste encore à trouver un moyen élégant d'utiliser &lt;code&gt;ctrl-c&lt;/code&gt; pour annuler la ligne en cours et récupérer l'invite vierge sans quitter &lt;code&gt;cmd.cmdloop()&lt;/code&gt;&lt;br /&gt;
Attention toutefois, ce code n'a pas été testé dans un environnement microsoft. Les signaux ne sont surement pas traités de la même façon, ça n'étonnera personne.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>A chacun sa petite fiche de présence</title>
    <link>http://www.bonz.org/tech/post/2007/11/11/A-chacun-sa-petite-fiche-de-presence</link>
    <guid isPermaLink="false">urn:md5:f9d9225fb0acef7466b41d7ffd18c4bf</guid>
    <pubDate>Sun, 11 Nov 2007 12:52:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>code</category>
        <category>freebsd</category><category>lighttpd</category><category>lighttpd 1.4</category>    
    <description>&lt;p&gt;J'aime bien avoir des logs d'accès séparés par vhost sur mes serveurs, ça permet de simplifier la recherche d'erreur et la construction de statistiques. Comme je gère mes vhosts par un &lt;a href=&quot;http://www.bonz.org/files/include_vhost&quot;&gt;script&lt;/a&gt;, j'ai pensé que rajouter la création automatique de logs d'accès serait un plus. C'est toujours ça qui ne sera pas oublié lors de l'ajout d'un nouveau vhost.&lt;br /&gt;
Au passage, j'ai rajouté le &lt;code&gt;document-root&lt;/code&gt; automatique, les données d'un site virtuel doivent se trouver dans un répertoire du nom de son fichier de configuration.&lt;/p&gt;
&lt;pre&gt;
# ./include_vhost -h
Usage: include_dir [-hptx] [-d docroot_path] [-l log_path] &amp;lt;dir&amp;gt;
    -h      displays this help
    -d      Automatic document-root specification
    -l      Add vhost access logs in log_path
    -p      print the parsed config files and exit (default behaviour)
    -t      test the config files
    -x      specify a lighttpd binary (default /usr/local/sbin/lighttpd)
&lt;/pre&gt;    &lt;p&gt;Si les logs doivent se trouver dans &lt;code&gt;/var/log/lighttpd&lt;/code&gt;, que les sites se trouvent dans &lt;code&gt;/usr/local/www/data&lt;/code&gt; et que les fichiers de configurations de vhost sont dans &lt;code&gt;/usr/local/etc/lighttpd/vhost.d&lt;/code&gt;, on obtient l'appel suivant au script&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
./include_vhost -l /var/log/lighttpd -d /usr/local/www/data /usr/local/etc/lighttpd/vhost.d
&lt;/pre&gt;

&lt;p&gt;Au passage, le script change de nom étant donné qu'il se spécialise vraiment dans la gestion de fichiers de configuration d'hôte virtuel.&lt;/p&gt;


&lt;p&gt;Pour information, je n'ai pas rajouté les logs d'erreur dans cet automate, pour la simple et bonne raison que la &lt;a href=&quot;http://trac.lighttpd.net/trac/wiki/server.errorlogDetails&quot;&gt;documentation de configuration&lt;/a&gt; déconseille de placer plusieurs appels à &lt;code&gt;server.errorlog&lt;/code&gt; dans la configuration de lighty.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Je veux bien prendre mais pas de là</title>
    <link>http://www.bonz.org/tech/post/2007/07/21/Je-veux-bien-prendre-mais-pas-de-la</link>
    <guid isPermaLink="false">urn:md5:fcc06c420cb815398b7ea84c68ef7f75</guid>
    <pubDate>Sat, 21 Jul 2007 22:14:00 +0200</pubDate>
    <dc:creator>hr</dc:creator>
        <category>code</category>
        <category>freebsd</category><category>lighttpd</category><category>lighttpd 1.4</category>    
    <description>    &lt;p&gt;C'est toujours autant amusant de jouer avec lighttpd, mais parfois on se trompe dans un fichier de configuration et là, c'est le drame. Mon script &lt;code&gt;&lt;a href=&quot;http://www.bonz.org/files/include_dir&quot;&gt;include_dir&lt;/a&gt;&lt;/code&gt; ne permet pas de savoir quel fichier de configuration est brokmut lors de l'utilisation de &lt;code&gt;lighttpd -p -f lighttpd.conf&lt;/code&gt;. C'est maintenant chose faite, avec la nouvelle version toujours téléchargeable au &lt;a href=&quot;http://www.bonz.org/files/include_dir&quot;&gt;même endroit&lt;/a&gt;. Au passage, il est passé en license &lt;a href=&quot;http://en.wikipedia.org/wiki/Beerware&quot;&gt;beerware&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;
# ./include_dir -h
Usage: include_dir [-hptx] &amp;lt;dir&amp;gt;
    -h      displays this help
    -p      print the parsed config files and exit (default behaviour)
    -t      test the config files
    -x      specify a lighttpd binary (default /usr/local/sbin/lighttpd)
# ./include_dir -t vhost.d/
&amp;gt;&amp;gt;&amp;gt; Testing vhost.d/www.vhost1.org
Syntax OK
&amp;gt;&amp;gt;&amp;gt; Testing vhost.d/www.vhost2.org
2007-07-21 22:28:47: (configfile.c.833) source: vhost.d/www.vhost2.org line: 3 pos: 21 parser failed somehow near here: (EOL) 
&amp;gt;&amp;gt;&amp;gt; Testing vhost.d/www.vhost3.org
Syntax OK
&lt;/pre&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>httpd.zero = enable</title>
    <link>http://www.bonz.org/tech/post/2007/03/30/httpdzero-enable</link>
    <guid isPermaLink="false">urn:md5:a313b05949ad947c651b05724ce4e318</guid>
    <pubDate>Fri, 30 Mar 2007 18:55:00 +0200</pubDate>
    <dc:creator>hr</dc:creator>
        <category>code</category>
        <category>freebsd</category><category>lighttpd</category><category>lighttpd 1.4</category>    
    <description>&lt;p&gt;Toujours à m'amuser avec &lt;a href=&quot;http://www.lighttpd.net/&quot;&gt;asparttpd&lt;/a&gt; et je me dis que ce serait sympa de pouvoir utiliser le mécanisme auquel je me suis habitué pour les vhosts. Un dossier &lt;code&gt;vhost.d&lt;/code&gt; et un fichier de conf par vhost dans ce répertoire.&lt;/p&gt;    &lt;p&gt;Rien de plus facile en fait, grâce à &lt;code&gt;include_shell&lt;/code&gt; je lance un script de ma composition, ce script est un bête bout de &lt;code&gt;sh&lt;/code&gt; qui inclut tous les fichiers du répertoire donné en argument au script. Ca donne ce genre de chose&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
#### vhosts
include_shell &amp;quot;./include_dir vhost.d&amp;quot;
&lt;/pre&gt;

&lt;p&gt;et le script&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
#!/bin/sh

# I prefer doing nothing if no dir is given on command line
# that way I do not break anything
if [ &amp;quot;$#&amp;quot; = &amp;quot;0&amp;quot; ]; then
        exit 0
fi

# exclude vim temporary files
# configuration file has to have the vhost domain name
for site in $(ls $1 | grep -v .swp); do
        echo &amp;quot;\$HTTP[\&amp;quot;host\&amp;quot;] == \&amp;quot;$site\&amp;quot; {&amp;quot;
        cat $1/$site
        echo &amp;quot;}&amp;quot;
        echo
done
&lt;/pre&gt;

&lt;p&gt;l'utilisation d'un petit &lt;code&gt;lighttpd -p -f lighttpd.conf&lt;/code&gt; permet de s'assurer que tout fonctionne correctement, on remarque également que de cholis commentaires sont ajoutés pour faciliter la lecture.
Le script &lt;code&gt;&lt;a href=&quot;http://www.bonz.org/files/include_dir&quot;&gt;include_dir&lt;/a&gt;&lt;/code&gt; est présent dans le même répertoire que le fichier de configuration de lighttpd (je sais, c'est sale).&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Et si on mangeait light</title>
    <link>http://www.bonz.org/tech/post/2007/03/30/Et-si-on-mangeait-light</link>
    <guid isPermaLink="false">urn:md5:eac365821039a6038128c48882b46244</guid>
    <pubDate>Fri, 30 Mar 2007 16:54:00 +0200</pubDate>
    <dc:creator>hr</dc:creator>
        <category>système</category>
        <category>dotclear 2</category><category>freebsd</category><category>lighttpd</category><category>lighttpd 1.4</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://www.bonz.org/tech/public/tech/300_cokezero.jpg&quot; alt=&quot;coke zero&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;Il  y a toujours un moment dans la vie où on se dit qu'on mange trop lourd et qu'il faudrait faire attention et que j'ai pris du gras de là. il n'y a pas longtemps c'est ma passerelle qui m'a dit ça. Alors hop un p'tit coup de régime, un avis de la part d'un &lt;a href=&quot;http://imil.net/&quot; hreflang=&quot;fr&quot;&gt;ami diététicien&lt;/a&gt; et c'est parti.
&lt;a href=&quot;http://www.lighttpd.net/&quot;&gt;lighttpd&lt;/a&gt; s'installe sans probléme sur un freebsd6.2 (lighttpd-1.4.13_2) et dès le premier démarrage, sans php, HAHAHA la blague.&lt;/p&gt;    &lt;pre&gt;
[root@backdoor ~]# ps ax -o 'user pid %cpu %mem command' -w|grep www
www      36654  0.0  0.7 /usr/local/sbin/lighttpd -f /usr/local/etc/lighttpd/lighttpd.conf
&lt;/pre&gt;

&lt;p&gt;A titre de comparaison, le port apache-1.3.37_2 sous freebsd, lancé avec la conf par défaut me donne ça&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
[root@backdoor ~]# ps ax -o 'user pid %cpu %mem command' -w|grep www
www      49868  0.0  0.8  2716  2136  ??  S     2:25PM   0:00.01 /usr/local/sbin/httpd
www      49869  0.0  0.8  2716  2136  ??  S     2:25PM   0:00.01 /usr/local/sbin/httpd
www      49870  0.0  0.8  2716  2136  ??  S     2:25PM   0:00.01 /usr/local/sbin/httpd
www      49871  0.0  0.8  2716  2136  ??  S     2:25PM   0:00.01 /usr/local/sbin/httpd
www      49872  0.0  0.8  2716  2136  ??  S     2:25PM   0:00.01 /usr/local/sbin/httpd
&lt;/pre&gt;

&lt;p&gt;La bonne blague donc, il suffit ensuite d'installer php en version FastCgi et de donner le chemin vers le binaire fcgi à lighttpd&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
fastcgi.server = ( &amp;quot;.php&amp;quot; =&amp;gt; ((
        &amp;quot;bin-path&amp;quot; =&amp;gt; &amp;quot;/usr/local/bin/php-cgi&amp;quot;,
        &amp;quot;socket&amp;quot; =&amp;gt; &amp;quot;/tmp/php.socket&amp;quot;)))
&lt;/pre&gt;

&lt;p&gt;Un petit restart et des processus &lt;code&gt;php-cgi&lt;/code&gt; apparaissent dans le sillage de notre serveur http sous aspartame.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Dans la foulée je m'installe un &lt;a href=&quot;http://dev.dotclear.net/2.0/&quot;&gt;dotclear2&lt;/a&gt; et à condition de mettre une petite série de règles de réécriture, je peux même me faire de jolies URL pour les billets.&lt;/p&gt;
&lt;pre&gt;
url.rewrite-once += (
    &amp;quot;^/blog/(archive.*)&amp;quot; =&amp;gt; &amp;quot;/blog/index.php/$1&amp;quot;,
    &amp;quot;^/blog/(category.*)&amp;quot; =&amp;gt; &amp;quot;/blog/index.php/$1&amp;quot;,
    &amp;quot;^/blog/(feed.*)&amp;quot; =&amp;gt; &amp;quot;/blog/index.php/$1&amp;quot;,
    &amp;quot;^/blog/(page.*)&amp;quot; =&amp;gt; &amp;quot;/blog/index.php/$1&amp;quot;,
    &amp;quot;^/blog/(post.*)&amp;quot; =&amp;gt; &amp;quot;/blog/index.php/$1&amp;quot;,
    &amp;quot;^/blog/(tag.*)&amp;quot; =&amp;gt; &amp;quot;/blog/index.php/$1&amp;quot;,
    &amp;quot;^/blog/(trackback.*)&amp;quot; =&amp;gt; &amp;quot;/blog/index.php/$1&amp;quot;
)
$HTTP[&amp;quot;url&amp;quot;] =~ &amp;quot;/blog/(CHANGELOG|db|inc|cache|plugins)&amp;quot; {
    url.access-deny = (&amp;quot;&amp;quot;)
}
&lt;/pre&gt;

&lt;p&gt;Alors pour résumer, un fichier de configuration simpilissime à prendre en main, un système de modules niquel, une empreinte mémoire aussi imposante qu'un &lt;a href=&quot;http://fr.wikipedia.org/wiki/Pez&quot;&gt;PEZ&lt;/a&gt; et un système de vhosts que ma mère peut comprendre. Une vraie tuerie, seul bémol, l'absence de système ala &lt;code&gt;.htaccess&lt;/code&gt; qui, il faut l'avouer, est carrément convi (mais consommateur à chaque accès).&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>