<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
	
		<title>philpep's blog - tag OpenBSD</title>
		<atom:link href="http://blog.philpep.org/feed/tag/OpenBSD/rss2" rel="self" type="application/rss+xml" />
		<description>philpep&#39;s blog - tag OpenBSD rss</description>
	<link>http://blog.philpep.org</link>
	<language>fr</language>
		<lastBuildDate>Wed, 17 Nov 2010 18:31:30 GMT</lastBuildDate>
	<generator>Pblog</generator>
		<item>
			<title>NSD pour remplacer BIND</title>
			<link>http://blog.philpep.org/post/nsd-pour-remplacer-bind</link>
			<guid>http://blog.philpep.org/post/nsd-pour-remplacer-bind</guid>
			<pubDate>Wed, 17 Nov 2010 18:31:30 GMT</pubDate>
			<description>&lt;p&gt;Je loue une machine virtuelle chez lost-oasis à (12€ par mois, 256Mo de RAM) pour faire du monitoring nagios, du mx/dns secondaire et du mirror http pour mes autres machines dans mon appart. Elle tourne sur Debian (en paravirtualisation kvm, virtio etc), avec de l&#39;openvz par dessus. 256Mo ça fait pas beaucoup, et en browsant sur mon &lt;code&gt;top&lt;/code&gt;, j&#39;ai remarqué que c&#39;était &lt;code&gt;bind&lt;/code&gt; qui prenait le plus de mémoire (loin devant postgresql et php-cgi).&lt;/p&gt;
&lt;p&gt;Je me met donc à la recherche d&#39;un serveur dns qui serait plus léger que bind et qui fasse aussi bien dns primaire et secondaire pour mes 5 petites zones et je me souviens avoir vu passer &lt;a href=&#34;http://www.gcu-squad.org/2010/10/je-voudrais-le-22-a-asnieres/&#34;&gt;une news&lt;/a&gt; à propos de l&#39;intégration récente de &lt;a href=&#34;http://www.nlnetlabs.nl/projects/nsd/&#34;&gt;nsd&lt;/a&gt; dans OpenBSD-Current. Ni une ni deux je dégaine mon &lt;code&gt;apt-get install nsd3&lt;/code&gt; et après quelques jours d&#39;utilisation j&#39;en suis très content.&lt;/p&gt;
&lt;p&gt;Ce qu&#39;il faut savoir à propos de &lt;code&gt;nsd&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C&#39;est un serveur authoritative only (contrairement à bind qui fait aussi cache et récursion)&lt;/li&gt;
&lt;li&gt;Il est utilisé par quelques uns des root dns servers (on peut donc lui louer une certaine robustesse)&lt;/li&gt;
&lt;li&gt;Il sait lire les même fichiers de zones que bind&lt;/li&gt;
&lt;li&gt;La configuration est extrêmement simple&lt;/li&gt;
&lt;li&gt;Il est bien plus léger en RAM que bind même configuré pour faire la même chose.&lt;/li&gt;
&lt;li&gt;Il fonctionne très bien avec bind en master (j&#39;ai pas testé dans l&#39;autre sens)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Que du bon donc, laisser moi vous montrer un bout de config comme c&#39;est simple :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;server:
    hide-version: yes

# Une config master avec deux slaves 
zone:
    name: &amp;quot;philpep.org&amp;quot;
    zonefile: &amp;quot;master/philpep.org&amp;quot;

    notify: 217.70.177.40 NOKEY
    provide-xfr: 217.70.177.40 NOKEY

    notify: 212.85.155.53 NOKEY
    provide-xfr: 212.85.155.53 NOKEY

# Une config slave avec un master
zone:
    name: &amp;quot;philpep.org&amp;quot;
    zonefile: &amp;quot;slave/philpep.org&amp;quot;

    allow-notify: 82.229.137.130 NOKEY
    request-xfr: AXFR 82.229.137.130 NOKEY

# Apparemment nsd master ne gère que les transferts de zone AXFR (et pas IXFR)
# Ça n&amp;#39;a pas d&amp;#39;incidence l&amp;#39;un est testé puis l&amp;#39;autre si ça marche pas. Mais vous pouvez éviter
# un message de log en mettant AXFR dans request-xfr dans le cas d&amp;#39;un nsd master et slave.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Les zones sont strictement les mêmes que celles de bind.&lt;/p&gt;
&lt;p&gt;Bien sûr il est possible de faire des config bien plus velues avec des clés pour faire des zones dynamiques, du chroot etc, voyez  &lt;a href=&#34;http://linux.die.net/man/5/nsd.conf&#34;&gt;nsd.conf(5)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il y a aussi un utilitaire bien convi pour controler le serveur : &lt;a href=&#34;http://linux.die.net/man/8/nsdc&#34;&gt;nsdc(8)&lt;/a&gt;. Avant de démarrer le serveur pour la première fois, il faut compiler les zones avec &lt;code&gt;nsdc rebuild&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;J&#39;ai trouvé nsd tellement pratique que je l&#39;ai aussi installé en master sur mon serveur FreeBSD  (&lt;code&gt;dns/nsd&lt;/code&gt;), bind sert toujours pour le cache,récursion et mes zones en local, mais je vais certainement le remplacer par un &lt;a href=&#34;http://cr.yp.to/djbdns.html&#34;&gt;djbdns&lt;/a&gt; ou un &lt;a href=&#34;http://www.thekelleys.org.uk/dnsmasq/doc.html&#34;&gt;dnsmasq&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le script rc de nsd sur FreeBSD &lt;code&gt;/usr/local/etc/rc.d/nsd&lt;/code&gt; est pas terrible, utilisez plutôt &lt;code&gt;nsdc&lt;/code&gt; ou attendez que &lt;a href=&#34;http://www.freebsd.org/cgi/query-pr.cgi?pr=152331&#34;&gt;mon patch&lt;/a&gt; soit accepté :-)&lt;/p&gt;</description>
		</item>
		<item>
			<title>Ma conf NanoBSD</title>
			<link>http://blog.philpep.org/post/ma-conf-nanobsd</link>
			<guid>http://blog.philpep.org/post/ma-conf-nanobsd</guid>
			<pubDate>Fri, 17 Sep 2010 00:00:00 GMT</pubDate>
			<description>&lt;p&gt;Je suis l&#39;heureux possesseur d&#39;une alix 2D3, un temps elle a tournée sous OpenBSD mais quand est venue la carte wifi non supportée j&#39;ai du changer d&#39;OS pour FreeBSD et les drivers madwifi. Un jour j&#39;en ai eu marre de me battre avec &lt;code&gt;mount -uw /&lt;/code&gt; et les devices &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=md&#34;&gt;md(4)&lt;/a&gt; et j&#39;y ais mis une &lt;a href=&#34;http://pfsense.org/&#34;&gt;pfsense&lt;/a&gt;, au début l&#39;interface web c&#39;est convi, mais vite on se sent limité, et ne pas éditer mon &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=pf.conf&#34;&gt;pf.cont(5)&lt;/a&gt; avec vim me rendait malade.&lt;/p&gt;
&lt;p&gt;Puis j&#39;apprends qu&#39;il existe un script dans les sources FreeBSD qui permet de faire une FreeBSD pour l&#39;embarqué (ie, petite taille, lecture seule + ram disk). C&#39;est marqué dans le titre, il s&#39;agit de &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=nanobsd&#34;&gt;nanobsd(8)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;C&#39;est très bien foutu et on est assez émerveillé  quand on connait pas les techniques de l&#39;embarqué comme moi.&lt;/p&gt;
&lt;p&gt;En gros vous faites un fichier de config en shell, &lt;code&gt;/usr/src/tools/tools/nanobsd/nanobsd.sh&lt;/code&gt; se charge de vous compiler le world et le kernel et mettre tout ça dans une image disque.&lt;/p&gt;
&lt;p&gt;Il y a beaucoup de paramètres customisables, une simple lecture du script vous les donnera tous. Nanobsd génère 2 images, une image disque complete (&lt;em&gt;.disk.full) et une image avec seulement une partition (&lt;/em&gt;.disk.image).
L&#39;image complète comporte 3 partitions, les deux premières sont identiques en tailles et contiennent les mêmes données que &lt;em&gt;.disk.image, lors de la première installation vous utilisez &lt;/em&gt;.disk.full, et pour mettre à jour vous utilisez _.disk.image à écrire sur la partition que vous n&#39;utilisez pas actuellement (comme ça pas besoin de sortir la carte flash pour mettre à jour).&lt;/p&gt;
&lt;p&gt;Nanobsd monte une des deux partitions sur &lt;code&gt;/&lt;/code&gt; (en read-only), et deux ram disk pour &lt;code&gt;/etc&lt;/code&gt; et &lt;code&gt;/var&lt;/code&gt; (&lt;code&gt;/tmp&lt;/code&gt; est linké avec &lt;code&gt;/var/tmp&lt;/code&gt;, &lt;code&gt;/usr/local/etc&lt;/code&gt; sur &lt;code&gt;/etc/local&lt;/code&gt;).
Pour rendre les changements sur &lt;code&gt;/etc&lt;/code&gt; persistants, on utilise la troisième partition qui se monte sur &lt;code&gt;/cfg&lt;/code&gt;, tout les fichiers de &lt;code&gt;/cfg&lt;/code&gt; sont écrits sur &lt;code&gt;/etc&lt;/code&gt; au boot.&lt;/p&gt;
&lt;p&gt;Il y a un script simple pour comparer &lt;code&gt;/etc&lt;/code&gt; et &lt;code&gt;/cfg&lt;/code&gt; pour sauvegarder les changements.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% mount /cfg
% touch /cfg/rc.conf # si le fichier n&amp;#39;existe pas dans /cfg il n&amp;#39;est pas copié
% umount /cfg
% sh /root/save_cfg
/etc/rc.conf --&amp;gt; /cfg/rc.conf
%
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Voyez &lt;a href=&#34;http://philpep.org/pub/solo.tgz&#34;&gt;le tgz avec ma config&lt;/a&gt;, vous y trouverez &lt;a href=&#34;http://philpep.org/pub/solo/SOLO.html&#34;&gt;la config kernel&lt;/a&gt;, la &lt;a href=&#34;http://philpep.org/pub/solo/alix.cfg.html&#34;&gt;config nanobsd&lt;/a&gt;, et &lt;a href=&#34;http://philpep.org/pub/solo/Files/&#34;&gt;les fichiers&lt;/a&gt; que j&#39;ai mis dans &lt;code&gt;/usr/src/tools/tools/nanobsd/Files/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Avec en particulier &lt;a href=&#34;http://philpep.org/pub/solo/Files/etc/local/dnsmasq.conf.html&#34;&gt;dnsmasq.conf&lt;/a&gt; qui bloque au niveau dns les publicités (avec une liste updatée tous les jours).&lt;/p&gt;
&lt;p&gt;Mon alix sert donc de routeur, serveur dns/dhcp/impression. Sendmail relaye vers mon serveur interne, et syslog envoie tout à mon serveur.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% cd /usr/src/tools/tools/nanobsd/
% cp ~/solo/alix.cfg .
% cp -r ~/solo/Files/* Files/
% cp ~/solo/SOLO /usr/src/sys/i386/conf/
% sh nanobsd.sh -c alix.cfg
% wait
% qemu -hda /usr/obj/nanobsd.solo/_.disk.full -m 512 -no-acpi -nographic -cpu pentium
# Hmm quelque chose ne va pas, mais j&amp;#39;ai pas envie de rebuild world et/ou kernel
% sh nanobsd.sh -h
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mon script utilise des packages préconstruits, si vous voulez les compiler vous même il y a une fonction pour ça dans &lt;code&gt;nanobsd.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Pour finir (ou commencer),  voici &lt;a href=&#34;http://www.freebsd.org/doc/en/articles/nanobsd/index.html&#34;&gt;la doc nanobsd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voilà, ma config est certainement loin d&#39;être parfaite niveau taille système mais ma carte flash fait 4G (donc 2G utilisable pour le système) et c&#39;est largement suffisant pour faire tourner une FreeBSD &#34;pas trop dépouillée&#34;.&lt;/p&gt;
&lt;p&gt;Pour mettre à jours (j&#39;ai gzip mon image avant) en supposant que le système tourne sur la partition 1:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% ssh phil@aldo cat /usr/obj/nanobsd.solo/_.disk.image.gz | zcat | sh updatep2
% reboot
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;J&#39;ai modifié updatep{1|2} en ajoutant &lt;code&gt;gpart set -a active -i PARTITION_INDEX ad0&lt;/code&gt; en raison d&#39;un problème que vous aurez peut être (la nouvelle partition est pas marquée active...)&lt;/p&gt;
&lt;p&gt;Si le sujet vous intéresse, il y a un projet linux embarqué sympa qui s&#39;appelle &lt;a href=&#34;http://buildroot.net/&#34;&gt;buildroot&lt;/a&gt; où là on peut carrément construire sa chaîne de compilation croisée (arm, mips etc), et construire un système embarqué très personalisé. Dommage qu&#39;il n&#39;existe pas un tel projet basé sur le kernel BSD (un jour peut être...)&lt;/p&gt;</description>
		</item>
		<item>
			<title>Astuce pf du jour</title>
			<link>http://blog.philpep.org/post/Astuce-pf-du-jour</link>
			<guid>http://blog.philpep.org/post/Astuce-pf-du-jour</guid>
			<pubDate>Tue, 23 Feb 2010 14:09:07 GMT</pubDate>
			<description>&lt;p&gt;J&#39;ai la chance d&#39;avoir une bibliothèque avec un rayon informatique bien rempli dans mon Université, dernièrement j&#39;y ai emprunté &lt;a href=&#34;http://www.eyrolles.com/Informatique/Livre/le-livre-de-packet-filter-9782212125160&#34;&gt;ce bouquin&lt;/a&gt;. Là dedans j&#39;y ai vu une syntaxe pour décrire le réseau local que j&#39;avais raté quand j&#39;ai lu &lt;a href=&#34;http://www.openbsd.org/faq/pf/fr/index.html&#34;&gt;la doc&lt;/a&gt; :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;ext_if = &amp;quot;rl0&amp;quot;
# Au lieu de
localnet = &amp;quot;{ 192.168.0.0/24, 2a01:e35:2e58:9820::/64 }&amp;quot;
# On peut mettre
localnet = $ext_if:network
# Ou encore
localnet = rl0:network
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href=&#34;http://blog.philpep.org/tag/Packet%20Filter&#34;&gt;Pf&lt;/a&gt; va lui même calculer le réseau local à l&#39;aide de l&#39;IP du netmask et du prefixe.&lt;/p&gt;
&lt;p&gt;Attention tout de même si vous avez plusieurs IP (v4 et v6) sur l&#39;interface, ça peut produire des règles redondantes, en cas de doute :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;pfctl -sr
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;EDIT (27/02/10) : En fait quand il y a des alias sur l&#39;IP il va les évaluer mais pour ne spécifier que l&#39;adresses (sans les alias) on peut mettre $ext_if:network:0 &lt;/p&gt;</description>
		</item>
		<item>
			<title>IPV6 step 1</title>
			<link>http://blog.philpep.org/post/IPV6-step-1</link>
			<guid>http://blog.philpep.org/post/IPV6-step-1</guid>
			<pubDate>Sun, 21 Feb 2010 23:31:21 GMT</pubDate>
			<description>&lt;p&gt;Je viens de passer tout (ou presque) mes services en IPV6 (en gardant IPV4 of course) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% host blog.philpep.org
blog.philpep.org is an alias for lenine.philpep.org.
lenine.philpep.org has address 82.229.137.130
lenine.philpep.org has IPv6 address 2a01:e35:2e58:9820::5
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Donc l&#39;idée c&#39;est de faire un récit de mon passage étant donné le nombre de modifications que j&#39;ai du faire sur la configurations des machines, des softs et des pare feu. Je vais faire tout ça en 2 ou 3 billets.&lt;/p&gt;
&lt;p&gt;Mon FAI (free) me fournis un préfixe IPV6 2a01:e35:2e58:9820::/64, et ma topologie réseau permet sans se casser la tête de faire fonctionner tout ça. Le réseau est composé de 3 machines (+ quelques intrus en wifi), un routeur OpenBSD, un serveur FreeBSD avec 4 jails et mon laptop FreeBSD. Le mode routeur est activé sur la freebox (sans DHCP) et elle installe un 192.168.0.0/24 sur lequel sont toutes les machines (jails y compris) sont configurés, ainsi toutes les machines sont reliés physiquement sur la freebox ce qui permet d&#39;éviter les problèmes de &lt;a href=&#34;http://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6&#34;&gt;neighbor solicitation&lt;/a&gt; si seul mon routeur serait physiquement relié à la freebox (on peut passer outre avec &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=ndp&#34;&gt;ndp(8)&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;En ipv4 :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;+-------------+      +----------------+       +---------+
| SRV + jails |&amp;lt;-----|     Routeur    |&amp;lt;------| Freebox |
+-------------+      +----------------+       +---------+
                      Filtrage/Routage

    En IPV4 tout le trafic passe par le routeur qui dispatche sur les jails.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et en ipv6 :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;+-------------+
| SRV + jails |&amp;lt;------+
+-------------+       |
                      |    +---------+
                      +----| Freebox |
                      |    +---------+
+------------+        |
|  Routeur   |&amp;lt;-------+
+------------+

En IPV6 le traffic est distribué par la freebox,
le routeur ne sert plus (à part les services qui
sont dessus).
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;La configuration ipv6 des machines sous FreeBSD :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# /etc/rc.conf
ipv6_enable=&amp;quot;YES&amp;quot;
ipv6_ifconfig_rl0=&amp;quot;2a01:e35:2E58:9820::2 prefixlen 64&amp;quot;
ipv6_defaultrouter=&amp;quot;2a01:e35:2E58:9820::1&amp;quot;

# ... La config jail
jail_lenine_ip=&amp;quot;192.168.0.5,2a01:e35:2E58:9820::5&amp;quot;
# ...
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Un petit reboot (où un &lt;code&gt;/etc/rc.d/pleins_de_trucs restart&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Sur OpenBSD :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# /etc/hostname.vr0
inet 192.168.0.1 255.255.255/0
inet6 2a01:e35:2E58:9820::3 64
# /etc/mygate (freebox)
192.168.0.254
2a01:e35:2E58:9820::1
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Après il faut modifier votre &lt;code&gt;pf.conf&lt;/code&gt; en supprimant &lt;code&gt;inet&lt;/code&gt; de vos règles de filtrage comme ça on sous entend &lt;code&gt;inet&lt;/code&gt; et &lt;code&gt;inet6&lt;/code&gt;, concernant icmp c&#39;est plus délicat parce qu&#39;il y a deux protocoles.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# /etc/pf.conf
pass in inet proto icmp
pass in inet6 proto icmp6
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ensuite ça devrait tourner :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% ping6 -c 2 www.google.com
PING6(56=40+8+8 bytes) 2a01:e35:2e58:9820::2 --&amp;gt; 2a00:1450:8002::67
16 bytes from 2a00:1450:8002::67, icmp_seq=0 hlim=54 time=49.177 ms
16 bytes from 2a00:1450:8002::67, icmp_seq=1 hlim=54 time=53.867 ms

--- www.l.google.com ping6 statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 49.177/51.522/53.867/2.345 ms

% traceroute6 www.google.com
traceroute6: Warning: www.l.google.com has multiple addresses; using 2a00:1450:8002::6a
traceroute6 to www.l.google.com (2a00:1450:8002::6a) from 2a01:e35:2e58:9820::2, 64 hops max, 12 byte packets
 1  2a01:e35:2e58:9820::1  0.589 ms  0.530 ms  0.480 ms
 2  6to4-b8-e3.intf.routers.proxad.net  35.128 ms  33.359 ms  38.152 ms
....
# HO LE VILAIN TUNEL ! :&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Vous voilà en IPV6, la première chose à faire c&#39;est reconfigurer votre parre feu, normalement vous n&#39;aurez pas à doubler chaque lignes, enlevez juste &lt;code&gt;inet&lt;/code&gt; là où il faut et ça passe. Les seules lignes à doubler sont les redirections (&lt;code&gt;rdr&lt;/code&gt;), parce qu&#39;il faut envoyer sur une adresse IPV4 ou sur une adresse IPV6.&lt;/p&gt;
&lt;p&gt;Dans le prochain billet j&#39;expliquerais comment passer petit à petit ses softs sur IPV6.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Jouons avec kvm</title>
			<link>http://blog.philpep.org/post/Jouons-avec-kvm</link>
			<guid>http://blog.philpep.org/post/Jouons-avec-kvm</guid>
			<pubDate>Sat, 13 Feb 2010 02:31:41 GMT</pubDate>
			<description>&lt;p&gt;J&#39;ai codé un petit programme tout simple qui fait clignoter les leds de mon routeur dès qu&#39;un service est par terre. Ma méthode (qui ne doit pas être la meilleure mais je m&#39;en fout un peu) consiste à regarder régulièrement la liste des processus et détecter l&#39;arrêt d&#39;un service quand le processus associé n&#39;existe plus. J&#39;ai commencé avec un script shell, puis étant assez mauvais pour tout ce qui ressemble de près ou de loin à du script j&#39;ai décidé de le faire en C (langage d&#39;excellence n&#39;est ce pas...?).&lt;/p&gt;
&lt;p&gt;Je me suis volontairement compliqué la tache en utilisant des fonctions très proches du système, ainsi s&#39;il est possible d&#39;obtenir une liste de processus via &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=ps&#34;&gt;ps(1)&lt;/a&gt; avec un &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=popen&#34;&gt;popen(3)&lt;/a&gt; super crade ou encore &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=sysctl&amp;amp;sektion=3&#34;&gt;sysctl(3)&lt;/a&gt; j&#39;ai voulu utiliser &lt;a href=&#34;http://www.freebsd.org/cgi/man.cgi?query=kvm&#34;&gt;kvm(3)&lt;/a&gt; &lt;code&gt;kernel memory interface&lt;/code&gt; qui est en programmation système la méthode la plus appropriée (d&#39;ailleurs &#39;ps&#39; est codé avec ça), c&#39;est juste une interface qui va nous permettre d&#39;accéder au données du kernel (une copie bien entendu), ici la liste des processus en cours.&lt;/p&gt;
&lt;p&gt;Le hic c&#39;est que si les fonctions de kvm sont très standard l&#39;implémentation est très différente suivant les systèmes, comme à peu près toute implémentation, l&#39;important c&#39;est que l&#39;interface soit standard. Ainsi à la lecture de la structure qui décrit les processus &lt;code&gt;kinfo_proc&lt;/code&gt; de &lt;a href=&#34;http://svn.freebsd.org/viewvc/base/head/sys/sys/user.h?view=markup&#34;&gt;sys/user.h&lt;/a&gt; on se dit chouette pleins d&#39;info à disposition, sauf que sur OpenBSD c&#39;est pas du tout la même forme (ni le même fichier d&#39;ailleurs). D&#39;où l&#39;importance d&#39;une interface riche et c&#39;est ce que nous promet &lt;code&gt;kvm&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Assez causé passons au code (je n&#39;explique pas ou peu le code en dehors des fonctions kvm)&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;err.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;libgen.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;limits.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;paths.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;kvm.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/param.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/sysctl.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/wait.h&amp;gt;&lt;/span&gt;
&lt;span class=&#34;cp&#34;&gt;#include &amp;lt;sys/user.h&amp;gt;&lt;/span&gt;

&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;start_leds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;cm&#34;&gt;/* Ici on execute /usr/sbin/gioctl -q gpio0 led3 (on|off)&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * suivant la parité du conteur statique &amp;#39;i&amp;#39;&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * 60 fois avec une pause d&amp;#39;une seconde. */&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fork&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;:
            &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;fork&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;:
            &lt;span class=&#34;n&#34;&gt;execl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;/usr/sbin/gpioctl&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;gpioctl&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;-q&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;gpio0&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
                    &lt;span class=&#34;s&#34;&gt;&amp;quot;led3&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;on&amp;quot;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;execl&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;nl&#34;&gt;default:&lt;/span&gt;
            &lt;span class=&#34;n&#34;&gt;wait&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;start_leds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;
&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[])&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;n&#34;&gt;kvm_t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;berr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_POSIX2_LINE_MAX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kinfo_proc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;procs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;errx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;Usage check_proc procs ...&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;

    &lt;span class=&#34;cm&#34;&gt;/* On accède aux données du kernel qui tourne actuellement (NULL) */&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;O_RDONLY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;berr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;errx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;%s&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;berr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;

    &lt;span class=&#34;cm&#34;&gt;/* On demande la liste des processus, kinfo_proc est décrite&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * dans sys/sysctl.h sur OpenBSD et sys/user.h sur FreeBSD.&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * Il nous la donne dans un tableau continu de pointeurs de&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;     * taille qu&amp;#39;on récupère dans &amp;#39;n&amp;#39;. */&lt;/span&gt;
    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;procs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_getprocs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KERN_PROC_ALL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;kvm_getprocs: %s&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_geterr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;procs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;j&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;cm&#34;&gt;/* On accède à la liste des arguments du programme qui a&lt;/span&gt;
&lt;span class=&#34;cm&#34;&gt;             * généré le processus courant. */&lt;/span&gt;
            &lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_getargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                    &lt;span class=&#34;n&#34;&gt;strstr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pargv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]))&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
                    &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
                    &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kvm_close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;kvm_close&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
        &lt;span class=&#34;n&#34;&gt;start_leds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;

    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et l&#39;exécution, on veut tester si un processus du nom de &#39;dhcpd&#39; tourne sur le système, si ce n&#39;est pas le cas on lance le clignotement de la led pendant une minute :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# gcc -o check_proc check_proc.c -lkvm
# ./check_proc dhcpd
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Le mien s&#39;exécute dans un cron toute les minutes :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;* * * * * /root/bin/check_proc named dhcpd adsuck ntpd
&lt;/pre&gt;&lt;/div&gt;</description>
		</item>
		<item>
			<title>Adsuck pour remplacer privoxy</title>
			<link>http://blog.philpep.org/post/Adsuck-pour-remplacer-privoxy</link>
			<guid>http://blog.philpep.org/post/Adsuck-pour-remplacer-privoxy</guid>
			<pubDate>Thu, 11 Feb 2010 02:27:05 GMT</pubDate>
			<description>&lt;p&gt;Sur les trois machines clientes chez moi (dont deux avec l&#39;OS à la pomme et de browsers douteux), filtrer les pubs du web au niveau du réseau tout entier est vital, puis il m&#39;arrive de tester des browsers autres que firefox (dans le genre webkit-gtk/bindings vim) et là adblock ne m&#39;est d&#39;aucuns secours.&lt;/p&gt;
&lt;p&gt;Pendant un temps j&#39;utilisais &lt;a href=&#34;http://www.privoxy.org&#34;&gt;privoxy&lt;/a&gt; sur &lt;a href=&#34;/tag/alix&#34;&gt;mon routeur OpenBSD&lt;/a&gt;, mais je lui ai trouvé plusieurs defauts :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les regexp de base sont très éfficaces mais il y a malheureusement beaucoup de faux positifs.&lt;/li&gt;
&lt;li&gt;Le temps de traitement amène une lenteur parfois perceptible.&lt;/li&gt;
&lt;li&gt;Je l&#39;avais en proxy transparent, donc y&#39;a toujours quelqu&#39;un au bout du &#39;telnet machin 80&#39; (ça peut être génant)&lt;/li&gt;
&lt;li&gt;Configuration et maintenance pas franchement agréable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Du coup en &lt;a href=&#34;/post/Alix-fail-et-OpenWrt&#34;&gt;reinstallant&lt;/a&gt; le routeur j&#39;ai cherché une alternative, et j&#39;ai trouvé &lt;a href=&#34;http://www.peereboom.us/adsuck/&#34;&gt;adsuck&lt;/a&gt;. C&#39;est du filtrage dns, assez violent mais beaucoup plus rapide et tout aussi éfficace.&lt;/p&gt;
&lt;p&gt;Pour le moment ce soft est codé par et pour OpenBSD, mais ça doit pas être méchant à compiler sur autre chose.&lt;/p&gt;
&lt;p&gt;L&#39;install :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# export PKG_PATH=ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/packages/i386/
# pkg_add adsuck
# cat &amp;gt;&amp;gt; /etc/rc.local &amp;lt;&amp;lt; EOF
if [ &amp;quot;&amp;quot; != &amp;quot;NO&amp;quot; -a -x /usr/local/sbin/adsuck ]; then
    echo -n &amp;#39; adsuck&amp;#39;; /usr/local/sbin/adsuck $adsuck_flags
fi
EOF
# cat &amp;gt;&amp;gt; /etc/rc.conf.local &amp;lt;&amp;lt; EOF
adsuck_flags=&amp;quot;-c /var/adsuck -l 127.0.0.1 -p 54 -f /files/resolv.conf /files/hosts.small /files/Hosts.pub /files/local.pub&amp;quot;
EOF
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Comme j&#39;ai un vrai serveur DNS (pour le réseau local mais aussi pour mes domaines), j&#39;ai lancé adsuck sur le port 54 (dns normal c&#39;est 53) et fait une redirection pour le réseau local avec &lt;a href=&#34;/tag/Packet%20filter&#34;&gt;pf&lt;/a&gt;, adsuck va lui même servir de proxy entre le réseau local et le serveur DNS qui tourne sur localhost en particulier.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# echo &amp;quot;nameserver 127.0.0.1&amp;quot; &amp;gt; /var/adsuck/files/resolv.conf
# touch /var/adsuck/files/local.pub
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;On lance une première fois :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# adsuck -c /var/adsuck -l 127.0.0.1 -p 54 -f /files/resolv.conf /files/hosts.small /files/Hosts.pub /files/local.pub
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Si ça se lance, on peut rediriger le traffic du réseau local vers adsuck :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;table &amp;lt;local&amp;gt; const { 192.168.0.0/24 }
rdr pass on $ext_if proto udp from &amp;lt;local&amp;gt; to $ext_if port domain -&amp;gt; lo0 port 54
# Si vous êtes vraiment méchant vous pouvez enlever le 2ème $ext_if :)
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maintenant sur une machine du réseau local :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;% host www.smartadserver.com dns1.proxad.net
www.smartadserver.com has address 91.103.138.65
% host www.smartadserver.com
Host www.smartadserver.com not found: 3(NXDOMAIN)
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et vous voilà avec un net plus très neutre mais épuré de toute publicité. Pour rajouter des sites, je vous ai fait créer un &lt;code&gt;/var/adsuck/files/local.pub&lt;/code&gt;, la syntaxe est simple :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;127.0.0.1 domaine_moisi.com
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et pour faire relire les listes à adsuck :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# kill -USR1 `pgrep adsuck`
&lt;/pre&gt;&lt;/div&gt;</description>
		</item>
		<item>
			<title>Alix fail et OpenWrt</title>
			<link>http://blog.philpep.org/post/Alix-fail-et-OpenWrt</link>
			<guid>http://blog.philpep.org/post/Alix-fail-et-OpenWrt</guid>
			<pubDate>Mon, 08 Feb 2010 14:46:46 GMT</pubDate>
			<description>&lt;p&gt;Ce week end j&#39;ai essuyé pas mal  d&#39;échecs en tout genres, j&#39;ai une superbe &lt;a href=&#34;/tag/alix&#34;&gt;alix&lt;/a&gt; qui tourne sur &lt;a href=&#34;/tag/OpenBSD&#34;&gt;OpenBSD&lt;/a&gt; et j&#39;ai une carte wifi en minipci dessus qui marche passablement mal sur OpenBSD (tous les modes ne marchent pas et beaucoup de pertes de paquets quand ça marche).&lt;/p&gt;
&lt;p&gt;Du coup je me mis en tête le fait que ça tournera mieux sous un autre OS, j&#39;ai donc essayé dans l&#39;ordre &lt;a href=&#34;/tag/FreeBSD&#34;&gt;FreeBSD&lt;/a&gt;, Debian et &lt;a href=&#34;http://openwrt.org&#34;&gt;OpenWrt&lt;/a&gt;. Aucuns n&#39;a su faire tourner ma carte même avec les derniers drivers, j&#39;avais même pas d&#39;interface, comme quoi le support matériel sur OpenBSD est pas aussi mauvais qu&#39;on le pense.&lt;/p&gt;
&lt;p&gt;Donc si quelqu&#39;un à réussi à faire tourner convenablement la carte &lt;a href=&#34;http://linitx.com/viewproduct.php?prodid=11331&#34;&gt;Engenius NMP-8602+ 400mW a/b/g miniPCI&lt;/a&gt; sur un OS libre merci de me faire signe.&lt;/p&gt;
&lt;p&gt;J&#39;ai donc remis OpenBSD dessus et enlevé la carte wifi (si quelqu&#39;un est intéressé je suis prêt à la céder d&#39;ailleurs, toute neuve jamais servie :&amp;gt;)&lt;/p&gt;
&lt;p&gt;J&#39;ai quand même beaucoup joué avec le boot pxe sur sortie série Linux/BSD donc je suis bien rodé là dessus maintenant. Et surtout j&#39;ai découvert OpenWrt, une toute petite distribution linux pour l&#39;embarqué, faite à la base pour flasher les firmware proprio sur les routeurs du marché elle tourne aussi bien sur tout autre matériel et c&#39;est un projet très dynamique et original. L&#39;installation par pxe est super simple, il suffit de compiler un &lt;a href=&#34;http://en.wikipedia.org/wiki/RAM_disk&#34;&gt;ramdisk&lt;/a&gt; et de démarrer dessus.&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;$ ls -l /usr/local/pxe/
total 1796
-rw-r--r--  1 phil  phil   1786396 Feb  7 15:41 openwrt-x86-vmlinuz
-rwxr-xr-x  1 root  wheel    16466 Feb  6 21:31 pxelinux.0
drwxr-xr-x  2 root  wheel      512 Feb  7 15:41 pxelinux.cfg
$ cat /usr/local/pxe/pxelinux.cfg/default
# Simplement spécifier la vitesse du port série
# 38400 ici
serial 0 38400 0
console 0
label linux
kernel openwrt-x86-vmlinuz
append init=/etc/preinit console=tty0 console=ttyS0,38400n8 reboot=bios
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Après c&#39;est du pxe classique, tftp et dhcpd et ça démarre :&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;openwrt&#34; src=&#34;/static/pub/openwrt.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Après il suffit d&#39;envoyer l&#39;image sur le disque dur (soit la votre, soit celle qui est distribuée) :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;root@Solo:/# wget http://downloads.openwrt.org/kamikaze/8.09.2/x86/openwrt-x86-squashfs.image
root@Solo:/# dd if=openwrt-x86-squashfs.image of=/dev/hda
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et &lt;em&gt;c&#39;est tout&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;À coté de ça vous avez une interface de configuration web convi, un petit sshd &lt;a href=&#34;http://matt.ucc.asn.au/dropbear/dropbear.html&#34;&gt;dropbear&lt;/a&gt; et pleins de packages disponible (très orienté réseau bien sûr). Ça doit être encore plus réjouissant quand on flashe un routeur wifi proprio :)&lt;/p&gt;
&lt;p&gt;Mais bon, alix mérite qu&#39;on l&#39;exploite plus que ça, j&#39;aime bien l&#39;interface web mais j&#39;aime mieux éditer mon &lt;a href=&#34;/tag/Packet%20Filter&#34;&gt;pf.conf&lt;/a&gt; avec &lt;a href=&#34;/tag/vim&#34;&gt;vim&lt;/a&gt;.&lt;/p&gt;</description>
		</item>
		<item>
			<title>pfstat</title>
			<link>http://blog.philpep.org/post/pfstat</link>
			<guid>http://blog.philpep.org/post/pfstat</guid>
			<pubDate>Sun, 06 Dec 2009 02:57:24 GMT</pubDate>
			<description>&lt;p&gt;J&#39;aime pas franchement les graphe les chiffres tout ça (j&#39;entends déjà rire les gens qui me connaissent devant ce mensonge éhonté). Mais j&#39;avoue que j&#39;aime bien les stats donnée par  &lt;a href=&#34;http://www.benzedrine.cx/pfstat.html&#34;&gt;pfstat&lt;/a&gt; (le site est souvent down en ce moment). Ce petit soft récolte des statistiques temporelles sur &lt;a href=&#34;/tag/Packet%20Filter&#34;&gt;pf&lt;/a&gt; et peut les cracher sous forme de graphe.&lt;/p&gt;
&lt;p&gt;Petit exemple tout de suite, ce graphe représente le traffic entrant/sortant (in/out) autorisé/bloqué (block in/block out) sur mon routeur pour les dernières 24h.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;stats solo&#34; src=&#34;http://www.philpep.org/stats/solo_packets_day.jpg&#34; /&gt;&lt;/p&gt;
&lt;p&gt;C&#39;est assez interessant, il peut faire une multitude de graphes configurables, je vais pas poser ma conf ici parce que je l&#39;ai honteusement pompée sur &lt;a href=&#34;https://calomel.org/pfstat.html&#34;&gt;calomel&lt;/a&gt;. À noter que pfstat est aussi disponible en daemon (pfstatd), ça permet de générer les images des statistiques d&#39;une autre machine. Il suffit de lancer pfstatd sur la machine ou l&#39;on veut faire des statistiques, et lancer pfstat (dans cron par exemple) avec les options &lt;code&gt;-r host:port&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vous pouvez voir &lt;a href=&#34;http://www.philpep.org/stats/&#34;&gt;ici&lt;/a&gt; ce qui se passe sur mes deux modestes machines qui font exister philpep.org.&lt;/p&gt;
&lt;p&gt;EDIT 10 janvier 2010 : pfstat ne semble plus maintenu :/ , en tout cas il a du mal avec les dernières versions de pf. Bref les graphes que vous voyez sont &lt;em&gt;vieux&lt;/em&gt;&lt;/p&gt;</description>
		</item>
		<item>
			<title>Controler les leds sur ALIX 2D3</title>
			<link>http://blog.philpep.org/post/Controler-les-leds-sur-ALIX-2D3</link>
			<guid>http://blog.philpep.org/post/Controler-les-leds-sur-ALIX-2D3</guid>
			<pubDate>Mon, 02 Nov 2009 21:30:58 GMT</pubDate>
			<description>&lt;p&gt;Il y a 4 leds sur le devant, la première est réservée par l&#39;alimentation et la dernière par la carte minipci, mais les deux autres sont à disposition pour nos amis scripteur. Ces deux leds se contrôlent sur les broches 25 et 27 du gpio.&lt;/p&gt;
&lt;p&gt;Il faut les activer avant que securelevel passe à 1. Dans &lt;code&gt;/etc/rc.securelevel&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;# Configuring the leds
echo -n &amp;quot;Configuring the leds : &amp;quot;
/usr/sbin/gpioctl gpio0 25 set out led2
/usr/sbin/gpioctl gpio0 27 set out led3
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Un petit reboot, et vous pouvez controler vos leds (q = quiet) avec :&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;gpioctl -q gpio0 led2 off
gpioctl -q gpio0 led2 on
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A vous de scripter ce que vous voulez derrière, style un script qui fait clignoter la led si la passerelle est accessible etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.lekermeur.net/?page_id=565&#34;&gt;Exemple de script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
		</item>
		<item>
			<title>Spamd</title>
			<link>http://blog.philpep.org/post/Spamd</link>
			<guid>http://blog.philpep.org/post/Spamd</guid>
			<pubDate>Sat, 31 Oct 2009 13:50:31 GMT</pubDate>
			<description>&lt;p&gt;Spamd ou comment bloquer les spams sans discriminer à priori des adresses IPs et sans remettre en cause la neutralité du réseau.&lt;/p&gt;
&lt;p&gt;J&#39;ai écrit une &lt;a href=&#34;http://wiki.bender-labs.org/bsd/spamd&#34;&gt;page sur spamd&lt;/a&gt; sur le principe de fonctionnement et sa mise en place sur OpenBSD.&lt;/p&gt;
&lt;p&gt;Ce tout nouveau wiki cogéré par &lt;a href=&#34;http://www.philpep.org&#34;&gt;philpep.org&lt;/a&gt; et &lt;a href=&#34;http://www.bender-labs.org&#34;&gt;bender-labs.org&lt;/a&gt; est plus adapté que mon blog pour ce genre de choses car vous pouvez aussi apporter votre contribution pour faire part de votre expérience (ne serait-ce que pour corriger d&#39;éventuelles fautes d&#39;orthographes et de grammaires :-) ).&lt;/p&gt;</description>
		</item>
	</channel>
</rss>

