[ N O C T E R N I T Y ] Une contribution à la pollution générale de l'internet

27Mar/130

Bidouilles avec Asterisk (4/?) – Répondeur

Même dans le contexte d'une installation domestique, il est vraiment utile de disposer d'un répondeur. Mon idée est de configurer le système afin qu'il supporte un ensemble de boîtes personnelles, ainsi qu'une boîte "familiale". Idéalement, les téléphones ou softphones locaux devraient pouvoir accéder aux boîtes de messagerie qui leurs correspondent (messagerie du possesseur et messagerie familiale) sans avoir à saisir un mot de passe, mais les autres boîtes devraient être accessible avec un identifiant et un mot de passe depuis tous les postes internes.

Configuration de base

Avant d'essayer de réaliser cela, j'ai mis en place une configuration qui ne fonctionnait que sur l'une de mes lignes de test, et qui nécessitait systématiquement une identification de l'utilisateur pour l'accès à la messagerie. La première chose que j'ai configuré était l'application de messagerie elle-même. Dans ce but, j'ai réactivé le module app_voicemail.so et écrit un fichier de configuration pour l'application (le fichier voicemail.conf). Outre la messagerie en elle-même, je voulais également mettre en place l'envoi d'un e-mail, avec le message vocal en attachement. Enfin, j'ai repéré dans la configuration des options qui forcent un utilisateur à configurer ses messages d'accueil et son mot de passe lors de sa première connexion à la messagerie, ce qui me semblait intéressant. Voici le fichier de configuration résultant de ces choix.

[general]
format=wav49|gsm|wav

serveremail=phones@nocternity.net
fromstring=Téléphonie
attach=yes
emaildateformat=%A, %d %B %Y at %H:%M:%S
sendvoicemail=yes
charset=UTF-8

maxmsg=100
maxsecs=180
minsecs=3 
maxgreet=90
maxsilence=2 
silencethreshold=128

moveheard=yes
review=yes
forcename=yes
forcegreetings=yes

maxlogins=3
minpassword=4 

[zonemessages]
; Empty

[default]
1 => 1,Emmanuel Benoît,tseeker@nocternity.net

J'ai laissé la section zonemessages vide car je n'ai pas besoin des capacités qu'elle permet de mettre en place. Par ailleurs, le mot de passe mis à "1" dans la configuration de mon utilisateur va forcer l'application de messagerie à me demander de le changer (et d'enregistrer les messages d'accueil) lors de ma première connexion.

L'étape suivante est de modifier le plan de numérotation. Il m'a fallu modifier l'une des extensions utilisées pour contacter les téléphones internes afin d'y ajouter un renvoi sur le répondeur si nécessaire. J'ai utilisé la configuration suivante:

exten => 100,1,Dial(${DIAL_TEST1},10,tT)
	exten => 100,n,Voicemail(1@default)
	exten => 100,n,Hangup()

Le nouvel argument passé à Dial() indique le temps maximal de sonnerie avant que la suite du plan ne s'exécute. Dans ce cas précis, "fais sonner le téléphone pendant 10 secondes et, s'il n'y a pas de réponse, déclenche le répondeur".

J'ai aussi dû créer une extension qui permette aux utilisateurs (en l'occurrence: moi) d'accéder à leur boîte de messagerie:

exten => 666,1,VoiceMailMain()
	exten => 666,n,Hangup()

Enfin, j'ai modifié le recours au répondeur afin d'utiliser le message d'accueil correspondant à la situation en fonction de l'état de sortie de l'application Dial(). J'ai éprouvé quelques difficultés du fait de la syntaxe un peu tordue.

exten => 100,1,Dial(${DIAL_TEST1},10,tT)
		exten => 100,n,Voicemail(1@default,${IF($["${DIALSTATUS}" = "BUSY"]?b:u)})
		exten => 100,n,Hangup()

Note au sujet des avertissements de présence de messages

J'ai tenté de configurer des avertissements à envoyer aux clients SIP en cas de nouveaux messages, ce qui se fait en ajoutant dans la section correspondante de sip.conf une ligne ressemblant à:

mailbox=1@default

Malheureusement, il semble que Linphone ne supporte pas ces notifications (cela cause un message d'avertissement dans le journal d'Asterisk); quant aux autres logiciels libres de téléphonie que j'ai essayés, ils ont manifesté une fâcheuse tendance à m'exploser au nez.

Configuration générale

Il était nécessaire d'opérer à quelques grosses modifications pour mettre en œuvre l'idée mentionnée dans l'introduction de ce post.

Répondeur sur tous les téléphones

Tout d'abord, il me fallait mettre en place un recours au répondeur sur tous les téléphones. Je souhaitais cependant éviter que la configuration ne devienne une espèce de plâtrât (oui c'est un vrai mot) de copier/coller. J'ai donc dû apprendre à utiliser les macros, qui sont tout simplement des sections du plan de numérotation qui peuvent être réutilisées. Voici la macro que j'ai utilisée pour le recours au répondeur:

[macro-internal-call]

exten => s,1,Dial(${ARG1},10,tT)
	exten => s,n,Voicemail(${ARG2}@default,${IF($["${DIALSTATUS}" = "BUSY"]?b:u)})
	exten => s,n,Hangup()

Cette macro prend deux arguments: le(s) téléphone(s) à appeler, et le numéro de boîte de messagerie. J'ai ensuite remplacé les parties correspondant aux appels internes par un "appel" à cette macro:

exten => 100,1,Macro(internal-call,${DIAL_TEST1},1)
exten => 101,1,Macro(internal-call,${DIAL_TEST2},1)
exten => 102,1,Macro(internal-call,${DIAL_TEST3},2)

(J'avais ajouté les boîtes de messagerie #2 et #9 entre temps.) Enfin, j'ai "émulé" la boîte de messagerie familiale en ajoutant l'extension suivante:

exten => 999,1,Macro(internal-call,${DIAL_TEST1}&${DIAL_TEST2}&${DIAL_TEST3},9)

... qui fait sonner tous les téléphones quand elle est appelée, puis passe sur la boîte de messagerie 9 s'il n'y a pas de réponse.

Accès direct à la messagerie

L'étape suivante impliquait d'autoriser les clients à accéder à leur propre boîte de messagerie, ainsi qu'à la messagerie familiale, sans avoir à saisir de mot de passe. J'ai commencé par attribuer à chaque client SIP un contexte qui correspondrait à son "possesseur" dans le fichier sip.conf:

; ...

[test1](test-template)
        context=phones-tseeker
        ;...

[test2](test-template)
        context=phones-tseeker
        ;...

[test3](test-template)
        context=phones-ju
        ;...

Bien entendu, j'ai ensuite défini ces contextes dans le plan de numérotation. Je voulais, là aussi, éviter de devoir copier/coller de vastes morceaux de configuration; pour cela j'ai utilisé la directive include. Celle-ci permet l'utilisation des définitions figurant dans une section depuis une autre section. La version modifiée d'extensions.conf ressemblait un peu à ceci:

[phones-tseeker]

        include => tests
        include => phones

[phones-ju]

        include => tests
        include => phones

[tests]

        ; Divers tests préfixés par 8378 ici

[phones]

exten => 100,1,Macro(internal-call,${DIAL_TEST1},1)
; etc...

exten => 666,1,VoiceMailMain()
        exten => 666,n,Hangup()

Enfin, j'ai ajouté les lignes permettant l'accès direct aux boîtes de messagerie dans les sections spécifiques aux utilisateurs:

[phones-tseeker]

        include => tests
        include => phones

exten => 700,1,VoiceMailMain(1@default,s)
        exten => 700,n,Hangup()
exten => 701,1,VoiceMailMain(9@default,s)
        exten => 701,n,Hangup()

[phones-ju]

        include => tests
        include => phones

exten => 700,1,VoiceMailMain(2@default,s)
        exten => 700,n,Hangup()
exten => 701,1,VoiceMailMain(9@default,s)
        exten => 701,n,Hangup()

Quelques réflexions pour plus tard

Je pense qu'il serait une bonne idée que les numéros internes ne soient pas préfixés par quelque chose pouvant indiquer un numéro sortant. La touche "étoile" semble un bon choix. Par ailleurs, il serait également bon de s'assurer que les numéros internes ainsi que les numéros de boîtes de messagerie suivent une certaine logique.

26Mar/130

Bidouilles avec Asterisk (3/?) – Un menu (plus ou moins)

Je voulais essayer d'ajouter quelque chose ayant une fonctionnalité similaire à celle d'un menu au dial plan. Bien que je ne sois pas sûr d'utiliser un menu dans la configuration finale, si le besoin se présente je serai en mesure de le faire.

Un menu (ou quelque chose avec une fonctionnalité similaire) peut être implémenté grâce à Background() ou WaitExten(). Ou les deux, d'ailleurs. Comme je n'ai rien de vraiment utilisable comme prompt, j'ai décidé de n'utiliser que ce dernier. Après tout, il ne s'agit que d'un test à ce stade.

Tout d'abord, j'ai remplacé le test précédent par ceci:

[test]

exten => 8378,1,Answer()
        exten => 8378,n,Set(TESTCOUNT=0)
        exten => 8378,n,Goto(numbers,0,1)

Asterisk répondra aux appels au numéro 8378 ("test"), créera une variable de canal nommée TESTCOUNT et la mettra à zéro, puis sautera à l'extension 0 de la section nommée numbers du plan. L'idée étant d'accumuler les chiffres saisis par l'utilisateur pour faire ensuite "dire" le nombre saisi par Asterisk, cette section contiendra donc des lignes similaires à celles présentées ci-dessous pour chaque chiffre:

[numbers]

exten => 0,1,Set(TESTCOUNT=$[ ${TESTCOUNT} * 10 ])
        exten => 0,n,WaitExten()
exten => 1,1,Set(TESTCOUNT=$[ ${TESTCOUNT} * 10 + 1 ])
        exten => 1,n,WaitExten()

; ... Pareil pour les chiffres 2 - 9 ici ...

Enfin, lorsque l'utilisateur appuie sur la touche étoile, le système devra "dire" le nombre (grâce à SayNumber()) qui a été saisi, puis raccrocher.

    exten => *,1,SayNumber(${TESTCOUNT})
	    exten => *,n,Hangup()
21Mar/130

Bidouilles avec Asterisk (2/?)

Dans le post précédent, j'avais réussi à obtenir une configuration d'Asterisk très basique mais fonctionnelle. Je n'ai pas eu le temps de m'y re-pencher sérieusement depuis, mais j'ai procédé à quelques améliorations ici et là.

Améliorations du dial plan

Dans plusieurs documents que j'ai lus, les dial plans contiennent toujours une instruction Hangup() pour toutes les extensions, quel que soit leur contenu. Je ne suis pas 100% certain que ce soit vraiment utile, mais je l'ai ajouté quand même, au cas où:

exten => 100,1,Dial(SIP/test1)
        exten => 100,2,Hangup()

exten => 101,1,Dial(SIP/test2)
        exten => 101,2,Hangup()

L'une des choses qui me semblaient un petit peu effrayantes avec le dial plan, c'est le fait que chaque étape doit être numérotée; en effet, insérer une ligne au milieu d'une extension impliquerait de renuméroter les lignes suivantes. Et cela serait un minimum agaçant. Il s'avère qu'Asterisk supporte l'utilisation de la valeur "n" pour le champ de priorité, qui permet la définition automatique de cette valeur (à l'exception de la première entrée d'une extension qui doit être "1" dans tous les cas):

exten => 8378,1,Answer()
        exten => 8378,n,Playback(hello-world)
        exten => 8378,n,Hangup

exten => 100,1,Dial(SIP/test1)
        exten => 100,n,Hangup()

exten => 101,1,Dial(SIP/test2)
        exten => 101,n,Hangup()

Enfin, j'ai commencé à utiliser des variables globales pour définir les destinations utilisées dans le plan. Cela me permettrait de changer celles-ci plus facilement, si j'en avais besoin.

[globals]
        DIAL_TEST1=SIP/test1
        DIAL_TEST2=SIP/test2

[test]

; ...

exten => 100,1,Dial(${DIAL_TEST1})
        exten => 100,n,Hangup()

; ...

Bon, d'accord, dans ce cas précis c'est "un peu" inutile, mais cela me servira plus tard.

Identifiant d'appelant pour les clients SIP

J'ai également ajouté des identifiants d'appelant pour les clients SIP. C'est extrêmement simple à mettre en œuvre, il suffit de rajouter une ligne qui ressemble à ceci...

        callerid="TSeeker's mobile" <101>

...dans la configuration pour le client SIP en question.

Transfert d'appels

Une autre chose que j'ai ajouté est la possibilité de transférer les appels. Tout d'abord, j'ai (re)créé un fichier features.conf afin de définir la séquence de touches devant être utilisée. Voici son contenu:

[general]
        ; Empty

[featuremap]
        blindxfer => #1
        atxfer => #2

[applicationmap]
        ; Empty

Ce n'est pas strictement nécessaire, on peut choisir d'utiliser les touches par défaut. Quoi qu'il en soit, l'étape suivante est d'activer la fonctionnalité sur les appels. Cela se fait à partir du dial plan:

; ...
exten => 100,1,Dial(${DIAL_TEST1},,tT)
; ...

Dans ce cas précis, j'autorise les deux côtés à transférer les appels, comme il s'agit de téléphones internes (j'ai ajouté un troisième client sur le PC de Ju pour pouvoir tester).

Modifications diverses

Parmi les autres modifications, j'ai également (re)configuré la journalisation, en utilisant la configuration suivante dans le fichier logger.conf:

[general]
        ; Empty

[logfiles]
        console => notice,warning,error,debug
        messages => notice,warning,error

Il n'est pas nécessaire d'utiliser la rotation de fichiers fournie par Asterisk, car le paquet Debian gère cela à travers logrotate.

J'ai également modifié modules.conf pour supprimer des modules dont je ne me sers pas (il s'agit juste d'une série de noload pour des choses dont je sais qu'elles ne me serviront pas, donc je ne trouve pas qu'il soit nécessaire de coller ça ici).

Enfin, je n'ai pour l'instant pas ajouté le support IPv6, car il faut que je passe sur Asterisk 1.8 pour cela et que, pour tester, IPv4 suffit bien. Je ne m'attends pas à des changements majeurs de ce point de vue-là de toute façon (bien qu'il soit fort possible que je me trompe).

19Mar/130

Bidouilles avec Asterisk (1/?)

Le "plan" à long terme chez nous est de se tourner vers la VoIP pour tous les appels téléphoniques. Cela implique de se débarrasser de nos vieux téléphones POTS,  l'utilisation de logiciels de téléphonie sur les PC, peut-être l'achat de matériel ou de téléphones VoIP, ou bien si jamais je prends le temps de finir de jouer avec la carte STM32, la construction d'une machine spécifique; cela implique également de souscrire à une paire de lignes SIP et d'utiliser une carte pour connecter notre ligne POTS au réseau.

Il y a un hic, cela dit: je n'ai jamais utilisé Asterisk (ou tout autre logiciel ayant un rapport quelconque à la VoIP), et il semble être assez complexe. Par conséquent, avant de faire quoi que ce soit, je vais devoir explorer sa configuration un minimum, quand j'ai un peu de temps et rien de plus important à faire.

Comme je suis un débutant complet quand il s'agit de cela, je vais essayer de poster au fur et à mesure, car cela pourrait être utile à quelqu'un dans une situation similaire.

Système

Avant de continuer, il convient de noter que je travaille avec un système Debian Squeeze fonctionnant sur une machine virtuelle Xen. Cette VM est sur un réseau utilisant à la fois IPv4 et IPv6. L'idée est d'avoir tout le trafic local en IPv6, et IPv4 à travers un NAT pour les connexions externes si elles ne supportent pas IPv6 (ce qui signifie que nos routeurs Linux ont besoin d'avoir nf_conntrack_sip et nf_nat_sip chargés; la machine virtuelle elle-même ne dispose que de nf_conntrack_sip). Même si j'ai lu que le NAT est terrible quand il s'agit de l'utiliser avec SIP (et pour tout le reste), je crains que je n'ai pas beaucoup de choix en la matière.

Pour l'instant je ne vais pas m'occuper de ce qui nécessite du matériel spécifique, car il est plutôt inutile d'acheter une carte à 700€  si je ne suis pas certain de ce que je peux faire avec.

J'ai commandé une paire de webcams équipées de microphones, et elles devraient arriver dans quelques jours. À l'heure actuelle, cependant, les PC ici n'ont aucun moyen d'enregistrer du son, donc ma capacité à tester en les utilisant reste limitée. J'ai pensé que je pouvais utiliser mon téléphone mobile pour les essais, cependant. J'ai donc installé Linphone à la fois sur mon PC et sur mon smartphone.

Installation d'Asterisk

Il s'agit d'un système Debian il est donc assez facile d'installer Asterisk et ses dépendances diverses:

apt-get install asterisk

Ok, en fait j'ai aussi enlevé quelques dépendances recommandées dont je ne vais pas avoir besoin (soit «pour l'instant» ou «ad vitam æternam»).

Le paquet Debian contient une bonne tonne métrique de fichiers de configuration dans /etc/asterisk; 'il me semble pratique de les  avoir sous la main comme ils sont très bien commentés, mais je les ai déplacés car je préfère écrire mes propres fichiers de configuration.

Premiers pas

La première chose que je veux faire est de configurer le serveur de sorte qu'il soit possible de s'y connecter. C'est la définition de «configuration minimale», mais il faut bien commencer quelque part.

J'ai utilisé des copies quasiment intactes des fichiers par défaut pour asterisk.conf et modules.conf (à l'exception des commentaires que j'ai supprimés car ils rendent la lecture plus difficile), mais je vais probablement devoir empêcher le chargement de certains modules quand j'aurai une meilleure idée de ce que je fais. La majeure partie de la configuration se fait dans sip.conf. Le voici:

[general]
        context=default
        allowoverlap=no
        udpbindaddr=0.0.0.0
        tcpenable=no
        srvlookup=yes

[test1]
        type=friend
        host=dynamic
        canreinvite=no
        nat=yes
        context=default
        dtmfmode=rfc2833
        allow=all
        username=test1
        secret=...

La section general est grosso modo la même que celle fournie par le paquet; elle est suivie de la définition d'un utilisateur de test que je pourrai utiliser pour me connecter. J'ai aussi ajouté un dial plan vide (je n'était pas sûr que ce soit nécessaire, mais je me suis dit que de toute façon cela ne ferait pas de mal). Voici le contenu du fichier extensions.conf:

[general]
static=yes
writeprotect=no
clearglobalvars=no

[globals]
; No variables

[default]
; Empty context

Après un peu de bidouillage avec la configuration de Linphone (il fallait ajouter un compte proxy en utilisant sip:test1@server-ip comme identité et sip:server-ip comme adresse du proxy), j'ai obtenu une connexion au serveur.

Un «dial plan» basique

L'étape suivante, en toute logique, était de tenter de faire que le client puisse numéroter, et que le serveur lui réponde avec ... quelque chose. N'importe quoi. Par chance, Asterisk est livré avec un beau fichier hello-world.gsm.

J'ai commencé par modifier mon utilisateur de test afin que son contexte par défaut soit autre chose que default (bizarrement, j'ai appelé ce nouveau contexte test). J'ai ensuite ajouté un dial plan tout simple qui ferait répondre le serveur, lui ferait lire le "hello world", et enfin le ferait raccrocher. Ceci serait déclenché par la numérotation du chiffre 1.

[test]
exten => 1,1,Answer()
exten => 1,2,Playback(hello-world)
exten => 1,3,Hangup

Et 1 fut numéroté, et "hello world" fut entendu, et TSeeker vit que la configuration était correcte.

Deux comptes

J'ai ensuite décidé de tenter de router des appels entre clients SIP. Bien entendu, comme seul l'un de mes deux clients de test est équipé d'un microphone, ma capacité à vérifier que tout fonctionne correctement est limitée.

Il m'a donc fallu commencer par ajouter un second client SIP. Comme sa configuration allait être pratiquement identique à celle du premier, j'ai essayé d'utiliser un template pour regrouper les parties communes. Voici la nouvelle version fichier sip.conf (sans la section general):

[test-template](!)
        type=friend
        host=dynamic
        canreinvite=no
        nat=yes
        context=test
        dtmfmode=rfc2833
        allow=all

[test1](test-template)
        username=test1
        secret=...

[test2](test-template)
        username=test2
        secret=...

J'ai ensuite ajouté quelques lignes au dial plan afin de permettre les appels entre eux. Deux lignes supplémentaires ajoutées à extensions.conf:

exten => 100,1,Dial(SIP/test1)
exten => 101,1,Dial(SIP/test2)

Comme nous n'avons pas de WiFi à la maison, j'ai du autoriser la plage IPv4 de mon opérateur de téléphonie mobile à se connecter au serveur. La configuration de Linphone sur le mobile requiert l'utilisation de l'adresse IPv4 interne du serveur (i.e. son adresse sur le LAN) comme domaine, et l'adresse IPv4 de la connexion ADSL comme proxy. Avec cette configuration, j'ai pu appeler le mobile depuis le PC et vice-versa.

13Nov/120

Bloqué sur le CS43L22

Je n'ai pas bien progressé récemment. Je suis en train d'essayer de faire produire des sons par la puce CS23L22 de la carte. Jusqu'ici, j'ai réussi à:

  • lui faire accepter des commandes via le bus I2C (et je sais que cela fonctionne parce que les commandes ne "timeoutent" pas),
  • activer et configurer le bus I2S.

J'envoie des données dessus (en gros une sinusoïde à 440Hz, histoire d'être très original), mais il n'y a rien en sortie. Je sais que l'horloge du bus est correcte, parce que je pompe mes données dessus "à la main" par le registre de données du SPI3 tout en changeant l'état d'une LED tous les 22100 échantillons, et cela marche exactement comme attendu (la LED clignotte avec une période de 2s). Je sais également que la puce fonctionne (car elle produit bel et bien du son lorsque j'exécute la démonstration qui fait partie du firmware d'origine).

Je suis persuadé qu'il s'agit d'un petit truc tout bête que j'oublie de faire ou que je ne fais pas dans le bon ordre... mais jusqu'à maintenant, je n'ai pas la moindre idée de ce dont il s'agit.

7Nov/120

RS232 != TTL

Ok, je l'ai déjà dit, mais le répéter une fois de plus ne nuira pas : en ce qui concerne l'électronique et le matériel, je suis totalement ignare. Donc, hier matin, j'ai passé à peu près 3 heures à essayer de connecter l'UART du STM32 à une prise DE9 de PC, à me demander ce qui, entre mon code et le paramétrage de Minicom, n'allait pas.

Et puis j'ai fini par chercher sur le web. Il s'avère que les signaux du microcontrôleur sont encodés en TTL (avec un voltage proche de 0V pour un zéro, et un voltage proche de celui de l'alimentation de la puce pour un un), alors que le RS232 utilise un voltage négatif pour indiquer un zéro.

Je me suis senti très bête.

Donc j'ai cherché comment interfacer les deux. Sur le web, on trouve de nombreux schémas et explications pour cela. Cet article est plutôt bon, et j'ai fini par utiliser le circuit qu'ils proposaient et des composants que je possédais déjà pour construire un adaptateur (enfin, sans les LEDs, parce que je ne vois pas trop l'intérêt).

Voici le résultat:

Et, si cela peut être utile, voici le schéma que j'ai utilisé pour la carte à proprement parler (ce n'est pas exactement ce qu'il y a sur la photo, parce que j'ai fait une petite erreur en le montant):

Enfin, la liste des composants:

Composants
R1 R2 R3 R4 R5 10kΩ
C1 10µF, 50V
D1 1N914
Q1 2N3906
Q2 2N3904
4Nov/120

Un peu de progrès

J'ai réussi à faire fonctionner l'écran TFT cet après-midi. Pour l'instant j'utilise du bit-banging à la fois pour l'initialisation du module et pour accéder à la mémoire vidéo (l'idée étant de tenter d'utiliser le FSMC du microcontrôleur plus tard). Je suis un peu déçu que le rétroéclairage soit branché directement sur l'alimentation (au lieu de passer par le SSD1963 qui permettrait de contrôler le niveau de luminosité), et par le fait que le signal de tearing ne soit pas connecté. Bah.

Celui-ci bouge:

3Nov/120

Jouets

Je me suis acheté quelques jouets intéressants:

Le module ITDB02-4.3 comporte un écran LCD 480x272 contrôlé par une puce SSD1963, un écran tactile à résistances (contrôlé par un XPT2046), et un emplacement pour carte SD. Pour l'instant, je n'ai réussi qu'à faire marcher l'écran tactile (je n'ai jamais programmé sur microcontrôleur jusqu'à maintenant, donc je ne vais pas vite). Le code de mes bidouilles est disponible sur GiHub.

25Oct/110

Destruction massive

La première étape des travaux dans la maison n'entrait pas vraiment dans la catégorie des "réparations". En effet, la plupart des travaux prévus impliquaient d'arriver au plâtre brut sur les murs et les plafonds, d'enlever les revêtements de sol, etc. Cette tâche nous a occupés de juillet à octobre 2009. Comme ça serait très répétitif de présenter ce genre d'activités dans toutes les pièces la maison, je vais présenter quelques endroits emblématiques.

L'entrée est un bon exemple de ce que nous avions à affronter dans la plupart des pièces du rez-de-chaussée.

La tapisserie, c'est facile de l'enlever, mais il y a quelque chose de bien bien pire : des dalles de polystyrène collées sur tous les plafonds. Non seulement elles sont difficiles à arracher à cause de la positions dans laquelle on se trouve pour le faire, mais encore on laisse généralement des bouts de peau et donc du sang sur le plafond au bout de quelques heures. Qui plus est, c'est impossible d'enlever les plots de colle sans arracher une partie du plâtre du plafond. Au final, nous avons des plafonds qui ressemblent à des champs de petits trous ronds.

Nous avons terminé avec :

  • d'une part, des murs et des plafonds à peu près "corrects", à l'exception des trous qu'il faudra reboucher
  • d'autre part, plein de déchets qu'il nous fallait évacuer à la déchéterie régulièrement. En fait, on y allait si souvent qu'on était quasiment à tu et à toi avec les employés !

Un autre endroit intéressant était le coin salle à manger / salon. Si vous vous rappelez les photos des origines, ces pièces avaient non seulement les merveilleuses dalles de polystyrène au plafond, mais aussi du lambris sur les murs. Manu s'est bien amusé à les arracher ainsi que... les plots de colle... les travaux en cours donnent une bonne idée de l'étendue des dégâts.

Au final, ça nous a permis d'atteindre ce genre d'état :

Pour finir, la situation au premier étage... Nous avions :

  • Les éternelles dalles de polystyrène au plafond, bien sûr, qu'il était impossible de décoller sans emporter au passage une partie du papier des plaques de plâtre,
  • Des moquettes au sol. Elles étaient plutôt faciles à enlever, même si une partie était cachée sous un parquet flottant..
  • Des moquette murales. C'était vraiment l'horreur parque qu'une espèce de couche de papier restait collée aux plaques de plâtre, avec toute la difficulté qu'on peut imaginer pour l'enlever...

Par exemple, nous sommes passés par ce genre d'état dans le couloir du premier étage :

...ou dans une des chambres :

Et après bien des efforts, nous avons atteint ce stade à peu près final :

  • Dans le couloir :

  • Dans la chambre :

Pour être honnête, c'était une activité franchement déprimante : en effet, nous étions en train de détruire ce qui était en état plus ou moins décent ou du moins habitable, pour atteindre le squelette de la maison. Mais la situation allait bientôt s'améliorer, ce que je raconterai dans un prochain post.

20Oct/110

Incompétence criminelle

J'ai du boulot à faire, des posts plus importants à écrire, mais pour l'instant, cela devra attendre. J'ai besoin de me passer les nerfs, en ce moment.

Pour l'instant, je me cogne une mission d'administration système au cours de laquelle je dois inspecter et (éventuellement, lol) réparer quelques serveurs tournant dans des VMs.

D'abord, la documentation. Attendez, je ne peux pas commencer par ça, il n'y a rien. Une liste d'adresses IP, quelques mots de passe tellement faibles qu'ils font peur. Une liste de commandes shell, hors de tout contexte. Une liste de tâches effectuées, ou du moins je pense qu'il s'agit de cela (la liste contenant des entrées telle que "Accéder à phpmyadmin" suivie par "Changement de niveau d'init"). Circulez, y a rien à voir.

La liste des machines virtuelles inclut une passerelle SSH, depuis laquelle je suis supposé me connecter aux autres VM. Bah, ça me semblait une bonne chose, pour pouvoir accéder à tout ce dont j'avais besoin. Bien entendu, comme la "documentation" ne liste pas vraiment les adresses associées aux machines, c'est peu pratique. Surtout que l'ICMP est totalement bloqué (depuis où? mystère), ce qui n'aide pas. Et une bonne partie des VMs n'écoutent pas sur le port 22. Le port a-t-il été modifié? Est-il bloqué par des règles iptables? Pas la moindre foutue idée. En plus, il était possible de se connecter directement en root sur la passerelle, avec un mot de passe tout pourri (pas "test" mais presque).

Pour l'instant, je n'ai pu trouver que 3 des 11 VMs que je dois inspecter (et cela inclut la passerelle sus-mentionnée). Chaque hôte comprend une installation complète de Gnome, et un assortiment plus ou moins aléatoire de trucs inutiles (laptop-detect? Heu, mon gars, c'est une VM!). Bien sûr, comme la ... personne ... qui a fait ça a décidé d'utiliser Ubuntu Server, il n'est même pas possible de virer dbus, parce qu'upstart en dépend; malgré tout, j'ai réussi à enlever quelques gigaoctets de merdier sur les serveurs auxquels j'ai accédé.

Je m'attends, alors que je continue à y travailler, à encore plus de mauvaises surprises. En attendant, mon opinion, c'est que la personne qui a commis ces actes indescriptibles devrait sérieusement réfléchir à ne plus faire d'administration système et à se reconvertir dans, oh, je sais pas, le balayage de sols. Ou quelque chose comme ça.