fév 17

Domotique : Valoriser et exploiter les données

domomoney

Ce n’est pas faute de vous le répéter, les données sont un des éléments essentiels de la domotique (et par nécessité, de l’informatique également).

Après quelques jours/mois/années d’utilisation de votre environnement domotique, vous vous êtes sûrement rendu compte de la quantité de données dont vous disposez et que, probablement, vous n’avez que faire ou que vous exploitez faiblement.

Cette quantité de données peut aussi devenir problématique à stocker et traiter au fil du temps, et vous avez fait le choix sage et délibéré d’en omettre une bonne partie (par exemple, le nombre de fois où l’interrupteur des toilettes est passé de ON à OFF).

Vous êtes un producteur de données diverses et variées, qui vont des valeurs des sondes de températures et d’hygrométrie de votre domicile et de son extérieur, de la vitesse du vent, de la consommation d’eau, d’électricité, de fioul, de gaz, de la valeur de Co2 dans les pièces, du nombre de fois ou un module s’est activé etc… Bref, vous disposez d’un nombre conséquent de valeurs.

Vous, vous êtes industriel, vous concevez et vendez des modules à greffer derrière les interrupteurs et cela vous intéressez sûrement de savoir combien de fois votre module est activé dans une journée et combien de temps il dure. Ou vous êtes constructeur de maison BBC et après les examens concluants, vous seriez intéressé de connaitre le ratio température intérieure/extérieure/consommation énergétique de cette (ces) maison(s) au fil des années.

Bref, vous vous rendez bien compte qu’il existe un chemin de rencontre entre les producteurs de données et les consommateurs de ses données.

Ce point de rencontre, il prend désormais forme par l’entremise de CityzenData, la division « données » du groupe Cityzen Sciences. Il était destiné initialement à répondre aux besoins du consortium SmartSensing pour la gestion des données produites par des capteurs insérés dans des vêtements.

Je vous en avez déjà parlé il y a quelques mois (twitter, blog, forums) en vous interpellant sur le fait de garder un oeil dessus.

Le CTO de CityzenData ne doit pas vous être inconnu si vous suivez l’actualité informatique puisqu’il s’agit de Mathias Herberts, un des pionniers du BigData en France, mais aussi un copain et ancien collègue de travail.
Et quand Mathias m’a proposé de faire « joujou » avec leur plateforme, bien évidemment j’ai répondu présent (même si je suis plus scripteur que développeur, c’est toujours agréable :D )

Une fois enregistré sur la plateforme Cityzendata, vous disposez de 3 tokens.

- Un token « écriture » vous permet de pousser des données
- Un token « lecture » vous permet de lire uniquement les données liées à votre application
- Un token « lecture générale » peut lire toutes les données que vous avez produites indépendamment de l’application.

A cela est communiqué une url d’API endpoint pour pousser vos données, une autre pour les exploiter (ou pour que d’autres les exploitent).

  • Envoyer vos données

Basiquement, avant d’écrire votre propre code, cela fonctionne par un simple POST HTTP :

curl -i -H « Le_Header_Token: votre_token_ecriture » -H « Content-Type: text/plain » -d ‘// temperature{piece=tempsalon} 20′ http://url_endpoint

Et voila, vous venez d’intégrer une valeur comportant un timestamp (une valeur de temps) en microsecondes dans votre « application », sous la classe Temperature avec comme dénomination pièce est égale à tempsalon et la valeur est de 20.

C’est bien évidemment l’insertion la plus simple, vous pouvez y mettre votre propre timestamp, la latitude, la longitude et l’élévation en plus si vous le souhaitez. Car les données ont aussi la faculté d’être géo-temporelles.

Un peu de code plus tard, et je me suis écrit mon client xPL pour pousser automatiquement les données sur la plateforme de CityzenData.
En résumé, toutes les trames de mes sondes (température, hygrométrie, consommation électrique) qui transitent par mon bus xPL sont automatiquement transmises sur la plateforme.

Ce client, vous le trouverez sur mon github :

https://github.com/guiguiabloc/xPL-PyHAL/blob/master/tools/xPL-CityzenData.py

(ce client a besoin d’un fichier de paramètres, config.sonde (présent dans le dépôt github),qui fait le lien entre le code ID du module et le nom que vous souhaitez donné aux labels).

  • Traiter vos données

Pour récupérer, manipuler et traiter les données présentes sur la plateforme, CityzenData a développé un langage appelé Einstein. C’est un langage de programmation orienté pile, un peu comme le Forth.
Voici par exemple mon script einstein qui me permet de récuperer toutes les valeurs consommation électrique :

'Votre_token_lecture'
'=energy'
0 ->MAP
'2014-02-08T00:00:00.000000Z'
'2015-01-01T00:00:00.000000Z'
5 ->LIST
FETCH

Ou uniquement les valeurs de températures à l’extérieur depuis le 09 février.

'votre_token_lecture'
'=temperature'
'room'
'=exterieur'
2 ->MAP
'2014-02-09T10:00:00.000000Z'
'2015-01-01T00:00:00.000000Z'
5 ->LIST
FETCH

Comme pour l’insertion de données, une requête http exécute einstein sur la plateforme

curl –data-binary @guigui.einstein http://api_einstein

Le résultat est au format json :

[[{"c":"temperature","l":{".app":"domotique.guigui","room":"exterieur"},"a":{},"v":[[1391940411191000,7.1],[1391940368152000,7.1],[1391940325145000,7.1],[1391940282146000,7.1],[1391940239143000,7.2],[1391940196144000,7.2],[1391940153143000,7.2],[1391940024140000,7.2]]}]]

Pour gérer tout cela en Python :

import urllib
import urllib2
import sys
import json
 
einstein = open('energy2.einstein', 'r')
data = einstein.read()
url =  'http://api_einstein'
req = urllib2.Request(url, data, {'Content-Type': 'application/octet-stream'})
dataeinstein = json.load(urllib2.urlopen(req))
 
map = {}
for item in dataeinstein[0][0]['v']:
map[item[0]] = item[1]
print map
 
# si cherche une valeur pour un timestamp donné
data = {}
data = map
temp = data[1391931523551000]
print temp

Il y a bien entendu beaucoup de fonctions incluses dans einstein que ce simple exemple et ce billet ne suffirait pas à toutes les expliquer.

Maintenant que je vous ai présenté tout cela, en quoi cela vous concerne ?

Vous êtes producteur de données, outre le fait de disposer d’une plateforme de stockage et de traitement hors normes, vous pouvez mettre à disposition des consommateurs des données qui peuvent les intéresser, et être rémunéré en conséquence.

Vous êtes consommateur, vous disposez de sources de données multiples et variées sur lesquelles vous pouvez appliquer des modèles de calculs et de traitement.

Je vous laisse visiter leur site pour plus d’explications et la façon de les contacter si vous êtes intéressé.

J’imagine déjà certains d’entre vous agiter fièrement le drapeau de la protection de ses données personnelles et du grand méchant cloud, mais il va falloir rapidement que vous rationalisiez tout cela.
Tout d’abord, c’est vous qui décidez des données que vous mettez à disposition et si le température de votre salon vous semble être une notion totalement privée, alors oui, ce billet ne vous concerne pas.

Ensuite, c’est par le partage que l’on fait avancer les choses. Si je peux donner à Fibaro (pour en citer un au hasard), la durée de vie de son module (qui tombe en panne par exemple après 67789 utilisations), et qu’il revoit sa copie, alors oui ça m’intéresse.

En espérant vous avoir ouvert les yeux sur la façon dont on peut valoriser et exploiter des données de domotique,

Amusez vous bien :)

Classé dans domotique | Taggé , | 4 Commentaires
jan 04

Domotique et Intelligence : la connaissance

connaissance

Ce qui rend une installation domotique digne de ce nom, c’est la capacité qu’a ce système à interagir avec votre environnement mais surtout,  je pense,  a connaître ce qui l’entoure et de disposer d’informations lui permettant d’offrir une réaction ou une proposition en corrélation avec votre besoin de l’instant présent.

Quand j’ai abordé la domotique, j’en avais eu plus une vision d’intelligence artificielle à mon service que d’un simple concept d’électronique/informatique appliqué aux objets.
Sûrement parce que les gens de ma génération ont (re)découvert « 2001, L’odyssée de l’espace » et surtout HAL 9000 et s’en sont fait un Graal de ce qu’aller devenir l’informatique dans le futur.

Prendre cette voie a profondément modifié ma perception de ce que devait  être mon système domotique mais surtout sa construction et son déploiement.
Je n’ai pas eu l’approche conceptuelle qui était de rendre mon environnement « contrôlable » mais d’intégrer une nouvelle entité virtuelle en son sein.
Cette démarche, que j’espère vous présentez au fil de quelques billets au gré de mon humeur et de ma motivation ;) , donne à la domotique un nouveau sens qui, bien que cela demande plus de travail, apporte un oeil différent de cette « maison de demain » si chère à nos fournisseurs/intégrateurs/revendeurs.

Le terme « intelligence artificielle » me semble beaucoup trop présomptueux et souvent galvaudé pour l’utiliser,  je parlerais donc surtout d’ « intelligence » au sens large du terme et d’entité pour tenter de vous présenter mon approche.

alixearticleLe système mis en place chez moi s’appelle A.L.I.X.E (Automation Layer for Interact and eXchanging with Environment).

(pour l’anecdote (oui je sais que vous en êtes friand), quand j’attendais mon enfant, je souhaitais une fille, et j’avais déjà prévu de la prénommer Alixe. J’ai eu un garçon (rassurez-vous je n’ai pas de regret :D ), mais le prénom est resté dans mon subconscient et c’est l’entité de la maison qui en a hérité (oui c’est obsessionnel un geek ;) )

C’est un serveur dédié a cela. Quand j’utilise le terme « serveur » c’est uniquement pour avoir une vue « physique » de la chose. C’est un système d’exploitation, basé sur Debian, peaufiné et modifié pour répondre aux besoins (kernel, sécurité, stack reseau, file descriptor , executables, etc…, bref tout ce qui fait que vous optimisez votre serveur pour un rôle précis), disposant de son propre shell (sa ligne de commande) que j’ai développé au fil du temps avec un mélange de python et d’erlang, de son centralisateur d’évènements (dont j’ai sorti un version plus légère pour tous, xPL-PyHAL), d’un système de procédure de raisonnement, mais aussi de sa possibilité d’agréger des sources d’informations diverses et variées et d’en tirer sa quintessence pour les exploiter.
Un coeur de l’entité reproductible car c’est une simple image disque, autonome et déployable en quelques minutes si elle devait se déplacer.
Elle dispose de rôles et de prérogatives clairement définis que, dès le début, j’ai tenté de consigner dans un cahier des charges et d’explications, qui fait aujourd’hui plus de 200 pages… et qui, je pense, ne sera (re)lu que par moi mais qui m’ont forcé dès le début à rester au plus près de la voie que je m’étais fixé.

La conception habituelle de la domotique est d’avoir, dans la majorité la plus répandue des cas, une box domotique sur laquelle on contrôle ses périphériques (interrupteurs, capteurs etc…) et auxquels on applique des scénarios (« s’il fait nuit et qu’il y a un mouvement dans la cage d’escalier, allume la lumière du couloir du haut et du bas », pour les plus simples).
C’est un fonctionnement abordable par tous, simple (si on maitrise un tant soit peu les nouvelles technologies), immédiatement opérationnel (après avoir connecté tout ses modules) et donnant des résultats plus que satisfaisant.

Toute cette très longue introduction pour aborder la notion de connaissance dans votre environnement domotique.

connaissance2Une des choses les plus importantes, que ce soit en informatique ou en domotique, c’est la donnée.

A ce sujet, je vous invite grandement, avant tout,  à regarder la keynote de Mathias Herberts à l’IFREMER (avec qui j’ai eu le plaisir de travailler et qui m’apporte, encore,  des vues et des échanges plus qu’intéressants) dans laquelle il aborde, simplement, le rôle de ses données :

Votre système domotique ne peut être performant que si ces données sont importantes, pertinentes et variées mais surtout, s’il en a l’accès et la connaissance.

Lors de la rédaction de mon suivi de déploiement, il m’a semblé nécessaire d’y inclure une partie « connaissance », que l’on pourrait résumer simplement par « Ce que je sais ».

Que « sait » votre système domotique à l’instant T ? Quelles connaissances a t’il de son environnement au moment où vous le solliciter ? Bref, que connais l’entité pour apporter la réponse qui vous satisfait le mieux ?

La connaissance, aujourd’hui, est, du moins par chance dans notre pays, accessible à tous. Quelle que soit la question que vous vous posez, un moteur de recherche internet vous donnera une multitude de sources d’informations vous permettant d’acquérir cette connaissance (à vous bien sûr d’être assez objectif pour faire le tri de ce flot d’informations), et surtout de savoir rapidement se cantonner a sa demande ;) (tout le monde a eu cette bizarre expérience de chercher une information sur quelque chose et de se retrouver à lire d’autres articles très éloignés du sujet principal (va savoir pourquoi aujourd’hui je lisais avec intérêt la définition du dizaote alors qu’à la base je cherchais une information sur un réalisateur de cinéma…)

Cette connaissance, c’est à vous de l’apporter a votre système et de savoir s’il y en a suffisamment pour que sa réaction soit la même que vous auriez eu.

Un des tests les plus simples à faire (et que je fais souvent avec ALIXE) est « Que sais-tu ? »

Voici par exemple un extrait d’une simple réponse donnée à l’écriture de ce billet :

DANS L'ENSEMBLE, JE SAIS QUE :
Il fait nuit , et nous  sommes en week-end
Aucun mouvement exterieur détecté depuis plus de 1 heure
Le dernier appel téléphonique reçu était le 0298  à 16h32
Tu es présent dans la maison ainsi que Madame et Junior
Tu n'es pas dans ta voiture et pas au travail
Tu n'es pas en RTT, ni Madame
Parmi les parents, personne n'est en congés ou en RTT 
Junior est en vacances scolaires
Nous consommons actuellement 1341 Watts 
Aujourd'hui, nous avons consommé 423 Litres d'eau
Et depuis le dernier relevé, nous avons consommé 34266 Litres d'eau
L'alarme est désactivée
DANS LE SALON
Dans le salon, il y a quelqu'un
Cette personne est Madame
L'halogène du salon est allumé ainsi que la télévision
Les fenêtres sont fermées
Il y fait 20 degrés 
DANS LE BUREAU
Dans le bureau, il n'y a personne
La fenêtre est fermée
Il y fait 19.8 degrés 
L'onduleur est sur secteur et consomme 507 Watts 
L'accès à internet est opérationnel

C’est une très petite extraction de ce qu’ALIXE peut ressortir de ses connaissances de l’instant T.

Elle est rendu possible parce qu’elle dispose de nombreuses sources d’informations qui ensuite sont ingérées par le système.
La box domotique Zwave (une VeraLite) est une de ses sources (et n’est pas considéré comme le contrôleur principal mais comme un fournisseur de flux), les sondes de températures, une autre, nos agendas gmail, les tags NFC, les smartphones, le récepteur RFXCOM 433 Mhz, les capteurs de mouvements, d’ouvertures, les caméras de surveillances, les bornes wifi, etc…

Tout est source d’informations et est envoyée ou reçue par ALIXE.

Ces données informatives sont ou durables dans le temps  par nécessité d’exploitation future (les valeurs des sondes de températures et d’hygrométrie par exemple) et sont stockées dans une base de données, ou purement volatiles (l’état d’une lumière ou si je suis dans la voiture par exemple) et là elle sont stockées dans un Memcached en tant que clé/valeur (clé:guiguienvoiture valeur:non).

ALIXE ne fait qu’interroger ses données pour mettre à jour ses connaissances à l’instant T.

Vous utilisez Memcached, vous avez un simple serveur http apache avec php, une page toute bête du genre

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Connexion impossible");
$get_halogenesalon = $memcache->get('halogenesalon');
if ($get_halogenesalon=="on")
$halogenesalon="allumé";
else
$halogenesalon="éteint";
$memcache->close();
?>
 
DANS LE SALON :
L'halogène du salon est <?php echo $halogenesalon ; ?>

Et vous avez une idée des connaissances de votre système domotique.

En ne considérant que tout les équipements domotiques de la maison n’étaient que des extensions de l’entité (les box/contrôleurs compris), cela a profondément modifié la façon d’interagir avec l’environnement mais surtout de simplifier l’interaction et les connaissances qu’elle pouvait avoir.

Aujourd’hui, je ne suis pas dépendant d’une technologie, d’une box, ou d’un protocole parce que tout cela n’est qu’un élément, une main d’ALIXE.
Tout son « réseau » de données lui donne les connaissances nécessaires pour savoir, quand c’est le moment, l’état presque complet de son environnement.

Si vous décidez de pousser plus loin le concept de votre domotique personnelle (ou même dans l’état actuel de votre installation), prenez à coeur d’essayer de recenser les connaissances qu’à votre système de votre environnement. Cet état de connaissance poussera beaucoup plus loin les possibilités de scénarios que vous pourriez demander à votre système et pourra même vous suprendre par les lacunes qu’il peut avoir.

Quand l’état de connaissance de l’environnement s’approchera très fortement (voir le dépassera dans la plupart des cas, sinon à quoi servirait la domotique ;) ), de ce que VOUS savez, la phase d’interaction n’en sera que plus perspicace et efficace.

Mais ça, c’est pour un prochain billet :)

Classé dans domotique | 13 Commentaires
nov 11

Mise en oeuvre d’un serveur d’authentification SSO avec CAS et Memcached

sso

Après ce billet où j’ai détaillé la mise en place d’un load-balancing/failover a base de cascade de NS, nous allons passer aujourd’hui à la deuxième partie. Et surtout, au but dont je voulais vous parler dans ce petit challenge technique que mon ami Horacio m’a doucement poussé à réaliser (bien malgré lui :) c’était plutôt un défi personnel que j’avais envie aussi de concevoir).

Au fil de plusieurs discussions techniques enjouées (avec Horacio, le terme enjouée prend rapidement des allures de trolldi :D (private joke)), un système CAS a peuplé nos échanges et je vous en livre ici une explication dans le texte.

CAS (Central Authentication Service) est un système d’authentification unique basé sur une gestion de ticket provisoire.

Il permet à un utilisateur de ne s’authentifier qu’une fois sur un portail web pour avoir accès à diverses ressources (sites web différents la plupart du temps) qui se base également sur ce système d’authentification.
C’est le fameux SSO (Single Sign-On) dont vous avez peut-être entendu parlé.

Le challenge que je me suis donné est bien entendu de rendre cette solution hautement disponible. Si votre serveur CAS est inaccessible, c’est un lot non négligeable d’utilisateurs qui ne pourront plus s’authentifier, avec les désagréments qui vont avec (des gens en cravate partout dans votre bureau ou par dessus votre épaule pour savoir quand cela remarchera).

Quelques années en arrière, je vous avais parlé de Memcached et de la façon de le faire fonctionner en mode sécurisé. Et ça tombe bien, CAS supporte memcached :)

Nous allons considérer que vous avez vos deux serveurs en place, loadbalancés par une technique quelconque (avec PF sous OpenBSD, avec une cascade de NS, avec LVS sous Linux, une appliance propriétaire ou une IP FailOver, bref ce que vous voulez).

Première étape, déployer sur le deux serveurs, un memcached répliqué. Rien de bien compliqué si vous avez lu ce billet (je vous laisse bien évidemment validé que vos clés/valeurs se répliquent correctement).

Déployer un serveur Tomcat sur chacune de vos machines (Tomcat 6 ou 7 à votre convenance, prenez le Core) avec un java 1.6 minimum.
Wget, puis tar xzvf apache-tomcat-x.x.x.tar.gz etc… Rien de transcendant.

- Génération du certificat SSL

CAS exige une connexion https, donc nous allons générer un certificat pour nos tomcats.

serveur:/opt/tomcat7# keytool -genkey -alias tomcat -keyalg RSA -validity 365
Tapez le mot de passe du Keystore :
Quels sont vos prénom et nom ?
[Unknown] :  cas.guiguiabloc.fr
Quel est le nom de votre unité organisationnelle ?
[Unknown] :  guiguiabloc
Quelle est le nom de votre organisation ?
[Unknown] :  guiguiabloc
Quel est le nom de votre ville de résidence ?
[Unknown] :  Brest
Quel est le nom de votre état ou province ?
[Unknown] :  Bretagne
Quel est le code de pays à deux lettres pour cette unité ?
[Unknown] :  FR
Est-ce CN=cas.guiguiabloc.fr, OU=guiguiabloc, O=guiguiabloc, L=Brest, ST=Bretagne, C=FR ?
[non] :  oui
 
Spécifiez le mot de passe de la clé pour tomcat
(appuyez sur Entrée s'il s'agit du mot de passe du Keystore) :

ATTENTION : spéficiez bien le nom « loadbalancé » DNS de votre CAS (le nom utilisé pour joindre les deux instances dans le champ « Quels sont vos prénom et nom ? »

Décommentez la partie SSL dans le fichier server.xml de votre Tomcat (/TOMCAT_HOME/conf/server/xml)

<!--
   <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
   maxThreads="150" scheme="https" secure="true"                clientAuth="false" sslProtocol="TLS" />
-->
(Enlevez les <!-- et -->)

Exporter le certificat pour l’installer sur votre autre Tomcat

keytool -export -alias tomcat -file servercas.crt

Sur le deuxième serveur :

keytool -import -file servercas.crt -keystore $JAVA_HOME/jre/lib/security/cacerts -alias tomcat

Démarrer les tomcats (bin/startup.sh) et vérifier qu’ils sont bien accessibles sur le port 8443 en https.

- Installer Maven 2
Rendez vous sur le site du projet Maven et téléchargez la version 2.2.1 (la version 3 n’est pas encore recommandé pour CAS)

wget http://mirrors.ircam.fr/pub/apache/maven/maven-2/2.2.1/binaries/apache-maven-2.2.1-bin.tar.gz
tar xzvf apache-maven-2.2.1-bin.tar.gz
ln -s apache-maven-2.2.1 maven2

Ajouter l’emplacement des binaires Maven2 à votre PATH (et votre JAVA_HOME si cela n’a pas déjà été fait)

# export PATH=/opt/maven2/bin:$PATH
#export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.26/jre

(OUI ! je sais, j’ai une vieille version de JAVA toute pourrie sur mes serveurs de tests :D donc je vous laisse mettre à jour la votre)

Vérifier que Maven est opérationnel :

# mvn --version
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_26
Java home: /usr/lib/jvm/java-6-sun-1.6.0.26/jre
Default locale: fr_FR, platform encoding: ISO-8859-15
OS name: "linux" version: "2.6.26-2-686" arch: "i386" Family: "unix"

(OUI ! Je sais, j’ai un kernel tout moisi. Ca suffit à la fin !)

- Installer CAS

Nous allons utiliser la version communautaire de CAS, conçu par l’université de Yale et maintenu désormais par le projet Jasig qui réunit diverses écoles.
Téléchargez la dernière version a ce jour (3.5.2) :
http://www.jasig.org/cas/download
Une fois le fichier détarré/dégzippé, créer votre propre environnement de travail :

cd /opt/cas-server-3.5.2
mkdir cas-guiguiabloc
cd cas-guiguiabloc

Dans le répertoire de votre projet, nous allons créer le fichier « de configuration » de CAS. Il contient les appels vers les différentes dépendances disponibles.
Ce fichier s’appelle pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd ">
    <modelVersion>4.0.0</modelVersion>
    <groupId>fr.guiguiabloc.cas</groupId>
    <artifactId>cas-guiguiabloc</artifactId>
    <packaging>war</packaging>
    <version>1.1-SNAPSHOT</version>
 
    <build>
        <plugins>
            <plugin>
                 <artifactId>maven-war-plugin</artifactId>
                             <configuration>
                                 <warName>cas</warName>
                             </configuration>
                        </plugin>
        </plugins>
    </build>
 
    <dependencies>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-webapp</artifactId>
            <version>${cas.version}</version>
            <type>war</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-support-generic</artifactId>
            <version>${cas.version}</version>
            <type>jar</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-integration-memcached</artifactId>
            <version>${cas.version}</version>
            <type>jar</type>
        </dependency>
    </dependencies>
 
    <properties>
        <cas.version>3.5.2</cas.version>
    </properties>
 
        <repositories>
             <repository>
                  <id>ja-sig</id>
                  <url>http://oss.sonatype.org/content/repositories/releases/ </url>
             </repository>
        </repositories>
</project>

Je ne détaillerais pas tout, la documentation de CAS est assez explicite, mais dans notre exemple, nous allons utiliser une webapp générique, avec le support memcached et que Maven2 puisse utiliser les dépots publics de Jasig.

C’est parti pour une première compilation !

cd /opt/cas-server-3.5.2/cas-guiguiabloc
mvn clean package

Laisser le temps a Maven de télécharger Internet et le résultat devrait apparaitre

[INFO] [war:war {execution: default-war}]
[INFO] Packaging webapp
[INFO] Assembling webapp[cas-guiguiabloc] in [/opt/cas-server-3.5.2/cas-guiguiabloc/target/cas-guiguiabloc-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Processing overlay[ id org.jasig.cas:cas-server-webapp]
[INFO] Webapp assembled in[4636 msecs]
[INFO] Building war: /opt/cas-server-3.5.2/cas-guiguiabloc/target/cas.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 minutes 36 seconds
[INFO] Finished at: Mon Nov 11 00:42:10 CET 2013
[INFO] Final Memory: 18M/44M
[INFO] ------------------------------------------------------------------------

En l’état, vous avez donc maintenant un joli cas.war dans le répertoire target de votre projet que vous pouvez déposer dans votre tomcat/webapps/.
Cela vous permet déjà de vérifier que tout fonctionne comme il se doit sur https://serveur:8443/cas

Maintenant, peaufinons tout cela :

serveur:/opt/cas-server-3.5.2/cas-guiguiabloc# mkdir -p src/main/webapp/WEB-INF

Dans ce répertoire WEB-INF, nous allons y copier le fichier :
/opt/cas-server-3.5.2/cas-guiguiabloc/target/cas-guiguiabloc-1.0-SNAPSHOT/WEB-INF/deployerConfigContext.xml
et le modifier pour inclure :
- l’authentification locale par un user/mot de passe
- le support de memcached

Pour l’authentification locale, ajouter la section suivante :

<bean class="org.jasig.cas.adaptors.generic.AcceptUsersAuthenticationHandler">
 <property name="users">
   <map>
   <entry>
   <key>
                                                                <value>guiguiabloc</value>
   </key>
                                                                <value>1234</value>
   </entry>
   </map>
   </property>
   </bean>

 

Ici nous créons un simple utilisateur « guiguiabloc » avec le mot de passe 1234.
En prod, vous pourrez utiliser un autre système d’authentification bien sur (LDAP etc…)

Pour le support memcached, voici la section a ajouter :

bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.MemCacheTicketRegistry">
  <constructor-arg index="0" ref="memcachedClient" />
  <constructor-arg index="1" value="21600" />
  <constructor-arg index="2" value="300" />
</bean>
<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean"
      p:servers="127.0.0.1:11211"
      p:protocol="TEXT"
      p:locatorType="ARRAY_MOD"
      p:failureMode="Cancel"
      p:transcoder-ref="kryoTranscoder">
</bean>
<bean id="kryoTranscoder"
      class="org.jasig.cas.ticket.registry.support.kryo.KryoTranscoder"
      init-method="initialize">
  <constructor-arg index="0" value="8192" />
</bean>

Bien sur je ne peux que vous invitez a lire la documentation officielle :)
https://wiki.jasig.org/display/CASUM/MemcacheTicketRegistry

A toute fin utile, vous trouverez ICI le fichier deployerConfigContext.xml que j’ai utilisé.

On recompile le WAR dans cas-guiguiabloc (mvn clean package) et on le copie dans nos webapps Tomcat (après avoir supprimé l’ancien répertoire cas)

Démarrez vos Tomcat et authentifiez vous sur la mire CAS, Tadam !
Si tout se passe bien, la connexion réussi et vous devez avoir un cookie CAS :

Name	CASTGC
Value	TGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.org
Domaine (host)	cas.guiguiabloc.fr
Chemin d'accès (path)	/cas/
Sécurisé	oui
Expire le	À la fin de la session

Et magie, sur vos deux memcached, vous allez retrouver votre ticket en recherchant la valeur du cookie en tant que clé :

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get TGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.org
VALUE TGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.org 0 386
BH .
guiguiablocuiduidgroupMembershipgroupMembershipeduPersonAffiliationeduPersonAffiliationauthenticationMethod?org.jasig.cas.adaptors.generic.AcceptUsersAuthenticationHandlerÞÉP!лôîJTGT-3-mcWQGjaB1bSHNScWUJbq2EyLsLm9vysjl6lIkaXfuN4TMFVTow-cas01.example.orgäÉPÞÉP+ST-6-iHWaAvdowI0WGE1du76P-cas01.example.org
END

Vos deux serveurs CAS se partagent la même source d’information de tickets valides :D

J’espère que cette petite approche de CAS vous aura émoustillé. Bien entendu, il existe plein d’options de compilation et de configuration qui vous permettrons d’avoir un/des serveur(s) CAS aux petits oignons.

Si vous souhaitez maintenant intégrer votre serveur web à CAS (avec Apache par exemple), vous trouverez un très bon tuto ici :
https://ucdavis.jira.com/wiki/display/IETP/mod_auth_cas
Pour info, la méthode la plus facile pour compiler le mod_auth_cas avec apxs2 est :

apxs2 -i -lssl -lcurl -c mod_auth_cas.c cas_saml_attr.c

Amusez-vous bien :D

Classé dans architecture, linux, sécurité | Taggé , , | 6 Commentaires
nov 10

OVH, vers un Adsl neutre

Je fais partie de cette génération qui est née avec l’informatique.

Quand je dis « informatique », je ne parle évidemment pas de Facebook, Google, Twitter ou YouPorn

J’ai eu cette chance immense (du moins je le pense), de découvrir les premiers ordinateurs personnels, de m’amuser à me connecter aux premiers réseaux (ah le temps des BBS et de Transpac :p), et surtout de voir naître Internet et d’être parmi les premiers a m’y raccorder.

Durant ces années passées, j’ai pu voir fleurir les offres d’accès, m’enthousiasmer des vitesses de connexions de plus en plus rapides et du nombre de personnes sur le « réseau des réseaux ».

Je fais partie de cette génération de geek que la nouvelle vague a qualifiée de « Barbus », des vieux schnoques qui ont connu VAX et qui pestent quand il s’agit de trouver « telnet » sous windows Seven (quand on les forcent à prendre la main dessus). Mais aussi et surtout, de cette génération pour qui le partage de connaissances et d’informations est un cheval de bataille et un acquis profond et pour qui l’aide à autrui est une chose complètement naturelle (mais qui s’est vite rendu compte dernièrement que l’aide s’est transformée en assistanat, à son plus grand désarroi).

Cette petite introduction pour tenter/essayer d’expliquer la suite.

Durant ces longues années d’internaute, j’ai pu tester un grand nombre de FAI et de technologies et vers le début des années 2000, mon choix s’est arrêté sur Free.

Free, parce qu’a cette époque et jusqu’à assez récemment, j’ai toujours cru qu’il était LE FAI du Geek. Innovant, bousculant les préjugés, s’empêchant de rentrer dans le moule et m’offrant un accès sans contrainte au réseau Internet (oui, c’était avant…).

Car force est de constater qu’au fil des dernières années, cette attitude a complètement changé.
Je peux en parler plus facilement car j’ai donné beaucoup pour Free. J’étais membre et modérateur de l’ADUF (l’Association des Utilisateurs Free) depuis 2005, j’ai été « helpeur » sur IRC sur les canaux dédiés à Free, allant jusqu’à être aujourd’hui IRCop du réseau Europnet (sur lequel irc.free.fr est membre), et j’ai discuté avec des tas de clients, techniciens ou super-techniciens de ce FAI (voir plus ;) ).
Autant vous dire que le monde « Free », je le connais quand même un peu…

Je ne referais pas l’actualité de Free, vous la connaissez autant que moi.
Au bout d’un moment, quand on a l’esprit de transparence, cela commence a faire bouillir légèrement.

Depuis le début, j’ai toujours reproché à Free son manque de transparence vis à vis de ses clients  et, dernièrement,  la « prise d’otage » de ses clients pour influencer un plus gros que lui a été la cerise qui a fait déborder le gâteau.

A côté de cela, j’ai aussi vu naître OVH et surtout son geek de « guide », Octave Klaba.
J’avais déjà parlé de l’interet que je portais à OVH dans de précédents billets,

S’il y a bien une chose qu’on ne peut reprocher à OVH, c’est son manque de transparence. Tout y est. Le moindre incident est tout de suite rapporté aux clients (et à tous d’ailleurs) via la page Travaux.
L’accès à l’état du reseau en temps réel, l’état des serveurs dédiés dans les Datacenters, la latence des équipements d’infrastructures etc…
Cela peut paraître futile a certains, mais personnellement, je connais peu de FAI/Hébergeur qui donnent accès ainsi a leurs graphes…

Ajouter à cela un DG/C(T|E)O présent sur Twitter, les forums et accessible par email (sérieusement vous avez vu ca ailleurs ???) et qui répond (ah bah oui, Mr Xavier Niel, c’est pas tout d’être sur les réseaux sociaux, d’avoir une adresse email, faut répondre aussi..).

Je ne fais pas de prosélytisme pour OVH, mais il faut bien avouer qu’ils forcent le respect. De plus, et ce n’est pas une chose qu’un geek prend a la légère, au bout du fil de la hotline, il y a des gens qui parlent et comprennent ce que vous dites ! (si si :) )

Pour avoir tester 3 ou 4 fois, en désespoir de cause, la hotline de Free, j’ai été sidéré de l’incompétence technique de mes interlocuteurs (je suis navré, mais quand un sysadmin ou un admin résal appelle une hotline, se présente en tant que tel et demande a ce que l’on passe directement a la partie technique et pas au « vous etes sous windows ? Mac ?…), on s’attend a un peu de répondant plutot que « cliquez sur démarrer/executer » quand on parle de routage ou d’OpenBSD…)
A l’inverse, j’ai très peu appelé la hotline OVH mais quand je parle de DRBD a mon interlocuteur, il me demande plutot la version du module utilisée… On est décidement pas dans la même cour…

J’extrapole bien évidemment, mais il faut dire les choses telles qu’elles sont, chez OVH, j’ai eu des sysadmins au bout du fil qui parlait la même langue que moi, et rien que ça, ça donne du baume au coeur (en plus de régler un incident plus vite…)

Bien sûr, il y a aussi des côtés négatifs. Que je te fasse des mises en prod en pleine journée, que je te mette une mise à jour d’un ios Cisco sur les routeurs à l’arrache, que je me plante dans l’ospf…  Bref, la vie d’un client OVH n’est pas des plus faciles tout les jours, mais bon, j’ai assimilé cela depuis le début, c’est une boite de geeks, administrée par des geeks et ils font un peu ce qu’ils veulent, quand ils veulent, avec les aléas qui en dépendent (en même temps, ils avouent rapidement quand ils ont fait une bourde…).

Tout ce bla-bla donc pour dire que lorsqu’OVH a décider de se lancer en tant que FAI, j’ai ouvert les deux yeux et j’ai suivi les retours de près.
Quand en plus, Octave Klaba commence a remuer tout le monde en disant que son métier c’est le réseau et pas autre chose, qu’un FAI doit offrir un ADSL neutre sans bridage, filtrage et tout faire pour offrir l’accès au réseau des réseaux pour lequel paye son client, la je me dis, mon petit Guigui (oui j’aime me caresser tendrement dans le sens du poil le soir au coin du feu), tu dois quitter Free pour prendre ton Adsl chez lui.

Je n’encense pas Octave Klaba, j’ai même eu quelques désaccords avec lui, mais le bonhomme est ce qu’il est, franc du collier, transparent (même sur des aspects difficiles de sa vie privée), et avec ce caractère bien trempé qu’a tout barbu de ma génération.

Alors j’ai décider lui faire confiance une nouvelle fois (car oui, mes serveurs dédiés sont chez OVH déjà) pour mon accès ADSL perso.

J’y suis allé avec la même inquiétude que lorsque j’ai quitter France Telecom pour Free il y plus de 10 ans (pour l’ADSL), et j’osais espérer que y prendre la même satisfaction.

Aujourd’hui cela va faire 8 mois que mon ADSL est géré par OVH.

Et j’en tire un bilan plus que positif.
Tout d’abord une synchro plus haute qu’avec Free (non dégroupé):

xDSL Type:                               ADSL2+
Bandwidth (Down/Up – kbit/s):            23326/1020

Un débit constant quand je télécharge (comprendre ramener une simple image iso un dimanche après midi). Alors qu’avant mon débit faisait le yoyo entre 12Ko/sec et 1,9Mo/sec, aujourd’hui il reste stable a 2,1Mo/sec.

Un modem qui m’a plus amusé que la freebox (voui je sais, c’est totalement subjectif de faire joujou avec telnet).

Une téléphonie parfaite, et surtout, un accès aux services Google sans faille (qui a dis youtube ?…).

Alors mon accès est-il vraiment neutre ? Concernant les débits, oui, je n’ai pas vu/ressenti une quelconque QoS sur mon accès.
Concernant mes données qui transitent ? Difficile de le savoir (après tout, OVH analyse les emails sortants des serveurs de ses clients), mais j’ai la naïveté de le croire.
En tout cas, après ses 8 mois d’utilisation, j’avoue ne pas regretter mon choix.

Classé dans geekerie | 14 Commentaires