<?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 - linux</title>
  <link>http://www.bonz.org/tech/</link>
  <description>Om Mani Padme Hum</description>
  <language>fr</language>
  <pubDate>Mon, 10 Nov 2008 00:41:06 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Bruce Schneier knows Alice and Bob's shared secret</title>
    <link>http://www.bonz.org/tech/post/2008/08/07/Bruce-Schneier-knows-Alice-and-Bobs-shared-secret</link>
    <guid isPermaLink="false">urn:md5:1813916f63cbeef74f99a2083c01cb43</guid>
    <pubDate>Mon, 13 Oct 2008 14:50:00 +0200</pubDate>
    <dc:creator>hr</dc:creator>
        <category>système</category>
        <category>cryptsetup</category><category>debian</category><category>dedibox</category><category>dedimeule</category><category>dm-crypt</category><category>etch</category><category>linux</category><category>luks</category><category>v2.6</category><category>x86_64</category>    
    <description>&lt;p&gt;Comment faire lorsqu'on souhaite se constituer un petit espace très personnel sur une machine linux. Que faire quand on souhaite que cet espace soit conservé à l'abris des yeux indiscrets. Je vous propose une petite recette simple et efficace. Il suffit d'utiliser des ingrédients que vous trouverez dans votre cuisine !!&lt;/p&gt;    &lt;p&gt;L'environnement système est une debian etch installée en 64bits sur une dedibox. Je vais utiliser le chiffrement de bloc avec &lt;code&gt;&lt;a href=&quot;http://luks.endorphin.org/&quot; hreflang=&quot;en&quot;&gt;LUKS&lt;/a&gt;&lt;/code&gt; utilisant &lt;code&gt;&lt;a href=&quot;http://www.saout.de/misc/dm-crypt/&quot; hreflang=&quot;en&quot;&gt;dm-crypt&lt;/a&gt;&lt;/code&gt;. Nous ne chiffrerons pas la partition racine du système mais bien une partition de données.&lt;/p&gt;


&lt;p&gt;Il faut tout d'abord vérifier qu'on a les outils nécessaires au &lt;a href=&quot;http://fr.wikipedia.org/wiki/M%C3%A9thode_de_chiffrement#.C2.AB_Cryptage_.C2.BB_.3F&quot; hreflang=&quot;fr&quot;&gt;chiffrement&lt;/a&gt; de partition.&lt;/p&gt;
&lt;pre&gt;
# apt-get install cryptsetup dmsetup hashalot
[...]
&lt;/pre&gt;


&lt;p&gt;Maintenant que les outils de base sont installés, on vérifie leur compatibilité avec l'utilisation qu'on souhaite en faire.&lt;/p&gt;
&lt;pre&gt;
# cryptsetup --help
cryptsetup-luks 1.0.5
[...]
# dmsetup targets
zero             v1.0.0
mirror           v1.0.20
snapshot-origin  v1.6.0
snapshot         v1.6.0
crypt            v1.5.0
striped          v1.1.0
linear           v1.0.2
error            v1.0.1

# cat /proc/crypto | grep name
name         : aes
name         : sha256
name         : sha224
name         : sha1
name         : md5
&lt;/pre&gt;

&lt;p&gt;la commande &lt;code&gt;cryptsetup&lt;/code&gt; installée supporte bien LUKS et le noyau est capable de supporter le chiffrement.&lt;/p&gt;


&lt;p&gt;Pour les architectures supportant le 64bit.&lt;/p&gt;
&lt;pre&gt;
# modprobe aes-x86_64
# cat /proc/crypto
name         : aes
driver       : aes-asm
module       : aes_x86_64
priority     : 200
refcnt       : 1
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32
[...]
&lt;/pre&gt;

&lt;p&gt;Le module peut-être éventuellement ajouté au fichier &lt;code&gt;/etc/modules&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Je dois maintenant créer la partition qui va être chiffrée et la déclarer au système grâce à &lt;code&gt;partprobe&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;
# cfdisk /dev/sda
[...]
# apt-get install parted
[...]
# partprobe /dev/sda
&lt;/pre&gt;


&lt;p&gt;Pour chiffrer une partition avec LUKS, il faut la &quot;formater&quot; avec &lt;code&gt;cryptsetup&lt;/code&gt; et ensuite la déclarer au système &quot;&lt;code&gt;device mapper&lt;/code&gt;&quot;. Il est conseillé d'utiliser une phrase de mot de passe complexe.&lt;/p&gt;
&lt;pre&gt;
# cryptsetup luksFormat /dev/sda8

WARNING!
========
This will overwrite data on /dev/sda8 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.
# cryptsetup luksOpen /dev/sda8 data
Enter LUKS passphrase: 
key slot 0 unlocked.
Command successful.
# ls /dev/mapper/
control  data
&lt;/pre&gt;

&lt;p&gt;C'est gagné, la partition est maintenant accessible grâce au chemin &lt;code&gt;/dev/mapper/data&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Il faut formater la partition, ici j'utilise &lt;code&gt;ext3&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;
# mkfs.ext3 -m 0 /dev/mapper/data
&lt;/pre&gt;

&lt;p&gt;La partition peut maintenant être utilisée par le système.&lt;/p&gt;


&lt;p&gt;Pour assurer le montage de la partition au démarrage, il faut la déclarer dans le fichier &lt;code&gt;/etc/crypttab&lt;/code&gt;. Cette déclaration permet de faire l'ouverture LUKS et la déclaration à &quot;&lt;code&gt;dev mapper&lt;/code&gt;&quot; en une opération. Ensuite &lt;code&gt;/etc/fstab&lt;/code&gt; pourra prendre le relais.&lt;/p&gt;
&lt;pre&gt;
# cat /etc/crypttab
# &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;
data    /dev/sda8       none            luks,timeout=1
&lt;/pre&gt;


&lt;p&gt;Ps: Le titre vient des &quot;&lt;a href=&quot;http://geekz.co.uk/schneierfacts/&quot; hreflang=&quot;en&quot;&gt;Bruce Schneier facts&lt;/a&gt;&quot;.&lt;br /&gt;
Ps2: Le formatage de la partition peut également se faire avec un version plus longue de la commande &lt;code&gt;cryptsetup&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# cryptsetup --verify-passphrase --verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/sda8
[...]
&lt;/pre&gt;</description>
    
    
    
          <comments>http://www.bonz.org/tech/post/2008/08/07/Bruce-Schneier-knows-Alice-and-Bobs-shared-secret#comment-form</comments>
      <wfw:comment>http://www.bonz.org/tech/post/2008/08/07/Bruce-Schneier-knows-Alice-and-Bobs-shared-secret#comment-form</wfw:comment>
      <wfw:commentRss>http://www.bonz.org/tech/feed/rss2/comments/244</wfw:commentRss>
      </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>Colle toi ça dans les oreilles</title>
    <link>http://www.bonz.org/tech/post/2007/11/30/Colle-toi-ca-dans-les-oreilles</link>
    <guid isPermaLink="false">urn:md5:c1280926d2be28bc06efb7eba79ad1d4</guid>
    <pubDate>Fri, 30 Nov 2007 17:21:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>hardware</category>
        <category>7.10</category><category>gutsy</category><category>iaudio</category><category>linux</category><category>ubuntu</category><category>x5l</category>    
    <description>    &lt;p&gt;Je suis l'heureux possesseur d'un &lt;a href=&quot;http://www.cowonglobal.com/product/product_X5_feature.php&quot;&gt;iAUDIO X5L de 30Go&lt;/a&gt;, cet appareil est vraiment génial. Sauf quand il vous claque des montages en lecture seule, là c'est un peu pénible.&lt;/p&gt;
&lt;pre&gt;
Nov 30 16:36:09 ewok kernel: [23799.560000] FAT: Filesystem panic (dev sdb1)
Nov 30 16:36:09 ewok kernel: [23799.560000]     fat_get_cluster: invalid cluster chain (i_pos 0)
Nov 30 16:36:09 ewok kernel: [23799.560000]     File system has been set read-only
&lt;/pre&gt;

&lt;p&gt;Pas de problème, il suffit de faire une petite vérification du système de fichier après avoir démonté la partition&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
$ sudo umount /media/IAUDIO
$ sudo fsck.vfat -a -v /dev/sdb1
dosfsck 2.11 (12 Mar 2005)
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
Checking we can access the last sector of the filesystem
Boot sector contents:
System ID &amp;quot;MSDOS5.0&amp;quot;
Media byte 0xf8 (hard disk)
[...]
Reclaiming unconnected clusters.
Reclaimed 18671 unused clusters (305905664 bytes) in 73 chains.
Checking free cluster summary.
Free cluster summary wrong (98499 vs. really 98722)
  Auto-correcting.
Performing changes.
/dev/sdb1: 6625 files, 1731289/1830011 clusters
&lt;/pre&gt;

&lt;p&gt;La reconnexion du lecteur à mon port USB et des mouvements de fichiers sur le disque me confirment que le problème a disparu. YATAAAAAAAAAAAA.&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>