# "Hello, it's Lenny" : un remake libre

**Dear english users : don't hesitate to view the [google translated page](https://translate.google.com/translate?hl=fr&sl=fr&tl=en&u=https%3A%2F%2Fdev.burdet.ch%2Fgit%2Fjfburdet%2Fitslenny%2F).**

Ce projet à pour but de reproduire le comportement de https://www.reddit.com/r/itslenny/
dans le cadre de mon réseau local de mon logement. Mon fournisseur est Sunrise en Suisse et ils ont eu
la bonne idée de me fournir une Fritz!Box 7390, qui permet de créer un périphérique VoIP.

Le logiciel intercepte chaque appel, et consulte deux base de donnée sur Internet (ktipp.ch et ch.shouldianswer.net) afin de déterminer si l'appel provient d'un télémarketeur.
Si c'est le cas, il répond avant que le téléphone fixe ne sonne, et déclenche la séquence de réponse qui a pour but 
de le tenir en ligne le plus longtemps possible.

Pour écouter ceux que j'ai attrapé sur ma ligne personnelle, [c'est ici](../../raw/master/busted/index.html?render=1) 


# Installation

Le logiciel a été testé sous Linux, mais devrait fonctionner sous mac et probablement Windows.

Il a été conçu pour tourner comme un service/daemon.

Il faut installer via le packager de votre système d'exploitation
les logiciels suivants :

* Python 2.7
* Lame Mp3 encoder
* Linphone

L'installation décrite ci-dessous est basée sur Arch Linux, avec une installation serveur:

```
sudo pacman -S python2 lame linphone libxslt
sudo useradd -m  -s /bin/bash callblocker
sudo su - callblocker
git clone https://dev.burdet.ch/git/jfburdet/itslenny.git
cd itslenny
virtualenv -p python2 venv2
./venv2/bin/pip install -r requirements.txt -U
exit
```

Il faut créer le unit file en conséquence :

vi /etc/systemd/system/callblocker.service
 
```
[Unit]
Description=ItsLenny open sequel

[Service]
User=callblocker
Group=callblocker
Type=simple
ExecStart= /home/callblocker/itslenny/venv2/bin/python2 /home/callblocker/itslenny/lenny.py
Restart=always
RestartSec=5
TimeoutSec=10

[Install]
WantedBy=multi-user.target
```

On configure maintenant itslenny, on lui spécifiant le compte SIP/VOIP auquel il doit se connecter :

```
sudo su - callblocker
vi itslenny/config.yml
```

```
- connection:
  domain: "192.168.1.1"
  username: "621"
  password: "toto"
```

On rend le service démarable automatiquement : 
```
sudo systemctl enable callblocker
sudo systemctl start callblocker
sudo journalctl -f --since="5 minutes ago" -u callblocker
```

# Configuration de la Fritz!Box
* Se logguer en admin
* Aller dans Téléphonie -> Périphérique tél. -> Configurer un nouveaur périphérique
* Choisir 'Téléphone avec ou sans répondeur' -> Suivant
* Choisir ' ... (téléphone IP)' -> Suivant
* Spécifier le mot de passe de votre choix (il faudra le reporter dans config.ini mentionné ci-dessus)
* puis terminer l'assistant (->Suivant plusieurs fois)

# Tester avec un appel concret

* Démarrer le service : sudo systemctl start callblocker
* Vérifier que le journal indique success : sudo journalctl --since="1 minute ago" -u callblocker

Cela doit marquer un message du type : 
```
Jun 21 15:16:39 orion systemd[1]: Started ItsLenny open sequel.
Jun 21 15:16:39 orion callblocker.py[12340]: starting 621@192.168.1.1
Jun 21 15:16:39 orion callblocker.py[12340]: Registration status: Registration in progress
Jun 21 15:16:39 orion callblocker.py[12340]: Registration status: Registration successful
```

On cas de problème de connection, la dernière ligne montrera "io error" ou "unautorized".

Ajouter son propre numéro dans le fichier blacklist.txt puis appeler le numéro VoIP, le log doit ressembler ceci ci-dessous et Lenny doit se mettre à parler :

```
Jun 21 15:20:43 orion callblocker.py[12671]: starting 621@192.168.1.1      
Jun 21 15:20:43 orion callblocker.py[12671]: Registration status: Registration in progress                                                            
Jun 21 15:20:43 orion callblocker.py[12671]: Registration status: Registration successful                                                             
Jun 21 15:20:53 orion callblocker.py[12671]: state changed : Incoming call
Jun 21 15:20:53 orion callblocker.py[12671]: Incoming call : __votre numéro !__
Jun 21 15:20:53 orion callblocker.py[12671]: telemarketer calling : __votre numéro !__

```

Au terme de l'appel, le mp3 résultant sera stocké dans le répertoire "out", pex /home/callblocker/itslenny/out

Have fun !



