Telnumck recherche de numéros de téléphone dans 2 listes

Introduction

Telnumck a été developé dans l'environnement Asterisk avec pour objectif de tester, le plus rapidement possible, si l'argument donné en paramètre, qui, dans ce cas, est un numéro de téléphone, fait partie d'un liste blanche autorisée ou d'une liste noire à exclure, laissant ainsi l'application prendre les décisions nécessaires pour la suite à donner à l'appel entrant.

Les listes de numéros, ne présentant pas de structures complexes de données, sont implémentées par de simples fichiers et ne nécessitent pas en dépendance un gestionnaire de base de données, ce qui ne nuira pas à la rapidité d'exécution.

Implémentation

Le programme telnumck comporte quelques lignes de code écrites en C et permet de rechercher la présence d'un numéro de téléphone dans 2 fichiers un fichier TelWhite et un fichier TelBlack. Par défault, ces fichiers sont localisés dans le répertoire /etc de la machine asterisk, mais un lien symbolique permet, à l'utilisateur, de les placer où il le souhaite.

Mais il est possible, en remplacement, de définir des variables d'environnement pointant sur les noms des fichiers

export TELNUM_BLACK_FILE=$HOME/Data/TelNum/TelBlack
export TELNUM_WHIYE_FILE=$HOME/Data/TelNum/TelWhite

Le programme produit sur la sortie standart une réponse Wok si le numéro est dans le fichier TelWhite, une réponse Bok si le numéro est dans le fichier TelBlack et une réponse ko si numéro n'a pas été trouvé. C'est cette réponse que le dialplan d'Asterisk analyse pour prendre ses décisions.

Format des fichiers

La liste noire TelBlack est essentiellement une liste de numéros. Par contre dans la liste blanche TelWhite, il peut être utile de rajouter quelques renseignements comme le nom et l'adresse du propriétaire. Une troisième liste existe TelIgn numéros connus et à ignorer. Elle est utilisée dans l'extraction des données du fichier log d'Asterisk.

Ces fichiers sont constitués d'un numéro par ligne, une ligne étant terminée par le caractère de fin de ligne \n. Ils sont édiatbles avec un simple éditeur de texte. Pour que le programme fonctionne, il est indispensable que les fichiers soient triés du plus petit au plus grand suivant la description de la fonction C strcmp. Les longueurs des numéros n'ont pas d'importance.

Le format du fichier liste peut être de la forme:

0049123456789
...
0123456789
0123456790
....
0223456789
0223456790
...

ou

0123456789  Nom prenon  adresse ville
0123456790  Nom prenon  adresse ville
....

Evolution du format de la blacklist

Le format methode 1, présenté ci-dessus fonctionne très bien pour de petit nombre d'entrées. C'est le cas pour la liste blanche. Mais la liste noire est moins controlable et elle peut devenir, très rapidement, encombrante surtout si l'on veut gérer des tranches de numéros. Aussi le nouveau format methode 2 se propose de représenter un numéro par un simple bit dans un fichier. Si le bit est 1, le numéro correspondant sera considéré comme faisant partie de la liste.

La différence est remarquable; avec un octet on peut représenter 8 numéros alors que pour ces 8 numéros il aurait fallu 88 octets dans la version précédente. Il vous faudra un espace disque de 125 Mo pour contenir les 999 millions de numéros de téléphone du plan de numérotation français, ce qui est relativement petit. D'autre part la position du bit dans le fichier est contenu dans le numéro, l'accès est donc immédiat et direct, quelque soit le nombre de numéros. L'inconvénient : il faut un outil pour gérer les bits car les fichiers deviennent binaires et ne sont plus accessibles aux éditeurs de texte. c'est l'objet du programme telnum.

Le programme de gestion telnum

Le programme telnum permet de gérer les 3 listes citées précédemment. Afin d'éviter de citer le fichier destinataire, lors d'une opération, le programme telnum est renommé par un lien symbolique à black, white, telign. Le programme utilise par défaut, le nom des listes définies dans /etc. Il s'agit ici des mêmes fichiers que ceux définit pour telnumck.

Mais il est possible, en remplacement, de définir des variables d'environnement pointant sur les noms des fichiers

export TELNUM_BLACK_FILE=$HOME/Data/TelNum/TelBlack
export TELNUM_WHITE_FILE=$HOME/Data/TelNum/TelWhite
export TELNUM_TELIGN_FILE=$HOME/Data/TelNum/TelIgn

Les opérations, possibles sur chaque liste, sont donc:

Le choix de la méthode d'accès est déterminée par le type de fichier. Si le fichier est un répertoire, on utilise la méthode 2, sinon c'est la méthode 1.

Lors de la commande d'insertion ou de suppression, une commande peut être exécutée, si elle est définie, pour, par exemple, copier les fichiers de liste vers la mechine qui s'en sert. La commande par défaut est définie dans tnamin.c et est :

"rsync -av --delete ~/Data/TelNum/ pi:Data/TelNum/"

Pour éviter la copie :

export SYNC_DEFAULT_CMD=""

Pour remplacer cette commande par une qui vous convient mieux, il faut définir une variable d'environnement SYNC_DEFAULT_CMD.

export SYNC_DEFAULT_CMD="rsync -av --delete ~/Data/TelNum/ yourhost:Data/TelNum/"

Quelques exemples d'utilisation

La commande telnumck dans sa plus simple expression et ses réponses:

$ telnumck 0123456789
ko
$ telnumck 0427840206
Bok
$ telnumck 0412345678
Wok

Plutôt que la commande telnum on utilise ses alias suivant la liste que l'on veut modifier. Noter que la commande n'est pas bavarde lorsque cela se passe bien. L'utilisation de telign est identique à celui de white.

$ black 0123456789       # insertion dans blacklist           
$ black -r 0123456789    # suppression de blacklist                 
$ black -c 0123456789    # test présence numéro
ko                 
$ black -l               # liste le contenu
...
...
$ white  0123456789 "quelqu'un que je connais"  # insertion dans whitelist
$ white  -s 0123456789         # recherche par numero
0123456789 quelqu'un que je connais in /home/hq/Data/TelNum/TelWhite
white  -s connais              # recherche par nom
123456789 quelqu'un que je connais in /home/hq/Data/TelNum/TelWhite
$  white  -r 0123456789        # supprime l'élément précédent

On a déjà évoqué les tranches et une tranche est une liste de numéros définie par le numéro de début et le numéro de fin. Elle semble être attribuée par 10000 donc de 0000 à 9999, et on va faire avec et s'en payer une pour l'exemple. Voici une definition:

042784, 0427840000-9999, MACHIN Paris
$ black 0427840000-9999       # insertion dans la liste
$ black -c 0427845555         # teste si le numéro est dans la liste
Bok
$ black -r 0427840000-9999    # supprime la tranchee

Sur un raspberry pi, le temps d'exécution ressemble à ceci:

$ time telnumck 0427845555
Bok

real	0m0.012s
user	0m0.000s
sys	0m0.000s

Pour aller plus vite, si nécessaire, un module complémentaire d'Asterisk et présent en mémoire pourrait faire l'affaire.

Les preblack

Le mot preblack est un racourci pour désigner un préfixe blacklisté. Mais c'est aussi le nom d'une autre base de données et le nom de la commande (liée à telnum) pour la gérer.

Le plan de numérotation français comporte 1 milliard de numéros. Ces numéros sont attribués par l'Arcep sous forme de prefixe 012345, généralement à 6 chiffres mais parfois plus et parfois moins. Le nombre de préfixes attribuables à 6 chiffres est donc de 100 000 et pour les représenter, en associant un préfixe à 1 bit suivant le principe de la base black, un fichier de 12500 octets est suffisant. Or aujourd'hui (jour où je compte), seulement 39377 préfixes sont alloués. Tous les autres sont donc de bon candidats pour commencer à remplir la base preblack auxquels il sera bien utile de rajouter quelques autres, même si je suis persuadé que ces numéros ne sont pas utilisés !. Ca fait, quand même, moins de numéros à gérer !.

Telnumck examine, en premier, la base des preblack. Et telnum nous permet de gérer cette base comme une autre base. Un lien symbolique sur telnum est créé avec le nom preblack. Similairement aux autres bases, on trouvera les noms /etc/PreBlack, TELNUM_PREBLACK_FILE, $HOME/Data/TelNum/PreBlack.

$ preblack 0123456789       # insertion dans preblacklist           
$ preblack -r 0123456789    # suppression de preblacklist                 

Noter que l'argument à preblack peut être un numéro complet, le programme se chargeant de le racoourcir.

Une commande spécifique permet de rentrer la liste des préfixes non utilisés:

$ preblack -csv fichier.csv   # insertion de tous les numéros
                              # excepté ceux qui sont dans fichier.csv

Internationalisation

A partir de la version 2016, les programmes décrits fonctionnent avec des numéros au format international. Le format de sortie va donc être de la forme +3312346789. Le format d'entrée de numéro peut être:

L'exemple est pour la France. Si vous êtes dans un autre pays vous pouvez changer la règle de conversion dans le fichier telnumdef.h.

Ce qui change pour l'utilisateur, c'est qu'il devra extraire les données de son ancienne base de données, si il en a une, et les insérer dans la nouvelle. Voir pour le fichier WARNING dans la paquet. Ceci ne concerne que le passage de la version 2015 à 2016.

Compilation

Après avoir téléchargé le packet telnumck, il nécessaire de le compiler sur la machine asterisk. Après avoir exécuté les instructions suivantes, un binaire est intallé dans /usr/bin

tar Jxvf telnumck-yyyymmdd.tar.xz
cd telnumck-yyyymmdd
make
make install

Références

License

The telnumck, telnum and arcepcv software are licensed under the terms of the GNU General Public License as published by the Free Software Foundation.

Download

Suggestion de sujet de stage

Faire la même chose pour Android...!