lundi 26 septembre 2011

Software CPU Upgrade

Q: What to do when an annoying customer insists that he wants a CPU from a different brand on his Linux dedicated server ?
A: This: http://bitbucket.org/maugier/cpufake

Dégoûter les démarcheurs téléphoniques avec Asterisk

Les démarcheurs téléphoniques, c'est chiant. Débarassons-nous en avec Aterisk. Au menu: un menu vocal horripilant, et un raccrochage dans la face au bout de quelques minutes.

D'abord, le matériel: un petit serveur de récup', déja allumé en permanence pour les diverses tâches de la maison. J'y ajoute une interface téléphonique analogique, une A400P de chez OpenVox, avec un module FXO (pour y brancher la ligne téléphonique) et un module FXS (pour y brancher mon ancien téléphone). J'intercale donc mon PBX entre mon téléphone et ma ligne.

Le serveur est sous Gentoo, j'y installe Asterisk 1.8 ainsi que le driver DAHDI. J'ajoute le module wctdm dans /etc/modules.autoload.d/kernel-2.6.

Il faut ensuite générer la config du driver avec dahdi_genconf, vérifier que les modules FXO et FXS sont bien détectés. Voici le contenu auto-généré de /etc/asterisk/dahdi.channels.conf:

;;; line="1 WCTDM/4/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
context=sunrise
channel => 1

;;; line="2 WCTDM/4/1 FXOKS"
signalling=fxo_ks
callerid="Maison" <1>
context=maison
channel => 2

Notez que la terminologie est inversée pour le signaling: le module FXO, qui se comporte comme un téléphone, utilise le signaling FXS (car il cause avec la ligne FXS de mon fournisseur) alors que le module FXS, qui cause à mon téléphone, utilise le signaling FXO pour parler a mon téléphone FXO)

A ce stade on peut lancer Asterisk avec le script système, et attacher la console avec

glokrik # asterisk -r
...
=========================================================================
Connected to Asterisk 1.8.5.0 currently running on glokrik (pid = 31554)
glokrik*CLI>

On teste en passant un appel bidon, d'abord vers le téléphone (la ligne 2)

glokrik*CLI> originate DAHDI/2 application sayphonetic ABCDEF

Le téléphone sonne, parle quand on décroche, puis raccroche, youpie.

On teste un appel sur la ligne sortante:

glokrik*CLI> originate DAHDI/1/076xxxxxxx application sayphonetic ABCDEF

Cette fois-ci j'ai un petit bug, Asterisk ne détecte pas correctement le décrochage de la ligne et envoie le message immédiatement. A investiguer, mais sans conséquence pour ce que nous voulons faire.

Premièrement, rendons le PBX transparent en lui permettant de passer des appels entrants et sortants vers et depuis le combiné de la ligne 2. J'ajoute dans /etc/asterisk/extensions.conf

[maison]
exten => _X.,1,Dial(DAHDI/1/${EXTEN})
exten => _X.,2,Hangup()

[sunrise]
exten => s,1,Dial(DAHDI/2&SIP/monpc)
exten => s,2,Hangup()

Au passage, je fais un tour dans sip.conf et y ajoute un compte pour mon PC, que je nomme monpc, dans le contexte maison; mon PC peut maintenant passer des appels sortants. Notez la définition dans le contexte sunrise qui fait également sonner mon pc quand un appel entrant arrive (le premier qui décroche prend l'appel.)

Maintenant, la partie rigolote: enregistrons un menu vocal idiot. J'utilise Asterisk pour me lancer des appels sur le pc et m'enregistrer:

glokrik*CLI> originate SIP/monpc application record torture-main.gsm

Je décroche, et récite trèèèèès lentement, en me pincant le nez, et de manière générale avec une voix stupide: "Bonjour, vous êtes bien chez XXXXXX, meeeerci de choisir une des options suivantes: si vous appelez dans le contexte de blablabla, appuuuuuyez sur 1,..."

Asterisk enregistre ceci dans le fichier torture-main.gsm. Je procède de la même manière pour enregistrer chaque message, avec torture-submenu1.gsm, torture-submenu2.gsm, ..

J'ajoute maintenant dans extensions.conf le contexte [torture] dans lequel je perds les indésirables:


[torture]
exten => s,1,Background(torture-main)
exten => s,2,Goto(torture,s,1)
exten => 1,1,Goto(torture-submenu1)
exten => 2,1,Goto(torture-submenu2)

[torture-submenu1]
exten => s,1,Background(torture-submenu1)
exten => s,2,Goto(torture,s,1)
exten => 1,1,Goto(torture-sub-sub1)
exten => 2,1,Goto(torture-sub-sub2)

etc etc...

Note le Goto(torture,s,1) à la fin de chaque s de chaque contexte; si l'utilisateur attend la fin du message, il retourne a la racine du menu. Oui, il faut être rapide !

A la fin de la farce, en divers endroits, un Hangup() se débarasse purement et simplement de l'individu.

Notre contexte torture défini, reste à y envoyer les télémarketeurs. Commençons par une blacklist statique. On modifie le contexte de la ligne entrante:

 
[sunrise]
exten => s/_00494542801.,1,Goto(torture,s,1)
exten => s,1,Dial(DAHDI/2&SIP/monpc)
exten => s,2,Hangup()

Ce qui a pour effet d'envoyer tous les numéros commençant par le préfixe mentionné (qui appartient, je crois, à un institut de sondage) vers le menu insupportable.

Ajoutons maintenant une redirection dynamique, pour ceci je vais utiliser une featuremap.
Je modifie encore le contexte entrant:

[sunrise]
exten => s,1,Set(DYNAMIC_FEATURES=torture)
exten => s/_00494542801.,2,Goto(torture,s,1)
exten => s,2,Dial(DAHDI/2&SIP/monpc)
exten => s,3,Hangup()

Et j'ajoute dans /etc/asterisk/features.conf, dans la section [applicationmap], la ligne suivante:

torture => *,self/callee,ChannelRedirect(DAHDI/1-1,torture,s,1)

Qui a pour effet de rediriger l'appel de la ligne extérieure, la ligne 1, vers le contexte cible. "callee" indique que seul le destinataire (donc mon téléphone local) peut utiliser la fonction.

Et voila, il me suffit donc d'appuyer sur * pendant un appel, pour me débarasser du télémarketeur intempestif.