Christophe Nowicki

June 16, 2014

Déploiement “en masse” de noyau Linux personnalisé et durci à l’aide de Puppet

200px-Pax_tux

Comme tout barbu qui se respecte, j’aime avoir un noyau Linux, dont la configuration correspond parfaitement au matériel et à l’utilisation d’une machine.

Pour cela j’ai développé un module Puppet qui permet de déployer des noyaux Linux personnalisés et durcis.

Problématique

Compiler et personnaliser la configuration du noyau d’une seule machine est une tâche qui nécessite :

  • une bonne connaissance des options du noyau ;
  • connaissance du matériel et des drivers correspondants ;
  • du temps ;

Il y a de cela une dizaines d’année il était fréquent de compiler une version personnalisée du noyau Linux, mais aujourd’hui le noyau fourni par une distribution GNU/Linux, contient une grande quantité de pilotes et couvre la plupart des besoins.

Il n’y a pas de différence de performance entre un pilote de périphériques compiler en “dur” dans le noyau et charger en modules.

Les seules raisons de compiler un noyau personnalisé sont :

  • la vitesse de démarrage ;
  • et la sécurité.

C’est ce dernier point qui m’a poussé à mettre en place un système de compilation de noyau Linux automatisé.

Module Puppet

Le module Puppet dispose des fonctionnalités suivantes :

  • installation et décompression des sources du noyau dans /usr/src ;
  • application du patch grsecurity ;
  • écriture d’un fichier de configuration personnalisé ;
  • re-compilation du noyau et création d’un paquet pour la distribution Debian GNU/Linux ;
  • compilation en cas de changement de la configuration ;
  • TODO : installation du paquet et reboot sur le nouveau noyau à l’aide de kexec ;

Gestion de la configuration du noyau

D’après le LKDDb (Linux Kernel Driver DataBase), il y a plus de 19 000 options différentes dans un noyau Linux.

L’approche classique pour la gestion d’un tel nombre d’options est l’utilisation d’un tableur Excel ;-)

Mais la plupart des utilisateurs conservent les fichiers de configuration directement sur le système de fichier ou dans un logiciel de gestion de version.

Mais cette approche ne me satisfait pas, j’ai donc opté pour l’utilisation d’une base de données hiérarchique : Hiera

Structure hiérarchique

La structure adoptée est la suivante :

# /etc/puppet/hiera.yaml
---
:backends:
  - yaml
:yaml:
  :datadir: /etc/puppet/hiera/
:logger: puppet
:hierarchy:
  - "fqdn/%{::fqdn}"
  - "boardproductname/%{::boardproductname}"
  - "hardwaremodel/%{::hardwaremodel}"
  - common

common.yaml

Contient la configuration commune à toutes les machines et la “négation” des options, ce qui évite à make-kdpkg de choisir une option par défaut :

# /etc/puppet/hiera/common.yaml
---
linux-grsec::kernel::config:
    CONFIG_CGROUP_DEBUG: n
    CONFIG_CGROUP_FREEZER: n
    CONFIG_CGROUP_DEVICE: n
    CONFIG_CPUSETS: n
    CONFIG_PROC_PID_CPUSET: n
    CONFIG_CGROUP_CPUACCT: n
    CONFIG_RESOURCE_COUNTERS: n
    CONFIG_MEMCG: n
    CONFIG_CGROUP_HUGETLB: n
    CONFIG_CGROUP_PERF: n
    CONFIG_CGROUP_SCHED: n
    CONFIG_FAIR_GROUP_SCHED: n
    CONFIG_CFS_BANDWIDTH: n
    CONFIG_RT_GROUP_SCHED: n
    CONFIG_BLK_CGROUP: n
    CONFIG_CHECKPOINT_RESTORE: n    
    CONFIG_GRKERNSEC: y
    CONFIG_GRKERNSEC_CONFIG_AUTO: n
    CONFIG_GRKERNSEC_CONFIG_CUSTOM: y
    CONFIG_PAX: y
...

Répertoires hardwaremodel et boardproductname

Le répertoire hardwaremodel contiens la définition d’un architecture :

/etc/puppet/hiera/hardwaremodel/
├── i586.yaml
├── i686.yaml
└── x86_64.yaml

Comme par exemple l’architecture x86_64:

# /etc/puppet/hiera/hardwaremodel/x86_64.yaml
---
linux-grsec::kernel::config: 
    CONFIG_64BIT: y
    CONFIG_X86_64: y
    CONFIG_OUTPUT_FORMAT: '"elf64-x86-64"'
    CONFIG_ARCH_DEFCONFIG: '"arch/x86/configs/x86_64_defconfig"'

Le répertoire boardproductname contient la définition des pilote de périphériques pour une machine :

/etc/puppet/hiera/boardproductname/
├── beagleboneblack.yaml
├── C7Q67.yaml
├── D33217GKE.yaml
├── DN2800MT.yaml
├── net5501.yaml
├── net6501.yaml
├── raspberrypi.yaml
├── wandboard.yaml
├── X7SPA-HF.yaml
├── X9SCL.yaml
└── Z68MA-D2H-B3.yaml

Par exemple, pour un net5501 de Soekris Inc. :

# /etc/puppet/hiera/boardproductname/net5501.yaml
---
linux-grsec::kernel::config:
    CONFIG_SMP: n
    CONFIG_X86_64_SMP: n
    CONFIG_X86_32_SMP: n
    CONFIG_RCU_FANOUT: 32
    CONFIG_MGEODE_LX: y
    CONFIG_X86_GENERIC: n
    CONFIG_GENERIC_CPU: n
    CONFIG_NET_VENDOR_VIA: y
    CONFIG_VIA_RHINE: y
    CONFIG_VIA_RHINE_MMIO: y
    CONFIG_HW_RANDOM_GEODE: y
    CONFIG_FB_GEODE: y
    CONFIG_CRYPTO_DEV_GEODE: y
    CONFIG_CRC_T10DIF: y
    CONFIG_ATA_GENERIC: y
    CONFIG_PATA_CS5536: y
    CONFIG_CS5535_MFGPT: y
    CONFIG_SENSORS_PC87360: y
    CONFIG_I2C: y
    CONFIG_SCx200_ACB: y
    CONFIG_LEDS_NET5501: y

Répertoire fqdn

Le répertoire fqdn contient les options spécifique à une machine et à ses fonctionnalités (ici une gateway VPN avec StrongSwan et l’IPS Suricata ) :

# /etc/puppet/hiera/fqdn/foo.bar.yaml
---
linux-grsec::kernel::config:
# StrongSwan
    CONFIG_XFRM_USER: y
    CONFIG_NET_KEY: y
    CONFIG_NET_KEY_MIGRATE: n
    CONFIG_IP_ADVANCED_ROUTER: y
    CONFIG_IP_MULTIPLE_TABLES: y
    CONFIG_INET_AH: y
    CONFIG_INET_ESP: y
    CONFIG_INET_IPCOMP: y
    CONFIG_INET_XFRM_MODE_TRANSPORT: y
    CONFIG_INET_XFRM_MODE_TUNNEL: y
    CONFIG_INET_XFRM_MODE_BEET: y
    CONFIG_NET_IPVTI: n
    CONFIG_IPV6: y
    CONFIG_INET6_AH: y
    CONFIG_INET6_ESP: y
    CONFIG_INET6_IPCOMP: y
    CONFIG_INET6_XFRM_MODE_TRANSPORT: y
    CONFIG_INET6_XFRM_MODE_TUNNEL: y
    CONFIG_INET6_XFRM_MODE_BEET: y
    CONFIG_IPV6_MULTIPLE_TABLES: y
    CONFIG_IPV6_SUBTREES: n
    CONFIG_NETFILTER: y
    CONFIG_NETFILTER_XTABLES: y
    CONFIG_NETFILTER_XT_MATCH_POLICY: y
# Suricata
    CONFIG_NETFILTER_ADVANCED: y
    CONFIG_BRIDGE_NETFILTER: n
    CONFIG_NETFILTER_NETLINK_QUEUE: y
    CONFIG_NETFILTER_NETLINK_ACCT: y
    CONFIG_NETFILTER_XT_TARGET_NFQUEUE: y
...

Configuration finale

$ hiera -h  linux-grsec::kernel::config ::hardwaremodel i586 ::boardproductname net5501 ::fqdn foo.bar
{"CONFIG_NETFILTER_XT_MATCH_STATISTIC"=>"n",
 "CONFIG_BLK_DEV_RSXX"=>"n",
 "CONFIG_USB_CATC"=>"n",
 "CONFIG_MMU"=>"y",
 "CONFIG_GPIO_BCM_KONA"=>"n",
 "CONFIG_CHELSIO_T4VF"=>"n",
 "CONFIG_SERIAL_CORE"=>"y",
 "CONFIG_DM_MIRROR"=>"y",
 "CONFIG_IO_DELAY_TYPE_NONE"=>3,
 "CONFIG_MMC_TEST"=>"n",
...

Exemple d’utilisation

# puppet agent -t
...
info: Applying configuration version '1402952642'
notice: /Stage[main]/Linux-grsec::Kernel/File[/usr/src/foo.config]/ensure: created
info: /Stage[main]/Linux-grsec::Kernel/File[/usr/src/foo.config]: Scheduling refresh of Exec[make-kpkg]
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/linux-3.14.4.tar.xz]/ensure: defined content as '{md5}c7c565d14833550faa39ef8279272182'
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/grsecurity-3.0-3.14.4-201405141623.patch]/ensure: defined content as '{md5}e88a81b0c222d14e228dc29dd76a875a'
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/grsecurity-3.0-3.14.4-201405141623.patch.sig]/ensure: defined content as '{md5}737b22b6e8cae0d4398ba3f68acaf1e1'
notice: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4/grsecurity]/returns: executed successfully
info: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4/grsecurity]: Scheduling refresh of Exec[make-kpkg]
notice: /Stage[main]/Linux-grsec::Install/Exec[/usr/src/linux-3.14.4]/returns: executed successfully
notice: /Stage[main]/Linux-grsec::Install/File[/usr/src/linux-3.14.4/.config]/ensure: created
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: exec make kpkg_version=12.036+nmu3 -f /usr/share/kernel-package/ruleset/minimal.mk debian APPEND_TO_VERSION=-foo  INITRD=YES 
...
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: cp -pf debian/control.dist          debian/control
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: make[2]: Leaving directory `/usr/src/linux-3.14.4'
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]/returns: make[1]: Leaving directory `/usr/src/linux-3.14.4'
notice: /Stage[main]/Linux-grsec::Install/Exec[make-kpkg]: Triggered 'refresh' from 2 events
notice: Finished catalog run in 179.65 seconds
..
# dpkg -i linux-*.deb

Conclusion

Ce système me permet de déployer des noyaux GRSec sur la petite dizaine de machines de mon réseau local.

Cette méthode ne convient pas au domaine de l’embarqué, (rasberrypi, beaglebone black, wandboard, etc… ) car l’espace disque et la puissance de calcul nécessaire ne sont pas disponible sur ce type de machine.

Références

Filed under: Debian — Tags:, , , , , , , — cscm @ 22:33

March 29, 2010

Migration d’un réseau Debian GNU/Linux vers IPv6 et au-delà …

Migration IPv6

C’était une tâche sur ma TODO liste depuis quelques années…
J’ai enfin franchi le pas et migré mon réseau vers IPv6.

Cette migration n’est pas encore évidente et j’ai rencontré quelques problèmes dont je voulais vous faire part dans ce billet.

L’objectif inavouable de cette migration était de rendre mon réfrigérateur directement accessible depuis le travail ;-)

Amis manchots, suivez- moi ;-)

Présentation d’IPv6

IPv6 c’est le futur ©, l’avenir du monde libre, c’est le monde de demain … puisqu’on vous le dit depuis 10ans^W^W!

Bref, je ne vais pas vous faire un long discours sur le sujet mais
plus simplement vous expliquer ce qui a réellement motivé ma migration.

Comme vous le savez sûrement, je m’intéresse un peu à la domotique et à la culture D.I.Y., ce qui m’a permis de découvrir quelques concepts sympathiques et connexe au domaine tels que :

  • Physical computing : l’intéraction entre un processeur et le monde physique ;
  • Ambient intelligence : L’Intelligence ambiante, la fonte de l’informatique dans nos objets de tous les jours ;
  • Internet of Things : L’Internet des objets, l’extension de l’Internet au monde réel.

Pour émerger, ces concepts ont tous besoin de la même chose : un nouveau protocole Internet permettant :

  • d’augmenter sensiblement le nombre d’adresses disponibles ;
  • des mécanismes de configuration automatique ;
  • la sécurité et de la mobilité.

Avec IPv6, il est possible de connecter :

Bref, cela permet d’ouvrir de nombreuses possibilités ;-)

Tunnel

Si votre fournisseur d’accès Internet ne met pas à votre disposition une collectivité IPv6 native, alors vous aurez besoin de mettre en place un tunnel 6to4.
Visiblement seuls Nerim et FDN offrent en France un collectivités IPv6 native.

IPv6 Tunnel Brocker

Pour obtenir un tunnel, il suffit d’ouvrir un compte chez Hurricane Electric (HE), vous devez suivre la procédure décrite avec des copies d’écran sur howto forge.

Fonctionnalités

HE vous fournit les services suivants :

  • Tunnel 6to4 ;
  • Deux sous-réseau IPv6 : /64 et /48 ;
  • Serveur DNS accessible en IPv4 et IPv6 ;
  • Résolution inverse DNS sur vos deux sous réseaux ;
  • Une certification de vos compétences IPv6 et du bon fonctionnement de votre reseau.

Un des gros avantage de HE est de vous fournir un sous-réseau /48 qu’il est possible de découper en plusieurs sous-réseau /64 en fonction de vos besoins : LAN, DMZ, Réseau de capteurs, etc…

Configuration du pare-feu Shorewall

DMZ avec un s

Comme la plupart des réseaux, j’utilise le principe de DMZ pour les services accessibles publiquement en IPv4.

Comme IPv6 me fournit beaucoup plus d’adresses publiques, il est possible de découper la route /48 fourni par HE en plusieurs DMZ.

Installation de Shorewall6

Pour la gestion du pare-feu, j’utilise les scriptes fournis par le projet Shorewall, qui facilite grandement l’écriture et l’organisation des règles.
Pour la gestion de l’IPv6, il est nécessaire d’utiliser une version spécifique : shorewall6.
Celle-ci est disponible dans les versions squeeze et sid de Debian, il est donc nécessaire de backporter le paquet.
Il suffit donc de backporter la version 4.4 de shorewall dans lenny :

# cd /usr/src
# wget http://ftp.de.debian.org/debian/pool/main/s/shorewall6/shorewall6_4.4.7.4-2.dsc
# wget http://ftp.de.debian.org/debian/pool/main/s/shorewall6/shorewall6_4.4.7.4.orig.tar.gz
# wget http://ftp.de.debian.org/debian/pool/main/s/shorewall6/shorewall6_4.4.7.4-2.diff.gz
# wget http://ftp.de.debian.org/debian/pool/main/s/shorewall/shorewall_4.4.7.5-1.dsc
# wget http://ftp.de.debian.org/debian/pool/main/s/shorewall/shorewall_4.4.7.5.orig.tar.gz
# wget http://ftp.de.debian.org/debian/pool/main/s/shorewall/shorewall_4.4.7.5-1.diff.gz
# dpkg-source -x shorewall6_4.4.7-2.dsc
# dpkg-source -x shorewall_4.4.7-1.dsc
# cd shorewall-4.4.7
# dpkg-buildpackage -b
...
# dpkg -i ../shorewall-common*
# dpkg -i ../shorewall-all*
# dpkg -i ../shorewall-shell*
# cd ../shorewall6-4.4.7
# dpkg-buildpackage -b
# dpkg -i ../shorewall6*.deb

Configuration du tunnel

Pour le tunnel 6to4, il est nécessaire de modifier le fichier /etc/shorewall/tunnels de Shorewall (IPv4) :
###############################################################################
#TYPE ZONE GATEWAY GATEWAY
6to4 net IP
#

Migration de la configuration

Vous devez ensuite migrer votre configuration de Shorewall IPv4 vers IPv6.
Pour cela vous pouvez vous aider avec les exemples fournis dans le /usr/share/doc/shorewall6/examples

La stratégie de filtrage est identique à celle en IPv4 : c’est à dire bloquer tous les services et ajouter des règles spécifiques pour autoriser des services. Il faut juste faire attention à l’ICMPv6 qui à un plus grand rôle dans le cas de IPv6.

Pour la configuration des fonctionnalités spécifiques à IPv6 dans Shorewall6, vous pouvez vous reporter directement à la documentation : Shorewall IPv6 Support

Configuration du DNS

Pour la configuration de mon serveur DNS, BIND prend en charge l’IPv6. J’ai donc créé une sous-zone v6.csquad.org pour les services uniquement accèssibles en IPv6 et attribués des addresses aux services publics existants :

$ grep AAAA /etc/bind/wan/db.csquad.org
        		AAAA    2001:470:c830::6
ns			AAAA	2001:470:c830::3
smtp			AAAA	2001:470:c830::10
www                      AAAA    2001:470:c830::6

Une sous-zone v6.csquad.org pour les services uniquement accessibles en IPv6:

$TTL    3600 ; 8 heures
@       IN      SOA ns.v6.csquad.org. hostmaster.csquad.org. (
                        2010031801      ; Serial
                                1D      ; Refresh
                                2H      ; Retry
                                6W      ; Expire
                         3600 ) ; Negative Cache TTL

                        NS      ns.v6.csquad.org.
                        A       82.247.220.114

ns              IN A 82.247.220.114

host             IN      AAAA    2042:42:42:42:42:42:42:42

La partie la plus difficile est la Zone inverse IPv6, car le contenu du fichier est très verbeux, et il est nécessaire de manipuler des adresses complexes à la main :

$TTL    3600 ; 8 heures
@       IN      SOA ns.v6.csquad.org. hostmaster.csquad.org. (
                        2010031602      ; Serial
                                1D      ; Refresh
                                2H      ; Retry
                                6W      ; Expire
                         3600 ) ; Negative Cache TTL

                        NS      ns.v6.csquad.org.

$ORIGIN 0.0.2.4.0.0.2.4.0.0.2.4.0.2.ip6.arpa.

2.4.0.0.2.4.0.0.2.4.0.0.2.4.0.0.2.4 IN PTR host.v6.csquad.org.

Pour vous aider, vous pouvez utiliser le programme ipv6calc :

$ ipv6calc --in ipv6addr --out revnibbles.arpa 2042:42:42:42:42:42:42:42
2.4.0.0.2.4.0.0.2.4.0.0.2.4.0.0.2.4.0.0.2.4.0.0.2.4.0.0.2.4.0.2.ip6.arpa.

Vous pouvez tester le bon fonctionnement du DNS IPv6 à l’aide de la commande dig :
$ dig +short -t aaaa host.v6.csquad.org
2042:42:42:42:42:42:42:42

Le reverse :
$ dig +short -x 2042:42:42:42:42:42:42:42
host.v6.csquad.org.

Google et ses amis

De nombreux services Internet ne sont pas IPv6 ready out of the box et utilisent des sous-zones DNS pour leur services accèssibles en IPv6. Par example Google :
$ dig +short -t aaaa www.google.com
$ dig +short -t aaaa ipv6.google.com
ipv6.l.google.com.
2a00:1450:8001::63
2a00:1450:8001::67
2a00:1450:8001::68
2a00:1450:8001::69
2a00:1450:8001::6a
2a00:1450:8001::93

La commande ne retourne pas d’adresse IPv6, car google réserve cette réponse aux ISP/services qui disposent d’une connectivité IPv6 :
$ dig +short -t aaaa @212.27.32.176 google.com
$ dig +short -t aaaa @4.2.2.2 google.com

Pas de réponse via le DNS de Free et le DNS Public de Google.
Par contre, si j’interroge le DNS de Hurricane Electric (HE) :
$ dig +short -t aaaa @74.82.42.42 google.com
2a00:1450:8001::68
2a00:1450:8001::93
2a00:1450:8001::6a
2a00:1450:8001::67
2a00:1450:8001::69
2a00:1450:8001::63

Il faut donc modifier le fichier /etc/bind/named.conf.local pour forwarder la résolution de certains noms de domaine via le DNS de HE :

zone "google.com" {
        type forward;
        forwarders {
                  2001:470:20::2;
        };
};

D’habitude, je fais du Google bashing, mais je dois avouer que cette fois-ci Google est le seul à résoudre en IPv6.
Les autres “Grands Noms de l’Internet” , ne disposent pas d’une connectivité IPv6, parmi ceux-ci :

  • wikipedia ;
  • facebook ;
  • twitter ;
  • flickr ;
  • yahoo ;
  • slashdot ;
  • linuxfr.org ;

Bref, seul google est IPv6 friendly, les autres acteurs de l’internet sont à la traine.

Vous pouvez tester tous ses noms de domaines via cette page : IPv6 websites accesibility.

Configuration des machines

Autoconfiguration

Pour l’auto-configuration des machines, vous devez installer le paquet radvd :
# apt-get install radvd
Et modifier le fichier de configuration /etc/radvd.conf pour prendre en charge votre interface LAN avec votre prefix IPv6, comme cela :

interface eth1
{
        AdvSendAdvert on;
        MaxRtrAdvInterval 30;
        prefix 2042:42:42:42::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr off;
                AdvValidLifetime 300;
                AdvPreferredLifetime 120;
        };
};

Ensuite vous devez relancer le daemon :
# /etc/init.d/radvd restart

Ensuite vous pouvez relancer l’interface réseau d’une machine et vérifier qu’elle à bien pris une adresse IPv6 :

# ip -f inet6 addr   | grep -B 1 global
4: eth0: <BROADCAST ,MULTICAST,MASTER,UP,LOWER_UP> mtu 9000
    inet6 2042:42:42:42:42:42:42:2/64 scope global dynamic

Cette adresse IPv6 est produite à l’aide du prefix v6 et l’adresse MAC de votre carte réseau.

IP statique

Vous pouvez aussi attribuer une adresse IPv6 statique à l’aide du fichier /etc/network/interfaces :

auto eth0
iface eth0 inet static
        address 192.168.0.11
        netmask 255.255.255.0
        gateway 192.168.0.100

iface eth0 inet6 static
        address 2042:42:42:42::1
        netmask 64
        gateway 2042:42:42:42::100

Linux-VServer

La version de Linux VServer disponible dans Debian “lenny” dispose du support IPv6.

Il suffit d’ajouter l’adresse ip à l’interface et relancer le serveur :

# cd /etc/vservers/NOM_MACHINE/interfaces
# mkdir 1
# echo "eth0" > dev
# echo "2042:42:42:42:42:42:42:42/64" > ip
# echo "NOM_MACHINE" > name
# vserver NOM_MACHINE restart

Migration des services

Apache

Pour la configuration d’Apache, il suffit d’ajouter dans le fichier /etc/apache2/ports.conf, l’adresse de votre service :

Listen [2042:42:42:42:42:42:42:42]:80
Listen [2042:42:42:42:42:42:42:42]:443

Puis d’utiliser cette adrese dans un VirtualHost :

<VirtualHost  [2042:42:42:42:42:42:42:42]:80>
        ServerName host.v6.csquad.org
...

Messagerie

La configuration de Postfix en IPv6, ne pose aucun problème particulier. Il suffit d’ajouter des enregistrements DNS AAAA à votre serveur de messagerie :

                        MX      10 smtp
smtp                    AAAA    2001:470:c830::10

Et de modifier le fichier /etc/postfix/main.cf :

mynetworks = 127.0.0.0/8 [::1]/128 [2001:470:c830::]/48 [2001:470:1f13:299::]/64
inet_interfaces = [2001:470:c830::10]
inet_protocols = ipv4, ipv6

Ensuite, vous pourrez recevoir des mails de la part de [2001:41b8:202:deb:…] ;-)

CUPS

La configuration est identique à celle d’apache. Il suffit de modifier la directive Listen du fichier /etc/cups/cupsd.conf.

Samba

Je n’ai pas testé, mais visiblement depuis 2008, Samba dispose d’un support d’IPv6 qui est parfaitement inter-opérable avec les versions recentes de Microsoft Windows : Archive for the ‘Samba’ Category sur le blog de Erion Services.

Squid

Pour faire fonctionner le proxy mandataire Squid avec IPv6, il est nécessaire de mettre à jours la version disponible dans Debian “lenny”, vers la version 3.1.
La procédure de mise à jours est décrite dans ce billet : Squid 3.1 on Debian Lenny

Jabber

Pour mon serveur Jabber, j’utilise ejabberd. La migration consiste simplement à ajouter votre interface IPv6 dans le fichier /etc/ejabberd/ejabberd.cfg, comme cela :


{listen,
[
{5222, ejabberd_c2s, [
inet6,
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536},
starttls, {certfile, "/etc/ejabberd/ejabberd.pem"}
]},
...

Le plus dur est de trouver un serveur jabber compatible IPv6 poour faire du s2s.

Téléphonie

Il existe une version spécifique d’Asterisk pour IPv6.,mais elle n’a pas été intégrée dans la branche principale du projet et elle n’a pas l’air d’être maintenue activement.
Je vais donc me configurer OpenSER (alias Kamailio) pour faire office de proxy SIP IPv4/IPv6. (en cours ;-) )

Télévision

Je diffuse la télévision sur mon résau local avec MuMuDVB (j’ai décrit ma configuration dans ce billet : Diffuser des flux TV sur réseau local avec MuMuDVB). Celui-ci ne supporte pas IPv6.

Par contre VLC supporte très bien IPv6. Il est donc possible de transposer un flux IPv4 multicast vers un flux IPv6 multicast.

Les équipements

Le point noir dans cette migration vient des équipements embarqués qui disposent d’une connectivité IPv4 :

  • Switch manageable : aucun firmware disponible avec le support d’IPv6 ;
  • Télephones SIP : le SPA941 et le PAP2, ne disposent pas d’un firmware compatible IPv6 ;
  • Amplificateur Home-Cinema : idem ;
  • Imprimante : idem ;
  • RFXCOM : idem ;

Pas de surprises, l’ensemble des équipements IP ne disposent pas d’une connectivité IPv6, il faut chercher dans du matèriel très haut de gamme pour obtenir cette fonctionnalité.

Une solution possible est de rendre ses services accessibles en IPv6 à l’aide d’un reverse proxy 6to4 via Apache :

<VirtualHost [2042:42:42:22:42:42:42:42]:80>
   ServerName host.v6.domaine
   DocumentRoot /var/www
   ProxyPass / http://host.domaine/
   ProxyPassReverse / http://host.domaine/
</VirtualHost>

Mais cela ne fonctionne que pour les inferfaces HTTP de configuration et non pour tous les services fournir par ces équipements.

La seule bonne nouvelle pour les équipements et que la plupart disposent de la possiblité de mise à jours de leur firmware et donc ils seront un jour compatible ;-)

Sécurité

Kerberos Comme vos machines sont directement accessibles via Internet, il est nécessaire d’augmenter le niveau de sécurité du réseau. Pour ma part, j’ai déployé les éléments suivants :

  • Chiffrement TLS/SSL de TOUS les services, c’est le minimum syndical ;
  • Règles de Firewall strictes ;
  • Désactiver des services réseaux inutiles ;
  • Maintien à jours de l’ensemble des paquets ;

Et si vous êtes un peu paranoïaque, (comme moi ;-) ) vous pouvez encore ajouter quelques éléments de sécurité en plus :

  • Renforcer la sécurité du noyau et des services à l’aide de patches spécifiques ( grsecurity, Suhosin, etc…) ;
  • Mettre en place un NIDS comme Prelude ;
  • Mettre en place un HIDS comme SAMHAIN.

Bref, Comme les machines peuvent être directement accessibles et vous n’avez plus la “protection” du NAT. Il est nécessaire d’accorder plus d’importance à la sécurisation des vos serveurs.
Si non vous avez de fortes chances de vous retrouver dans ce cas : The brave new world of IPv6. (on me signale qu’il existe une très bonne protection ;-) )

Références

Conclusion

J’ai appris beaucoup de choses lors de cette migration.

Mon réseau dispose d’une connectivité IPv6 et je vais pouvoir m’amuser avec les nouvelles possiblités offertes ;-)

January 31, 2010

Gestion de la lumière d’ambiance avec le protocole DMX sous Debian GNU/Linux

La technologie des lumières à LEDs offre la possibilité de placer une source de lumière n’importe où (aquarium, meubles, faux plafonds, derrière un écran, etc…).

Par contre, les LEDs disposent de plus de fonctionnalités que les ampoules classiques.
En effet, en plus d’un bouton d’allumage, vous avez la possibilité de changer la couleur de la lumière, la faire varier dans le temps, modifier son intensité, jouer une séquence, etc…

Avec un nombre de possibilités plus grand, les interfaces de contrôle classique (X10, PLCBUS, etc…) ne suffisent pas.

Il est donc nécessaire de placer un peu plus d’intelligence dans le réseau d’illumination à l’aide du protocole DMX.

Ce protocole est utilisé dans le monde des concerts, des plateaux de télévision et des spectacles.
Néanmoins, il est tout à fait possible de le détourner pour un usage domotique.

Dans ce billet, je vais décrire l’utilisation d’un contrôleur LED RGB DMX et de l’interface OpenDMX de chez ENTTEC, à l’aide du projet OLA sous Debian GNU/Linux.

Principe de fonctionnement

Voici le schéma du montage:
dmx_led_overview

  • le PC communique à l’aide du port USB avec un contrôleur DMX ;
  • les contrôleurs LEDs mis en série convertissent les ordres en instructions RGB ;

Et voici ce que cela donne :

OpenDMX RGB LED

Matériel

Voici le matériel nécessaire pour un bandeau à LED, le tout fonctionne bien sûr sous Debian GNU/Linux est FOSS Friendly ;-)

Produit Prix
OPEN DMX USB Hardware Interface $52.00 – $60.00
RGB LED DMX Controller 2 $48.00 – $76.80
RJ45 Connetor to XLR Female Connector $11.20 – $14.25
RJ45 to XLR Male DMX Cable Adapter 3ft $10.99 – $14.00
DMX/XLR converter connector $10.50 – $12.00
LED Controller Power Supply, USA/EU $23.10 – $36.96
DMX 512 Terminator, 3 Pole Male Connector $7.94
Mini Bandeau Rigide RGB 12 Led 20cm 150° 12v DC 6 € – 12,95 €
Raccord intermédiaire pour Bandeau lumineux à Led Longueur 5cm 1.5 €

Pour le câblage, entre le bandeau lumineux et le contrôleur à LED, Il faut couper une extrémité du cable de raccord et la dénuder pour brancher sur le bornier à quatre vis de sortie RGB.

Installation du matériel

Une fois que vous avez branché l’OpenDMX au PC, vous devez voir un convertisseur USB-Serial (UART) à l’aide de lsusb :

$ lsusb
Bus 002 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Pour faire fonctionner l’OpenDMX, vous avez besoin du module noyau dmx-usb et d’un environnement de compilation pour les modules. (paquet linux-headers*, etc…).

# cd /usr/src
# git-clone http://www.erwinrol.com/git/dmx_usb_module/
# cd dmx_usb_module
# make
# cp ./dmx_usb.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial
# depmod -a

Comme, l’OpenDMX est un convertisseur USB-Serial, le noyau par défaut le présente comme une interface /dev/ttyUSB.
Il est donc nécessaire de blacklister les modules usbserial dans le fichier /etc/modprobe.d/blacklist, en ajoutant les lignes suivantes :

blacklist usbserial
blacklist usb-serial
blacklist ftdi_sio

Ensuite, ajouter le module dmx_usb dans le fichier /etc/modules et rebooter la machine.
Au reboot, vous devez avoir une interface /dev/dmx0, qu’il faut rendre accessible pour tous les utilisateurs :

# ls -l /dev/dmx0
crw-rw---- 1 root root 180, 192 2010-01-30 00:37 /dev/dmx0
# chmod a+rw /dev/dmx0

Installation du logiciel pour la gestion de la lumière : Open Lighting Architecture (OLA)

Comme, il n’y a pas de paquets Debian disponibles pour ce programme, je vais décrire une procédure d’installation à partir des sources. Ces instructions ont été valider à l’aide de la version 0.7.3 de OLA :

Dépendances

Vous allez avoir besoin des dépendances suivantes pour la compilation :

# apt-get install build-essential uuid-dev libcppunit-dev libgcrypt-dev uuid-dev

Compilation de Protocol Buffers de Google

Vous avez besoin de protobuf, pour la gestion de l’échange de données :

# cd /usr/src
# wget http://protobuf.googlecode.com/files/protobuf-2.3.0.tar.bz2
# tar xjf protobuf-2.3.0.tar.bz2
# cd protobuf-2.3.0
# ./configure ; make ; make install

Compilation de google-ctemplate

Vous avez besoin du système ctemplate :

# cd /usr/src
# wget http://google-ctemplate.googlecode.com/files/ctemplate-0.96.tar.gz
# tar xzf ctemplate-0.96.tar.gz
# cd ctemplate-0.96
# ./configure; make ; make install

Compilation de microhttpd (optionnel)

Vous avez besoin de la libmicrohttpd version > à 0.4 (non disponible dans Debian) pour l’interface web de gestion :

# cd /usr/src
# wget ftp://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.4.5.tar.gz
# tar xzf libmicrohttpd-0.4.5.tar.gz
# cd libmicrohttpd-0.4.5
# ./configure; make ; make install

Compilation de OLA

Le projet OLA se découpe en deux parties : un serveur et des clients, dont voici la procédure de compilation. Vous devez remplacer x.y.z, par la version stable la plus récente du programme. (0.7.3 dans mon cas)
Pour le serveur :

# cd /usr/src
# wget http://linux-lighting.googlecode.com/files/ola-x.y.z.tar.gz
# tar xzf ola-x.y.z.tar.gz
# cd ola-x.y.z
# ./configure; make ; make install

Pour le client en C++ :

# cd /usr/src
# wget http://linux-lighting.googlecode.com/files/ola-examples-x.y.x.tar.gz
# tar xzf ola-examples-x.y.z.tar.gz
# cd ola-examples-x.y.z
# ./configure; make ; make install

Lancement d’OLAd

Vous pouvez lancer olad, avec un utilisateur qui dispose des droits de lecture / écriture du /dev/dmx0 :

$ olad -l 3
...

Vous pouvez ensuite vérifier si l’OpenDMX a bien été détecté par le serveur à l’aide du client ola_dev_info :

$ ola_dev_info
...
Device 3: OpenDmx USB Device
port 0, OUT Open Dmx at /dev/dmx0
...

Et si vouz avez compilé libmicrohttpd, vous devez pouvoir accèder à l’interface web du daemon, sur le port 9090 :

DMX OLA web console

Test et validation du bon fonctionnement

Avant de pouvoir manipuler les LEDs, il est nécessaire d’attribuer ununivers au contrôleur OpenDMX à l’aide de la commande ola_patch :

$ ola_patch -d 3 -p 0 -u 0

Ensuite vous pouvez lancer dans deux terminaux les commandes ola_dmxmonitor et ola_dmxconsole.
La première permet de suivre le statut des diffèrents composants et la seconde permet de les controler à l’aide d’un interface graphique en curses.

L’identifiant du contrôleur LED RGB sur le réseau DMX, est fonction de la valeur prise par le petit switch qui se situe sur celui-ci.
Et se découpe de la manière suivante :

  • Rouge = valeur du switch ;
  • Vert = valeur du switch + 1 ;
  • Bleu = valeur du switch + 2.

Vous pouvez faire varier les trois valeurs pour obtenir les diffèrentes couleurs possibles.

Allez plus loin avec l’Open Lighting Architecture (OLA)

OLA supporte de nombreux contrôleurs USB et Ethernet.
Il dispose d’une API Client C++ et Python, ce qui rend son intégration possible et facile dans d’autres projets et offre de nombreuses possiblités.

La diffusion d’informations à l’aide de la lumière d’ambiance et ses possiblités

L’idée de pouvoir contrôler l’intensité et la couleur d’un bandeau à LED qui se situe dans n’importe quel endroit de la maison, offre des possiblités interessantes en matière de diffusion d’informations.

En effet, la lumière permet de diffuser l’information de manière non intrusive.
Voici quelques exemples des possibilités offertes :

  • comme la lampe DAL de Violet, se connecter à l’Internet pour exploiter des ressources ;
  • Pour ceux qui disposent de l’option Tempo d’EDF, il est possible de diffuser la couleur du jour ;
  • Modifier l’Intensité lumineuse en fonction de nombreux paramètres : tempèrature, l’ensoleillement, nombre de personnes présentes dans la pièces, activation d’une alarme, réveil du bébé, etc…

Ce sont quelques exemples des possiblités offertes. Pour le reste vous pouvez faire marcher votre imagination pour créer des nouvelles manières d’inter-agir avec les machines et cette Intelligence ambiante.

Réferences

Voici mes réferences :

Conclusion

Le protocole DMX est ancien et souffre de nombreux défaults, mais il présente encore de nombreux avantages tels que :

Il faut noter qu’il existe une alternative plus récente au protocole DMX : Digital Addressable Lighting Interface (DALI).

Il est aussi possible de remplacer le contôleur OpenDMX par une carte Arduino, comme décrit ici.

Filed under: Debian,Home automation — Tags:, , , , , — cscm @ 11:39

January 11, 2010

Faire son propre moteur de recherche avec Nutch

Allez aujourd’hui, je lâche mon troll, qui n’a pas manger depuis plusieurs semaines :

S’il y a quelque chose que vous faites et que personne ne doit savoir, peut-être qu’il faudrait commencer par ne pas le faire

Source : Google CEO Eric Schmidt Dismisses the Importance of Privacy

Il a raison le bon docteur Schmidt, il aurait du faire plus attention Liu Xiaobo avant de chercher droits de l’homme sur un moteur de recherche censuré

Bref vous m’avez compris ce genre de parole dans la bouche de l’homme le plus puissant de la plante ne m’inspire pas confiance et je continue à penser que le slogan de Google Don’t be evil est une véritable plaisanterie.

Alors au lieu de vous conseiller de passer à Bling, je vais vous expliquer comment faire votre propre moteur de recherche.

Ce billet décrit la mise en place d’un moteur de recherche sous Debian GNU/Linux basé sur Nutch.

Pré-requis

140px-Google’s_First_Production_Server

Pour faire votre propre moteur de recherche vous avez besoin de :

  • 450 000 serveurs répartis sur toute la planète ;
  • 80Go d’espace disque par machine ;
  • 4Go de mémoire par machine ;
  • Une connexion fibre optique entre vos “data centers” ;

Bref, si vous n’avez pas cette infrastructure à votre disposition ce n’est pas la peine d’aller plus loin ;-)
Bon d’accord, vous voulez simplement un moteur de recherche personnel?

Un seul serveur avec les caractéristiques suivantes :

  • Un bon processeur ;
  • Beaucoup de mémoire (4Go, ba oui, c’est du Java ma petite dame ;-) ) ;
  • Un gros disque dur très rapide de plus de 500Go (des Raptor par exemple ) ;
  • Une bonne bande passante, avec plus de 2Mb en download;
  • Une distribution Debian GNU/Linux ;
  • Des compétences en administration d’Apache, Tomcat et ligne de commande ;
  • Un peu de temps pour configurer le système et le paramétrer aux petits oignons.

C’est bien plus abordable ? ;-)

Fonctionnalités

En mettant en place mon propre moteur de recherche, je voulais obtenir les fonctionnalités suivantes :

  • Indexation des documents locaux (ex: un Intranet) ;
  • Indexation plus poussé de mes centres d’intérêts ;
  • Indépendance par rapport à un moteur de recherche ;

Néanmoins, je dois faire une croix sur :

  • la publicité ciblée ;
  • la recherche d’images, de vidéos et temps réel ;
  • la correction orthographique.

Les limitations

On pourrait dire que Nutch est un moteur de recherche de l’époque “web 1.0”. En effet, il ne contient pas d’algorithme d’Intelligence Bolchevique^Wcollective comme la plupart des moteurs de recherche. Cela signifie que seul le Page rank est utilisé et que les votes des utilisateurs ne sont pas pris en compte. Il est aussi plus sensible au Spamdexing.

Présentation des composants

L’architecture d’un moteur de recherche est assez simple, vous avez besoin :

  • d’un Web crawler, un logiciel qui explore automatiquement le Web à la recherche de ressources.
  • un système d’indexation, dans le cas de Nutch c’est Apache Lucene ;
  • des interfaces de recherche ;

Installation

Voici les étapes nécessaires pour faire fonctionner la version 1.0 Nuch sur une machine Debian GNU/Linux version “lenny”.

Dépendances

Vous avez besoin des composants suivants :
# apt-get install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps sun-java6-jre

Configurer le JRE par default :
# update-alternatives --set java /usr/lib/jvm/java-6-sun/jre/bin/java

Nutch

C’est une application en Java, que je place dans le repertoire opt :

# cd /opt
# wget http://mirror.mkhelif.fr/apache/lucene/nutch/nutch-1.0.tar.gz
# tar xzf nutch-1.0.tar.gz
# ln -s nutch-1.0 nutch
# mkdir nutch/urls
# mkdir nutch/crawl
# chown tomcat55: nutch-1.0

Configuration

La configuration du moteur de recherche se trouve dans le fichier conf/nutch-default.xml, vous disposez de votre fichier conf/nutch-site.xml, spécifique à votre instance. Les variables intéressantes sont :

  • http.agent.* : la politesse, pour décrire votre robot ou bien prendre l’identité d’un autre ;
  • db.fetch.interval.(default|max) : ces variables définissent le nombre de jours entre chaque passage du robot, comme vous ne pourrez pas faire le tour du web en moins de 30 jours ;-), une bonne idée est d’augmenter ces valeurs ;
  • plugin.includes : la définition des plugins pris en charge, ici vous pouvez ajouter la gestion des documents pdf, microsoft word et du protocole https.

Bootstrapping du moteur de recherche

Votre moteur de recherche doit avaler une quantité de donnée importante avant de pouvoir faire une recherche pertinente.
Voici quelques sources pour l’initialiser.

A l’aide d’un annuaire

Il existe de très bons annuaires complets comme le projet Open Directory Project.
Dont l’ensemble des données sont disponibles au format RDF et téléchargeables librement : http://rdf.dmoz.org/rdf/.
Par contre, attention ce fichier référence 4 446 480 sites web et vous allez avoir besoin de beaucoup de place pour les référencer tout ce contenu.

Voici la procédure pour utiliser l’annuaire DMOZ avec Nutch :

$ cd /opt/nutch
$ mkdir urls
$ wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz -O urls/content.rdf.u8.gz
$ gunzip urls/content.rdf.u8.gz
$ bin/nutch org.apache.nutch.tools.DmozParser urls/content.rdf.u8 > urls/dmoz
$ bin/nutch inject crawl/crawldb urls/dmoz
Injector: starting
Injector: crawlDb: crawl/crawldb
Injector: urlDir: urls/dmoz
Injector: Converting injected urls to crawl db entries.
Injector: Merging injected urls into crawl db.
Injector: done

A l’aide d’un Marque-page

Une autre source pour initialiser le moteur de recherche est d’utiliser les adresses contenues dans votre marque-page. Le principal avantage de cette technique est la faible quantité de données à analyser et une pertinence de recherche accrue.
Pour ce faire, vous devez exporter votre marque-page au format HTML (pour Mozilla Firefox) et en extraire les adresses de la manière suivante :


$ cd /opt/nutch
$ grep "A HREF=\"http" bookmarks.html | cut -d '"' -f 2 > urls/bookmarks
$ bin/nutch inject crawl/crawldb urls/bookmarks
Injector: starting
Injector: crawlDb: crawl/crawldb
Injector: urlDir: urls/bookmarks
Injector: Converting injected urls to crawl db entries.
Injector: Merging injected urls into crawl db.
Injector: done

A l’aide de Wikipedia

Wikipedia fourni des dumps de sa base de données au format XML. Il est donc possible d’utiliser les URLs des articles de wikipedia comme source.
Voici la procédure pour la version française de Wikipedia, celle-ci contient 897 974 urls.

$ cd /opt/nutch/
$ mkdir urls
$ wget http://download.wikimedia.org/frwiki/latest/frwiki-latest-abstract.xml -O urls/frwiki-latest-abstract.xml
$ grep "<url>" urls/frwiki-latest-abstract.xml | cut -d '>' -f 2 | cut -d '< ' -f 1 > urls/wikipedia-fr
$ bin/nutch inject crawl/crawldb urls/wikipedia-fr
Injector: starting
Injector: crawlDb: crawl/crawldb
Injector: urlDir: urls/wikipedia-fr
Injector: Converting injected urls to crawl db entries.
Injector: Merging injected urls into crawl db.
Injector: done

What you’re waitin’ for ? Christmas ?

Come get some!

Une fois que vous avez chargé la base de données avec vos urls, il faut les parcourir afin de les indexer. Cela se fait à l’aide de plusieurs commandes :

  • generate : sélections des adresses à parcourir ;
  • fetch : parcourt des urls ;
  • updatedb : mise à jours de la base des adresses ;
  • invertlinks : mise à jours de l’index des adresses inversées ;
  • index : indexation des données ;

Une séquence classique ressemble donc à cela :

bin/nutch generate crawl/crawldb crawl/segments -topN 1000
s1=`ls -d crawl/segments/2* | tail -1`
bin/nutch fetch $s1
bin/nutch updatedb crawl/crawldb $s1
bin/nutch invertlinks crawl/linkdb $s1
bin/nutch index crawl/indexes crawl/crawldb crawl/linkdb $s1

Cette suite de commandes vous permet de parcourir et d´indexer 1000 adresses issues de votre base.
C’est un très bon 1er test pour voir si cela fonctionne.

Shake it, baby!

Une autre commande intéressante est readdb avec l’option stats, qui permet d’obtenir des informations sur le contenu de votre base :

$ bin/nutch readdb crawl/crawldb/ -stats
CrawlDb statistics start: crawl/crawldb/
Statistics for CrawlDb: crawl/crawldb/
TOTAL urls: 3377315
...
min score: 0.0
avg score: 0.13178158
max score: 401.402
status 1 (db_unfetched): 2966337
status 2 (db_fetched): 300008
status 3 (db_gone): 46659
status 4 (db_redir_temp): 27857
status 5 (db_redir_perm): 36454

Une bonne idées serait de mettre en place un système de monitoring sur ces informations pour suivre le déroulement. Par contre, il faut faire attention car la commande prend plusieurs minutes à s’exécuter. (donc hors de question de la placer dans un plugin munin, un mail tous les soirs serait une meilleur méthode).

Damn… I’m looking good!

Vous pouvez tester en ligne de commande le fonctionnement du moteur de recherche :
$ bin/nutch org.apache.nutch.searcher.NutchBean apache
Total hits: 6413
0 20100104001440/http://xmlgraphics.apache.org/fop/
... be part of Apache's XML Graphics project . Demonstration ... goals of the Apache FOP project are to ...
1 20100103201220/http://velocity.apache.org/
... Library Site building Site tools Apache Reference Apache Website How the ASF ... way in its field. Apache
...

Voilà cela fonctionne en ligne de commande, nous pouvons passer à l’interface end user (enfin un moteur de recherche en ligne de commande c’est très pratique aussi ;-) )

Configuration de l’interface web

Nutch fournir un application pour Tomcat / Jboss. Il suffit de la déployer et de lui indiquer l’emplacement de votre index de la manière suivante :

# cd /opt/nutch
# cp nutch-1.0.war /var/lib/tomcat5.5/webapps
... attendre
# vim /var/lib/tomcat5.5/webapps/nutch-1.0/WEB-INF/classes/nutch-default.xml
... remplacer la value de searcher.dir par /opt/nutch/crawl

Mais aussi modifier la sécurité de tomcat, via le fichier /etc/default/tomcat5.5 en mettant la variable TOMCAT5_SECURITY à no.
Ou bien en créant un fichier policy donnant l’accès au répertoire /opt/nutch/crawl. (c’est plus propre ;-) )

Vous pouvez ensuite redémarrer tomcat et accèder au moteur de recherche via votre navigateur sur le port 8180.

Problèmes rencontrés

Voici quelques problèmes que j’ai rencontré lors de mes tests de la version 1.0 de Nutch :

La directive merge ne fonctionne pas

Impossible de fusionner deux index, il est nécessaire de re-creer l’ensemble de l’index à chaque fois.

La directive fetch flanche

Lorsque trop nombreux sites sont choisis dans la liste des sites à parcourir par le robot d’indexation à l’aide de l’option topN, le programme produit une erreur et le segement produit est corrompu. (c’est pour cette raison que je limite le nombre de site dans un segment à 5000)

Maintenance de l’index

Une fois le moteur de recherche mise en place, il faut maintenir l’index à jours. Pour cela, j’ai mis en place un simple script de crawl avec cron qui se lance tous les soirs :

#!/bin/sh
bin/nutch generate crawl/crawldb crawl/segments -topN 5000
s1=`ls -d crawl/segments/2* | tail -1`
bin/nutch fetch $s1
bin/nutch updatedb crawl/crawldb $s1
bin/nutch invertlinks crawl/linkdb $s1

et un autre qui re-créer l’index :

#!/bin/sh
rm -rf crawl/indexes/
bin/nutch index crawl/indexes/ crawl/crawldb/ crawl/linkdb/ crawl/segments/*

Optimisation du robot d’indexation

La principale difficulté de ce projet est l’indexation d’une énorme quantité de données avec des moyens techniques très limité.
Voici donc quelques idées pour optimiser l’indexation de votre moteur de recherche.

Utiliser le serveur mandataire de votre fournisseur d’accès à Internet

Vous pouvez ajouter l’adresse du serveur mandataire de votre FAI dans le fichier conf/nutch-site.xml :

<property>
<name>http.proxy.host</name>
<value>proxy.free.fr</value>
</property>
<property>
<name>http.proxy.port</name>
<value>3128</value>
</property>

Note : On me signale dans l’oreillette, que mon FAI à fermer son proxy à cause d’une sombre histoire de Haute Autorité De l’Ouverture Postale Inopinée.

Mise en place d’un serveur DNS locale

Vous avez besoin de mettre en place un serveur cache DNS locale qui prend en charge les requêtes du robot. Vous pouvez faire cela avec ISC BIND ou bien pdnsd.

Augmentation du nombre de Threads

Vous pouvez aussi augmenter le nombre de processus utiliser par le robot d’indexation en modifiant les variables du fichier de configuration :

  • fetcher.threads.fetch : nombre de threads au total (42) ;

Pour plus d’informations, vous pouvez voir sur le wiki du projet : OptimizingCrawls.

Imposer^WIntégrer Nutch

Voici quelques astuces pour intégrer Nutch à votre architecture.

Mozilla Firefox

Pour Mozilla Firefox, le système de plugin permet d’inclure votre propre moteur de recherche.
Pour faire cela, il faut placer le fichier nutch.xml dans votre profile Firefox : ~/.mozilla/firefox/*.default/searchplugins (en remplacant par l’addresse de votre instance ) .

DNS Menteur

Vous pouvez modifier la configuration de votre DNS pour résoudre le domaine google avec l’adresse de votre moteur de recherche. (Ouais, je sais Net Neutrality, toussa ;-) ). En modifiant la feuille de style de l’interface web certains utilisateurs ne verront surement pas la diffèrence.

Est-ce bien raisonnable ?

Vous allez me dire. Héberger son propre moteur de recherche chez soit, quelle drôle d’idée ;-)
Je pousse, le concept d’Auto-hébergement au maximum, mais il est clair que j’ai fait cette article “Just for fun”, car même si je ne peut indexer que 5000 sites par jours (le script fonctionne durant les heures creuses) , soit 1 825 000 en un an, je vais avoir beaucoup de mal à indexer les 4 446 480 urls de DMOZ.

Références

Voici quelques références intéressantes sur le sujet :

Conclusion

Vous avez maintenant à votre disposition un moteur de recherche personnel.
Et vous êtes libre de rechercher des choses sans que personne ne puisse le savoir ;-)
L’étape la plus dure est de se passer de l’utilisation google ;-)
Si vous voulez aller plus loin dans le monde des moteurs de recherche libre vous pouvez intégrer Nutch avec Solr, comme décrit dans cette article : Using Nutch with Solr.
Afin d’obtenir un moteur de recherche professionnel pour une entreprise. (principalement pour éviter la fuite d’information).
Ou bien si vous si êtes intéressé par un produit similaire aux Solutions d’entreprise de Google.

Pour finir, la petite cerise sur la gâteau, comme Nutch utilise Hadoop, il scale comme un troupeau éléphants ;-)

Filed under: Debian,Network — Tags:, , , , — cscm @ 23:22

December 9, 2009

Notifications Nagios par Téléphone

J’ai configuré mon instance de Nagios pour recevoir une notification par téléphone en cas d’incident. (déclenchement d’une alarme ou d’un détecteur d’eau / fumée dans mon installation domotique).

Ce billet décrit comment mettre en place un système de la notification par téléphone avec Nagios.

Pré-requis

Vous avez besoin des composants suivants :

  • Une distribution Debian GNU/Linux ;
  • Une installation fonctionnelle de Nagios ;
  • Une PABX IP avec le support du protocole SIP, comme Asterisk ;
  • Un système de Synthèse vocale fonctionnelle, comme eSpeak + MBROLA ;
  • Un client SIP en ligne de commande comme PJSUA.

Installation

Le client SIP en ligne de commande PJSUA n’est pas disponible dans les paquets du projet Debian.
Il est donc nécessaire de l’installer manuellement à l’aide du classique : configure, make, make install.
La procédure est décrite dans ce billet : Un client SIP en ligne de commande.

Pour l’installation du système de synthèse vocale, vous pouvez vous référer à mon précèdent billet sur le sujet : Text-to-Speech avec eSpeak, MBROLA et Speech Dispatcher.

Configuration

Vous devez créer un compte SIP pour Nagios sur votre PABX et tester que l’enregistrement est fonctionnel.

Pour cela vous avez besoin d’un fichier de configuration spécifique à Nagios pour PJSUA, dans /etc/nagios/sip.cfg par exemple :

--id sip:nagios@pabx.csquad.lan
--registrar sip:pabx.csquad.lan
--realm *
--username nagios
--password secret

Vous pouvez ensuite tester l’enregistrement en ligne de commande :
$ pjsua --config-file /etc/nagios/sip.cfg
...
11:17:05.376 pjsua_acc.c sip:nagios@pabx.csquad.lan: registration success, status=200 (OK), will re-register in 300 seconds

Un appel de test :
$ pjsua --config-file /etc/nagios/sip.cfg --null-audio sip:secretariat@pabx.csquad.lan

Ensuite un appel de test audio avec un message :
$ espeak -v mb/mb-fr1 "E.T. téléphone maison" | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - test.wav
$ pjsua --config-file /etc/nagios/sip.cfg --play-file=test.wav --auto-play --null-audio sip:secretariat@pabx.csquad.lan
$ rm -f test.wav

On met le tout dans un petit script expect pour prendre en charge la déconnections de manière polie :

#!/usr/bin/expect --
set timeout 45
set addr [lindex $argv 0]
set text [lindex $argv 1]
exec /usr/bin/espeak -v mb/mb-fr1 $text | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - /tmp/phone-call.wav;
spawn /usr/local/bin/pjsua --app-log-level=3 --config-file /etc/nagios/sip.cfg --play-file /tmp/phone-call.wav --auto-play --null-audio --max-calls 1 sip:$addr
expect {
"DISCONNCTD" {
exit
}
timeout {
send "h\n"
exit
}
eof {
exit
}
}

Et voilà ;-)

Il ne nous reste plus qu’à configurer ce type de notification dans Nagios.
Pour cela, il faut modifier le fichier contacts.cfg :
# 'nagios-phone' contact definition
define contact{
contact_name nagios-phone
alias Nagios Admin via Phone
service_notification_period 24x7 ; mouahahahahahaha
host_notification_period 24x7 ; moiahahahahahahah
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-by-phone
host_notification_commands host-notify-by-phone
email sip:secretariat@pabx.csquad.lan
}

Puis le fichier misccommands.cfg :
# 'notify-by-phone' personnal command definition
define command{
command_name notify-by-phone
command_line /usr/local/bin/phone-call.sh $CONTACTEMAIL$ "$NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}
# 'host-notify-by-phone' personnal command definition
define command{
command_name host-notify-by-phone
command_line /usr/local/bin/phone-call.sh $CONTACTEMAIL$ "Host $HOSTSTATE$ alert for $HOSTNAME$!"
}

Ensuite, vous pouvez définir nagios-phone comme un contact pour des services ou hosts.

Il faut aussi modifier la valeur de la variable notification_timeout dans le fichier de configuration nagios.cfg, pour avoir le temps de décrocher le téléphone et d’en tendre le message.

Conclusion

Vous n’avez plus aucune excuse pour ne pas brancher vos esclaves^Wéquipe d’administrateurs systèmes directement sur le système de surveillance de vos serveurs ;-)

Plus sérieusement, la notification par téléphone est une méthode très intrusive. Il est nécessaire de décrocher le téléphone. Il faut donc l’utiliser avec parcimonie.

Filed under: Debian,Network — Tags:, , , — cscm @ 20:39

October 27, 2009

Reconnaissance vocale sous GNU/Linux et domotique

L’objectif de cet article est de décrire mon avancement sur le système de reconnaissance vocale dans mon installation domotique. En effet, pour mon usage personnel, j’ai mis au point un chatterbot pour contrôler de manière intuitive l’appartement.
Cette technologie permet de tenir une discutions intuitive avec une maison intelligente pour lui faire exécuter des ordres. (allez Stanley, tu t’es seulement planter de 10 ans ;-) ) :

Moi>Alfred?
Alfred>Oui, monsieur.
Moi>Allume la lumière du salon.
-- run xpl-sender -c x10.basic command=on device=a3
Alfred>C'est fait.

Le nom du bot est un hommage à Alfred Pennyworth. Allons faire un petit tour dans les entrailles de la batcave ;-)

Définition du besoin

L’accumulation des télécommandes sur mon installation domotique, fait chuter mon WAF de manière dramatique.
En effet, pour regarder une chaîne de télévision ou allumer la lumière.
Il est nécessaire d’utiliser deux ou trois télécommandes différentes.
Naviguer dans des interfaces, etc…
Bref, pour des technologies donc l’objectif est d’améliorer la qualité de vie et rendre les taches quotidienne plus facile, j’avais un gros problème ;-)
Après un petite discussion et une mise au point avec ma moitié, j’ai réussi à vendre la solution de contrôle par la voix.
Belle connerie me voilà parti dans un domaine que je ne connais pas ;-)

Première Approche

Je lance une boue à la mer sur le forum “toute la domotique”.

Visiblement, je ne suis pas le seul à chercher ce genre de fonctionnalité. Actuellement, nous avons dans le domaine :

  • l’abominable HomeSeer qui fonctionne très mal en Anglais à l’aide de l’interface de reconnaissance vocale inclue dans Microsoft Windows et la SAPI ;
  • Rien de spécifique à la domotique sous GNU/Linux, mais une belle galaxie de programmes dans le domaine.

Le choix du microphone

Ma petite dame voulais parler librement sans aucune contrainte et il n’étais pas question de l’équiper d’un microphone.
J’ai donc cherché une solution qui permet de capter la parole dans une pièce sans microphone sur la personne.
La solution magique s’appelle la technique du Microphone array.
Le principe est très simple, mettre en commun plusieurs microphones reliés à un DSP qui permet de faire le traitement du signal en fonction de l’orientation physique des microphones.
J’ai donc proposé de mettre en place chez moi le LOUD (non ce n’est pas un radiateur ;-) ).
Bon vous vous doutez bien que lorsque j’ai proposé la solution du LOUD, j’ai faillit passer par la fenêtre ;-)

microphone_array Heureusement, il existe des solutions plus simples telles que le Voice Tracker de chez Acoustic Magic.

Celui-ci permet de capter la parole dans une pièce, retraite le signal et permet d’obtenir sur une prise Jack classique la voix et rien que la voix dans une pièce.
Magique ;-)

Je peux parler le dos tourner au microphone dans une pièce de 20m^2 et l’ordinateur capte ma voix de manière impressionnante ;-)

Le logiciel de reconnaissance vocale

Il y a principalement deux solutions dans le domaine sous GNU/Linux :

  • Le projet CMU Sphinx avec PocketSphinx, Sphinx-[234], etc…
  • Julius, Open-Source Large Vocabulary CSR Engine Julius.

Sur ces deux moteurs de reconnaissance vocale, reposent de nombreux Dialog Manager, qui permettent d’exploiter le moteurs pour faire de la téléphonie, de contrôle vocale, etc…

Ma méthode

Soyons claire, je ne suis pas un expert en reconnaissance vocale et ce domaine est vraiment très difficile d’accès et nécessite la compréhension de nombreuses notions.
J’ai donc adopté la technique EPITECH : c’est à dire faire en sorte que cela fonctionne. ( sans comprendre tout le contexte ;-) )

Un bon informaticien est un informaticien feignant

Pour faire fonctionner Julius, il est nécessaire de lire à haute voix de nombreux mots pour enregistrer les différents phonèmes qui les composent. Afin de créer un Modèle de Markov caché exploitable par le logiciel.
Voici donc comment je m’y suis pris pour éviter cette phase fastidieuse du projet.

Utilisation d’un logiciel de synthèse vocale

1 ère approche une solution assez “laide“, qui consiste à faire lire ces mots par un logiciel de synthèse vocale comme eSpeak. Mais le résultat n’était pas très bon.

Utilisation d’une collection d’enregistrement audio

J’ai par la suite découvert le projet Shtooka, qui est une collection audio libre de mots français.
Tous les termes liés à la domotique ne sont pas disponible dans le projet mais il est très facile d’ajouter ces termes à sa base de données locale.

Conversion texte vers Phonème

Une des étapes de l’apprentissage de Julius est la conversion du texte en Phonèmes, pour résoudre ce problème, j’ai utilisé l’option -X de eSpeak dont voici un exemple de sortie :

$espeak -v fr -q -X "lumière"
Translate 'lumière'
  1     l        [l]

  1     u        [y]

  1     m        [m]

 21     i (A     [j]
  1     i        [i]

 43     è       [E]

  1     r        [r]

 22     e (_     []
  1     e        [@]

 lymj'Er

Un peu de glu

Pour faire fonctionner tout ces éléments ensemble, je me suis fait un script Perl (très sale pour le moment) permettant de réaliser automatiquement toutes ces étapes :

  • analyse des questions posées au robot ;
  • la conversion des mots en phonèmes ;
  • la diction des mots ;
  • la création du modèle accoustique.

Il s’agit de l’automatisation de toutes les étapes de la création d’un modèle acoustique du projet VoxForge.

Les travaux en cours

Mon projet est disponible à cette adresse : Alfred
Il est en cours de développement mais pour l’instant il est possible de donner des ordres simples.

J’utilise RiveScript pour la définition des tâches et de la conversation. Ce langage de chatbot est plus puissant que AIML. Car il permet d’inclure du code Perl assez puissant dans le code de la conversation. Voici un exemple :
$ more lib/Alfred/languages/en/x10.rs
+ switch * on
- do you want me to switch <star> on?
+ yes
% do you want me to switch * on
- <call>xpl_x10_send_on <botstar></botstar></call>

$more lib/Alfred/modules/x10.rs
> object xpl_x10_send_on perl
my ($obj,$method,@args) = @_;
$obj->{'xpl'}->send(
message_type => 'xpl-cmnd', class => 'x10.basic',
body => { command => 'on', device => 'a3' });
< object

Un petit appel à contribution

J'aurais gagné énormément de temps si le projet VoxForge avait reçu plus de contribution de la part des utilisateurs francophones.

En effet, il n'y a pas assez de contribution pour pouvoir faire un modèle accoustique en Français.
Cela permettra de disposer d'un système de reconnaissance vocale libre en Français.
Ce qui intéresse beaucoup de monde à mon avis ;-)
C'est donc un petit appel à contribution aux projets VoxForge et Shtooka.

Références intéressantes

October 6, 2009

Authentification à l’aide d’un lecteur RFID Phidgets

PhidgetRFID 1023

J’ai découvert les modules Phidgets dans botmag. Il s’agit d’un ensemble de modules électroniques (capteurs, relais, servomoteurs) qui fonctionnent sur la plupart des systèmes d’exploitation et sont programmable à l’aide de nombreux langages.

Je vais décrire dans cet article l’utilisation du Kit RFID pour l’authentification PAM sur une machine Debian GNU/Linux.

Présentation du PhidgetRFID Kit

Spécifications

L’interface lit les badges qui se trouvent à proximité et est équipée de 2 sorties (une commande de Led et une commande de relais). . Elle se raccorde sur un port USB et renvoie le numéro d’identification de badge.
Voici les spécifications du lecteur :

  • Consommation maxi: 100 mA ;
  • Portée (5 à 11 cm) ;
  • Sortie commande TTL ou CMOS (relais) ;
  • Sortie 5 Vcc/250 ohms (pour led) ;
  • Protocole de communication: EM4102 ;
  • Fréquence: 125KHz
  • Échantillonnage: 30 lectures/sec ;
  • Dimensions: 81 x 68 x 16 mm.

Où trouver le kit?

Le Kit est disponible chez :

Installation

Matériel

Rien de spécial, il suffit de brancher le module, et vérifier la détection à l’aide de lsusb :
# lsusb
Bus 002 Device 005: ID 06c2:0031 Phidgets Inc. (formerly GLAB)

Logiciel

L’ensemble des composants Phidgets utilisent un SDK unique, qui fourni une bibliothèque d’accès; dont voici la procédure d’installation :
# cd /usr/src
# wget http://www.phidgets.com/downloads/libraries/Phidgetlinux_2.1.6.20090928.tar.gz
# tar xzvf Phidgetlinux_2.1.6.20090928.tar.gz
# cd Phidgetlinux/phidget21
# make
# make install

Test de fonctionnement du lecteur

La 1ère étape consiste à tester le fonctionnement du lecteur à l’aide du programme mhc_rfid :
# cd /usr/src
# wget http://www.cmatthew.net/mhc_rfid/mhc_rfid.c
# gcc -o mhc_rfid mhc_rfid.c -g -O0 -Wall -lphidget21 -lm
# ./mhc_rfid
Waiting for RFID to be attached....Phidget RFID 2-output 78185 attached!
Output: 0 > State: 0
Output: 1 > State: 0
PhidgetRFID
Serial Number: 78185
Version: 206
# Outputs: 2
Antenna Status: 1
Onboard LED Status: 0
Press any key to start.....
Antenna ON Reading.....
Press any key to end.....
Got: 0107759322
Output: 1 > State: 1
Lost: 0107759322
Output: 1 > State: 0
Closing...

L’identifiant de la carte est 0107759322.

Gestion des droits

Par défaut l’accès aux périphériques USB est limité à l’utilisateur root. Pour donner l’accès à un utilisateur simple. Il faut configurer udev à l’aide du fichier fourni dans le kit de développement :
# cd /usr/src/Phidgetlinux/phidget21/udev
# cp 99-phidgets.rules /etc/udev/rules.d/

Débrancher et rebrancher le lecteur. Vous pourrez ensuite l’utiliser en tant que simple utilisateur.

Configuration de PAM

Pour utiliser ce lecteur comme système d’authentification, il faut installer et configurer un module PAM spécifique : PAM mhcrfid

Installation du module


# apt-get install libpam-dev
# cd /usr/src
# wget http://www.cmatthew.net/pam_mhcrfid/0.1.4/pam_mhcrfid.c
# gcc -Wall -fPIC -c pam_mhcrfid.c
# gcc -shared -o pam_mhcrfid.so pam_mhcrfid.o -lpam -lm -lphidget21
# mv pam_mhcrfid.so /lib/security

Configuration d’un service

Voici un exemple de configuration pour xscreensaver :
$ cat /etc/pam.d/xscreensaver
#
# /etc/pam.d/xscreensaver - PAM behavior for xscreensaver
#
auth sufficient pam_mhcrfid.so

L’utilisateur qui lance le service doit avoir un fichier .authtag contenant l’identifiant du tag :
$ cat -e ~/.authtag
0107759322$

Et voilà ;-)

Conclusion

Le système d’authentification n’est pas très solide, il n’y a aucune protection contre le rejeux et il est possible de sniffer l’identifiant du tag, etc…
Si vous cherchez une solution d’authentification plus forte, il faut regarder du côté du projet OpenPCD.
Mais cela peut être utile et très pratique dans certaines configurations, comme l’accès à certaines ressources de mon réseau domotique ;-)

Filed under: Debian,Do it yourself — Tags:, , — cscm @ 10:28

October 3, 2009

Modules Plugwise dans un reseau xPL

L’objectif de cet article est d’expliquer l’utilisation des modules Plugwise dans un réseau xPL sous Debian GNU/Linux à l’aide du projet xpl-perl.

Présentation de Plugwise

circle plugwise Les modules plugwise sont des prises électriques qui permettent de :

  • Mesurer la consommation électrique d’un appareil ;
  • Éteindre / Allumer un appareil électrique à distance.

Ces prises communiquent entre elles à l’aide d’un réseau ZigBee de type Mesh.

Les spécifications du produit sont :

  • Voltage: 100-240 V~
  • Fréquence: 50 / 60 Hz
  • Puissance maximale: 3680 Watt
  • Courant maximal: 16 A

Elles sont produites par une société Hollandaise et uniquement disponibles dans leur Webshop. (passer la commande en hollandais n’est pas évident ;-) )

Chaque prise coûte environ 35 euros et le kit de démarrage le moins cher est à 150 euros.

Les prises électriques sont de type F, il vous faut donc un adaptateur pour les appareils nécessitant une prise de terre.

J’utilise ces prises dans mon installation domotique, car elles présentent un avantage par rapport aux solutions classiques basées sur le CPL (x10, PLC-BUS, etc… ).

En effet, il est possible d’utiliser ce type de prise sur un onduleur et comme une bonne partie de mon installation est ondulée c’est la seule solution.

Installation du “stick” usb

Voici la procédure pour installer, le stick usb.
Insérerez le module dans le port usb de la machine, il doit apparaître et être reconnu comme un adaptateur série :

$ lsusb
...
Bus 006 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
...
$ dmesg
...
[431159.173232] usb 6-2: FTDI USB Serial Device converter now attached to ttyUSB0
[431159.179407] usb 6-2: New USB device found, idVendor=0403, idProduct=6001
[431159.179459] usb 6-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[431159.180301] usb 6-2: Product: FT232R USB UART
[431159.180301] usb 6-2: Manufacturer: FTDI
[431159.180301] usb 6-2: SerialNumber: A8009iKr
$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 2009-09-22 13:03 /dev/ttyUSB0

Configuration du module xpl-plugwise

Dépendances

Pour faire fonctionner le module vous avez besoin du module perl Digest::CRC :
# apt-get install libdigest-crc-perl

Installation du module

Le module xPL pour Plugwise se trouve directement sur le serveur du projet xpl-perl :
# cd /usr/src
# wget http://www.xpl-perl.org.uk/download/xPL-Plugwise-0.01.tar.gz
# tar xzf xPL-Plugwise-0.01.tar.gz
# dh-make-perl xPL-Plugwise-0.01
# cd xPL-Plugwise-0.01/
# sed -i 's/\$(MAKE) test/#/' debian/rules
# dpkg-buildpackage -b
# dpkg -i ../libxpl-plugwise-perl_0.01-1_all.deb

Lancement

Pour lancer le module, il faut lui préciser l’emplacement du stick USB à l’aide de la ligne de commande :
# xpl-plugwise --verbose --plugwise-verbose --plugwise-tty /dev/ttyUSB0
Listening on 192.168.42.78:34281
Sending on 192.168.42.255

Utilisation

Pour allumer une prise, il suffit d’envoyer l’ordre suivant :
$ xpl-sender -m xpl-cmnd -c plugwise.basic command=on device=3FD8F6
Pour éteindre :
$ xpl-sender -m xpl-cmnd -c plugwise.basic command=off device=3FD8F6
Pour obtenir la consommation de l’appareil sur la prise :
$ xpl-sender -m xpl-cmnd -c plugwise.basic command=powerinfo device=3FD8F6
Le module répond à l’aide d’un trigger, donc voici la sortie :
$ xpl-logger -body class=plugwise
192.168.42.2:48051 [xpl-cmnd/plugwise.basic: bnz-sender.tux -> * - powerinfo 3FD8F6]
plugwise.basic
{
command=powerinfo
device=3FD8F6
}
192.168.42.2:48051 [xpl-trig/plugwise.basic: bnz-plugwise.milk -> * - powerinfo 3FD8F6]
plugwise.basic
{
command=powerinfo
device=3FD8F6
pulse1sec=0005
pulse8sec=0006
unknown=000000A4
}

L’information se trouve dans les deux variables pulse1sec et pulse8sec.

Conclusion

Pour l’instant, l’utilisation de ces prises sous Debian GNU/Linux se limite aux ordres on/off. Il est encore nécessaire d’utiliser le logiciel fourni par le fabriquant pour la configuration du réseau.

Filed under: Debian,Home automation — Tags:, , — cscm @ 17:23

September 26, 2009

Archivage des messages xPL dans une base de données

Voici la procédure pour archiver les messages de votre réseau xPL dans une base de données MySQL.

L’objectif

Beanz, l’auteur du projet xpl-perl a supprimé la fonctionnalité du projet dans la version 0.08.

Cette fonctionnalité répond à un besoin très spécifique.
Archiver TOUS les messages dans une base de données MySQL demande beaucoup de ressources.
Sur mon petit réseau domotique, j’ai déjà plus de 25 messages par minute.

Ce qui produit une base de données importante avec 100 000 entrées par semaine, soit 500 000 par mois, 6 000 000 par an.

Et la taille de la base de données fait dans les 50 Mo par semaine, soit 250Mo par mois, 3Go par an.

Donc pour stocker ces données vous devez en avoir vraiment besoin. C’est mon cas, car :

  • Je veux conserver la consommation électrique exact de chaque appareil ;
  • Utiliser des optimisations à l’aide d’un réseau de neurones.

Installation

Vous devez disposer d’un réseau xPL fonctionnel et d’une installation de xpl-perl.

Programme

Nous allons récupèrer le code des modules directement dans le svn.


# cd /usr/share/perl5/xPL
# wget http://www.xpl-perl.org.uk/export/892/xpl-perl/branches/r0.08/lib/xPL/SQL.pm
# sed -i -e 's#/etc/xpl-perl/db.config#/etc/xplperl/db.config#' SQL.pm
# cd /usr/bin
# wget http://www.xpl-perl.org.uk/export/892/xpl-perl/branches/r0.08/bin/xpl-sql-logger
# chmod +x xpl-sql-logger
# apt-get install libclass-dbi-loader-perl libdatetime-perl
# cd /etc/xplperl
# cat < db.config
dsn=dbi:mysql:xpl:localhost
user=xpl
password=secret
EOF
#

Base de données

Une fois que vous avez installé le programme, il est nécessaire de configurer la base de données.

Pour cela vous devez créer un utilisateur xpl et une base de données xpl sur votre serveur MySQL.
Ensuite vous créer les tables de la base de données à l’aide des requêtes SQL suivantes :

CREATE TABLE body (
id int NOT NULL auto_increment,
body varchar(1500) default NULL,
PRIMARY KEY (id),
KEY body_idx (body(1000))
);
CREATE TABLE elt (
id int NOT NULL auto_increment,
name varchar(16) default NULL,
value varchar(128) default NULL,
PRIMARY KEY (id),
KEY name_idx (name)
);
CREATE TABLE msg (
id int NOT NULL auto_increment,
time int default NULL,
usec int default NULL,
type char(8) default NULL,
source varchar(34) default NULL,
target varchar(34) default NULL,
class varchar(15) default NULL,
incomplete int default NULL,
body int default NULL,
PRIMARY KEY (id),
KEY class_idx (class),
KEY time_idx (time,usec),
KEY type_idx (type),
KEY body_idx (body)
);
CREATE TABLE msgelt (
id int NOT NULL auto_increment,
msg int NOT NULL,
elt int NOT NULL,
PRIMARY KEY (id),
KEY msg_idx (msg),
KEY elt_idx (elt)
);

Lancement et recette

Vous pouvez ensuite lancer le programme en ligne de commande :
$ xpl-sql-logger
Vous pouvez ensuite vérifier que cela fonctionne dans la base de données :
mysql> SELECT * FROM `msg` ORDER BY id DESC LIMIT 3;
+---------+------------+--------+----------+----------------+--------+--------------+------------+
| id | time | usec | type | source | target | class | incomplete |
+---------+------------+--------+----------+----------------+--------+--------------+------------+
| 7711941 | 1253948224 | 252455 | xpl-trig | bnz-ccost.milk | * | sensor.basic | 0 |
| 7711931 | 1253948224 | 211170 | xpl-trig | bnz-ccost.milk | * | sensor.basic | 0 |
| 7711921 | 1253948224 | 130241 | xpl-trig | bnz-ccost.milk | * | sensor.basic | 0 |
+---------+------------+--------+----------+----------------+--------+--------------+------------+
3 rows in set (0.00 sec)

Lancement automatique

Vous pouvez lancer automatiquement le programme à l’aide de daemontools en plaçant le programme dans le répertoire /etc/services de la manière suivante :

# cd /etc/xplperl/service
# cp -r xpl-hub xpl-sql-logger
# cd xpl-sql-logger
# cat < run
#!/bin/sh
exec 2>&1
exec setuidgid xplperl envdir ./env softlimit -d300000 /usr/bin/xpl-sql-logger
EOF
# cd /etc/service
# ln -s /etc/xplperl/service/xpl-sql-logger/
# ps auxww | grep xpl-sql-logger
root 3306 0.0 0.0 1620 332 ? S Sep22 0:00 supervise xpl-sql-logger
xplperl 23943 1.3 0.6 16944 12952 ? S 08:20 0:37 /usr/bin/perl -w /usr/bin/xpl-sql-logger

Surveillance de l’archivage

monit logo Le système fonctionne très bien. Par contre, j’ai rencontré quelques problèmes au bout d’une ou deux semaines le programme arrête d’archiver les données dans la base, il faut donc le relancer.
La solution la plus simple et de relancer le script à l’aide d’un cron et monit

.
Voici mon crontab :

*/1 * * * * echo "SELECT NOW() - FROM_UNIXTIME(time) FROM msg ORDER BY id DESC LIMIT 1;" | mysql -hlocalhost -uxpl -psecret -s xpl > /tmp/xpl-sql-logger

Voici ma configuration pour monit dans le fichier /etc/monit.d/xpl-sql-logger :

check file xpl-sql-logger with path /tmp/xpl-sql-logger
if match "^[0-9]{1,2}" then stop
stop program = "/usr/bin/killall -r xpl-sql-logger"

Exploitation des données

Pour exploiter les données, je suis en train d’écrire des gadgets pour Portaneo (P.O.S.H) à afin de pouvoir afficher les données sous forme de graphiques ;-)

Filed under: Debian,Home automation — Tags:, , , — cscm @ 11:44

August 27, 2009

Text-to-Speech avec eSpeak, MBROLA et Speech Dispatcher

Je continue à travailler sur l’ajout de la parole dans mon système domotique.
En ajoutant le support des voix MBROLA, je trouvais le code de mon module xPL, de plus en plus difficile à comprendre.
Et je n’étais pas très satisfait du résultat :

  • le module est spécifique à eSpeak ;
  • le nombre d’arguments à passer en ligne de commande au module devenait trop important.

J’ai donc continué mes recherches dans le domaine est découvert Speech Dispatcher.
Il s’agit d’un daemon réseau qui s’occupe de l’abstraction par rapport aux différents systèmes de Text-to-Speech et met à disposition ces ressources à l’aide d’un protocole unique : SSIP.

Dans cette article, je vais décrie l’installation que j’ai mis en place chez moi.
Pour obtenir un voix en Français de qualité correct et compréhensible sur une distribution Debian GNU/Linux version “Lenny”.

Installation de MBROLA

Vous avez besoin de l’exécutable et des voix du projet MBROLA.
Téléchargeables sur le site du projet au format binaire :

$ wget http://tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip
$ unzip mbr301h.zip
$ chmod +x mbrola-linux-i386
# mv mbrola-linux-i386 /usr/local/bin/mbrola
$ mbrola
MBROLA 3.01h - speech synthesizer
Author : Thierry Dutoit with help of AC/DC adaptator Vincent Pagel
Copyright (c) 95 Faculte Polytechnique de Mons (TCTS lab) - T.Dutoit
Email mbrola@tcts.fpms.ac.be to freely subscribe as a user
...

Vous avez ensuite besoin d’une voix :

$ wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/fr1/fr1-990204.zip
$ unzip fr1-990204.zip
# mkdir /usr/share/mbrola/
# mv fr1 /usr/share/mbrola/

Vous pouvez ensuite tester la sortie à l’aide de la commande suivante :

$ espeak -v mb/mb-fr1 "bonjour, c'est la voix de secret story" | mbrola /usr/share/mbrola/fr1/fr1 - - | aplay -r16000 -fS16

Installation et configuration de Speech Dispatcher

Le programme est directement disponible dans Debian.

# apt-get install speech-dispatcher

Il faut ensuite modifier le fichier de configuration /etc/speech-dispatcher/speechd.conf de la manière suivante :

DefaultLanguage "fr"
DefaultVoiceType "MALE1"
AddModule "espeak-generic" "sd_generic" "espeak-generic.conf"
DefaultModule espeak-generic

Et le fichier /etc/speech-dispatcher/modules/espeak-generic.conf :


GenericExecuteSynth \
"echo \"$DATA\" | espeak -v $VOICE -s $RATE -a $VOLUME -p $PITCH $PUNCT --stdin | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - - | aplay -r16000 -fS16"

Vous pouvez relancer le deamon et vous connecter dessus :

# /etc/init.d/speech-dispatcher restart


$ telnet localhost 6560
SET self CLIENT_name me:and:myself
208 OK CLIENT NAME SET
SPEAK
230 OK RECEIVING DATA
Attention, le frigo est vide
.
225-20
225 OK MESSAGE QUEUED

Références

Voici quelques liens vers des documents intéressants sur le sujet :

Filed under: Debian,Home automation — Tags:, , , — cscm @ 16:41
Next Page »

Powered by WordPress