<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog à Nono &#187; python</title>
	<atom:link href="http://blogs.glou.org/arnaud/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.glou.org/arnaud</link>
	<description>C'est l'histoire d'un geek...</description>
	<lastBuildDate>Sat, 04 Feb 2012 15:46:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Le piège à con du jour : variables locales en python</title>
		<link>http://blogs.glou.org/arnaud/2012/01/27/le-piege-a-con-du-jour-variables-locales-en-python/</link>
		<comments>http://blogs.glou.org/arnaud/2012/01/27/le-piege-a-con-du-jour-variables-locales-en-python/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 15:26:43 +0000</pubDate>
		<dc:creator>nono</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blogs.glou.org/arnaud/?p=424</guid>
		<description><![CDATA[Note pour plus tard. Soit un bout de code python qui ressemble à ça: mavariable = None def fonction():   if mavariable is None:    mavariable = 'toto'   blablabla() Ne pas oublier que dans ce cas la variable mavariable est locale à la fonction à cause de l&#8217;assignation à l&#8217;intérieur du if. La preuve [...]]]></description>
			<content:encoded><![CDATA[<p>Note pour plus tard. Soit un bout de code python qui ressemble à ça:</p>
<pre>mavariable = None

def fonction():
  if mavariable is None:
    mavariable = 'toto'
  blablabla()</pre>
<p>Ne pas oublier que dans ce cas la variable <em>mavariable</em> est locale à la fonction à cause de l&#8217;assignation à l&#8217;intérieur du <em>if</em>. La preuve :</p>
<pre>&gt;&gt;&gt; fonction()
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
  File "&lt;stdin&gt;", line 2, in fonction
UnboundLocalError: local variable 'mavariable' referenced before assignment</pre>
<p>Grmpf.</p>
<p>Merci à Sam qui à fouillé dans la doc : c&#8217;est effectivement écrit <a href="http://docs.python.org/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python">là</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.glou.org/arnaud/2012/01/27/le-piege-a-con-du-jour-variables-locales-en-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Myrsa &#8212; my root shell access</title>
		<link>http://blogs.glou.org/arnaud/2011/04/27/myrsa-my-root-shell-access/</link>
		<comments>http://blogs.glou.org/arnaud/2011/04/27/myrsa-my-root-shell-access/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 16:18:01 +0000</pubDate>
		<dc:creator>nono</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[myrsa]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[xterm]]></category>

		<guid isPermaLink="false">http://blogs.glou.org/arnaud/?p=319</guid>
		<description><![CDATA[Myrsa est à la fois un petit bout de programme pratique dans mon environnement et un prétexte pour apprendre à créer une interface graphique en Python. L&#8217;interface comporte un champ texte dans lequel on entre un nom de machine ; myrsa ouvre ensuite un xterm où il lance (essentiellement) la commande ssh root@lamachine. J&#8217;ai configuré [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.glou.org/arnaud/wp-content/uploads/2011/04/Screenshot-myrsa [chez] licencieux [point] ircam_.fr_.png"><img class="alignright size-full wp-image-317" title="Screenshot-myrsa [chez] licencieux [point] ircam [point] fr" src="http://blogs.glou.org/arnaud/wp-content/uploads/2011/04/Screenshot-myrsa [chez] licencieux [point] ircam_.fr_.png" alt="" width="238" height="39" /></a>Myrsa est à la fois un petit bout de programme pratique dans mon environnement  et un prétexte pour apprendre à créer une interface graphique en Python.  L&#8217;interface comporte un champ texte dans lequel on entre un nom de  machine ; myrsa ouvre ensuite un <em>xterm</em> où il lance (essentiellement) la commande <em>ssh root@lamachine</em>.</p>
<p>J&#8217;ai configuré <a href="http://www.nongnu.org/xbindkeys/xbindkeys.html">xbindkeys</a> pour l&#8217;invoquer avec la combinaison de touches Ctrl-F10 :</p>
<pre>"~/bin/myrsa"
   m:0x4 + c:76</pre>
<p>et  j&#8217;ai modifié mon fichier <em>.Xdefaults</em> pour avoir un style différent de  mes <em>xterm</em> habituels (c&#8217;était un des principaux objectifs) :</p>
<pre>MYRSA*Background:       lightgoldenrodyellow
MYRSA*Foreground:       black</pre>
<p>Myrsa est téléchargeable <a href="http://www.glou.org/~arnaud/software/myrsa">ici</a>.</p>
<p>Je ne désespère pas de me motiver un jour pour en écrire une version plus évoluée avec une complétion du nom de la machine.</p>
<p>Et oui, j&#8217;ai lu <a href="http://sebsauvage.net/python/gui/">le tutoriel de Sébastien Sauvage</a>. Ça se voit tant que ça ? <img src='http://blogs.glou.org/arnaud/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>EDIT 29/04/2011: Légère modif de la config xbindkeys pour la rendre plus générique.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.glou.org/arnaud/2011/04/27/myrsa-my-root-shell-access/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Alias mail et LDAP</title>
		<link>http://blogs.glou.org/arnaud/2010/03/26/alias-mail-et-ldap/</link>
		<comments>http://blogs.glou.org/arnaud/2010/03/26/alias-mail-et-ldap/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 20:34:06 +0000</pubDate>
		<dc:creator>nono</dc:creator>
				<category><![CDATA[geekeries]]></category>
		<category><![CDATA[LDAP]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blogs.glou.org/arnaud/?p=183</guid>
		<description><![CDATA[- Dis, Nono, comment on fait pour gérer des alias mail avec un annuaire LDAP ? - Bouge pas mon gars, je te sers un café et je te montre. Les fiches LDAP Chez moi, une fiche LDAP peut comprendre jusqu&#8217;à 4 attributs différents liés au mail : mail contient l&#8217;adresse « officielle » de l&#8217;utilisateur [...]]]></description>
			<content:encoded><![CDATA[<p><em>- Dis, Nono, comment on fait pour gérer des alias mail avec un annuaire LDAP ?</em><br />
<em>- Bouge pas mon gars, je te sers un café et je te montre.</em></p>
<h1>Les fiches LDAP</h1>
<p>Chez moi, une fiche LDAP peut comprendre jusqu&#8217;à 4 attributs différents liés au mail :</p>
<ul>
<li><em>mail</em> contient l&#8217;adresse « officielle » de l&#8217;utilisateur</li>
<li><em>mailLocalAddress</em> contient ses alias locaux ; ils seront réécrits et remplacés par la valeur de l&#8217;attribut <em>mail</em> en sortie de site</li>
<li><em>mailAcceptingAddress</em> contient des alias « en réception seule », typiquement pour les groupes de travail</li>
<li><em>mailRoutingAddress</em> contient la destination des messages envoyés aux <em>mailAcceptingAddress</em> et <em>mailLocalAddress</em> de la fiche</li>
</ul>
<p>En termes de schéma LDAP, nous avons ajouté ça au schéma de base d&#8217;OpenLDAP :</p>
<pre>attributetype ( 1.3.6.1.4.1.7568.1.1.10
    NAME 'mailAcceptingAddress'
    DESC 'RFC822 alternate email address of this recipient'
    EQUALITY caseIgnoreIA5Match
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

objectclass ( 1.3.6.1.4.1.7568.1.2.2 NAME 'ircamLocalMailRecipient' AUXILIARY
    DESC ''
    MAY ( mailAcceptingAddress ) )

objectclass ( 1.3.6.1.4.1.7568.1.2.10 NAME 'ircamAlias' SUP top STRUCTURAL
    DESC ''
    MAY ( mailRoutingAddress ) )</pre>
<p>La classe d&#8217;objet <em>ircamAlias</em> ne sert que pour la gestion des alias indépendants des utilisateurs (listes de diffusion et redirections « vers l&#8217;extérieur » notamment). Nous allons la laisser de côté pour le moment.<br />
Concrètement, un utilisateur ressemble à ça :</p>
<pre>dn: uid=empion, ou=People, dc=example, dc=com
objectClass: account
objectClass: top
objectClass: inetLocalMailRecipient
objectClass: ircamLocalMailRecipient
objectClass: inetOrgPerson
objectClass: pilotPerson
objectClass: ircamAccount
objectClass: shadowAccount
objectClass: organizationalPerson
objectClass: person
objectClass: ircamPerson
uid: empion
mailRoutingAddress: empion@mailboxes.example.com
mailAcceptingAddress: tout-le-monde@example.com
mailAcceptingAddress: groupe-de-travail@example.com
mailLocalAddress: tartempion@example.com
mailLocalAddress: tarte.empion@example.com
mail: Tarte.Empion@example.com
sn: Empion
cn: Tarte Empion
uidNumber: 12345
gidNumber: 333</pre>
<h1>La configuration de Postfix</h1>
<p>Postfix, c&#8217;est bien. Si, si. Je sais que vous en êtes déjà convaincus, mais c&#8217;est encore une occasion de le dire. Pour utiliser ce qui précède, il suffit de ces quelques lignes de config dans <em>main.cf</em> :</p>
<pre>sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps = ldap:ldapcanon
ldapcanon_server_host = ldap.example.com
ldapcanon_server_port = 389
ldapcanon_search_base = dc=example,dc=com
ldapcanon_query_filter = (&amp;(mailLocalAddress=%s)(mail=*))
ldapcanon_result_attribute = mail

virtual_maps = ldap:ldapvirt
ldapvirt_server_host = ldap.example.com
ldapvirt_server_port = 389
ldapvirt_search_base = dc=example,dc=com
ldapvirt_query_filter = (|(mailLocalAddress=%s)(mailAcceptingAddress=%s))
ldapvirt_result_attribute = mailRoutingAddress</pre>
<p>C&#8217;est tout, rien de tordu à faire. Une fois ce bout de config en place, l&#8217;adresse source <em>tartempion@example.com</em> sera réécrite en <em>Tarte.Empion@example.com</em> (techniquement, <em>tarte.empion@example.com</em> sera réécrite aussi, mais ça ne fera ni chaud ni froid à la plupart des systèmes de courrier électronique actuels), et les messages envoyés à <em>tarte.empion@example.com</em>, <em>tartempion@example.com</em>, <em>tout-le-monde@example.com</em> et <em>groupe-de-travail@example.com</em> seront renvoyés à <em>empion@mailboxes.example.com</em> (et éventuellement à d&#8217;autres si ces mêmes alias sont aussi définis dans d&#8217;autres fiches). Elle est pas belle, la vie ?</p>
<h1>Les scripts</h1>
<p>OK, maintenant on sait à quoi les données peuvent ressembler, mais est-ce qu&#8217;il y a un outil plus simple que ldapvi pour les mettre dans l&#8217;annuaire ? Oui et non. J&#8217;ai bricolé récemment une petite série de scripts pour éditer l&#8217;attribut <em>mailAcceptingAddress</em> d&#8217;une fiche ; en pratique, c&#8217;est le seul qui varie plus ou moins souvent, les autres sont fixés à la création du compte. Les outils en question sont téléchargeables <a href="http://files.glou.org/blog/mail-ldap-tools-20100326.tar.gz">ici</a>. L&#8217;archive contient :</p>
<ul>
<li>le module <em>ircamldap.py</em> qui initialise quelques variables utiles (serveur LDAP, mot de passe admin&#8230;)</li>
<li>son fichier de configuration <em>ircamldap.cfg</em></li>
<li>les scripts <em>add-mail-alias</em>, <em>remove-mail-alias</em> et <em>get-mail-aliases</em> qui font l&#8217;essentiel du vrai boulot.</li>
</ul>
<p>Pour l&#8217;utilisation de ces derniers, j&#8217;ai essayé de faire assez simple pour mes deux neurones ; en pratique, ça donne ça :</p>
<pre><strong>% get-mail-aliases empion</strong>
tout-le-monde@example.com
groupe-de-travail@example.com
<strong>% add-mail-alias empion monnouvelaliasquilestbien@example.net</strong>
<strong>% get-mail-aliases empion</strong>
tout-le-monde@example.com
groupe-de-travail@example.com
monnouvelaliasquilestbien@example.net
<strong>% remove-mail-alias empion monnouvelaliasquilestbien@example.net tout-le-monde@example.com</strong>
<strong>% get-mail-aliases empion</strong>
groupe-de-travail@example.com
<strong>%</strong></pre>
<p>Pour le moment, ces outils marchent à peu près mais il ne faut pas leur en demander trop. Entre autres, leur gestion des erreurs est assez minimale, et ils ne positionnent pas forcément toujours leur code de retour comme il faudrait. Ce sera pour la prochaine version. <img src='http://blogs.glou.org/arnaud/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Bien entendu, je suis preneur de toute suggestion, amélioration, patch ou autre « mais t&#8217;es con, ça fait 10 ans que ça existe en mieux ».</p>
<p><em>- Il est bizarre, ton café.<br />
- Normal, c&#8217;est une bière. Tu es admin système ou pas ?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.glou.org/arnaud/2010/03/26/alias-mail-et-ldap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

