Mise à jour automatisée de l'annuaire d'un téléphone Gigaset C530 IP
Cette page explique comment mettre à jour l'annuaire d'un téléphone IP Gigaset C530 si l'on utilise un système d'agendas/annuaires synchronisé (protocoles cardav/caldav).
On part du principe qu'on dispose d'une sauvegarde automatisée de nos annuaires au format vcf. Dans le cas présenté, c'est un export de la base de donnée du serveur Davical comme présenté ici.
Installer les dépendances
Ce script utilise un émulateur de navigateur Web qui permet de passer les
requête d'un navigateur sans avoir d'interface graphique. C'est une sorte de
“simulateur” de navigateur web et ça se nomme xvfb
.
Ensuite, on utilise un module python qui permet d'automatiser des requêtes de
navigateur, de faire des recherche dans le code d'une page html pour trouver le
bon champ, pour le remplir, pour valider, etc… Ça se nomme selenium
Du coup, sous Debian et dérivés, il faut faire :
sudo apt-get install python python-selenium firefoxdriver xvfb
Pour selenium, il se peut que les chemins ne soient pas bons et il faudra
surement installer grace à l'outil pip
qui permet d'installer des modules
pythons.
sudo apt-get install python-pip pip install python-selenium
Générer un annuaire avec la "bonne" syntaxe
Ces modèles de téléphones n'acceptent qu'un syntaxe bien stricte et surtout, il y a des caractères comme des sauts de lignes assez exotiques. Il faut donc coder ce fichier d'une manière à ce qu'il ressemble strictement au fichier d'export d'annuaire qu'on ferait à partir du téléphone.
C'est la fonction repertoire
du script situé sur
cette page qui permet de faire cela. Le
voici de manière indépendante :
## répertoire de sauvegarde des contacts dans le /home : SAUV=$HOME/sauvegardes-davical ## fichier d'annuaire d'importation pour le téléphone IP : GIGASET="${SAUV}/repertoire-gigaset.vcf" rm $GIGASET echo "--> Création du répertoire pour le téléphone Gigaset" for input in $(ls ${SAUV}/*.csv); do IFS=, tail -n +2 "$input" | while read nom cell home ; do echo -ne "BEGIN:VCARD\x0d\x0aVERSION:2.1\x0d\x0aN:${nom};\x0d\x0a"; if [ ! -z ${home} ] ; then echo -ne "TEL;HOME:$(echo ${home} | sed 's/ //g')\x0d\x0a"; fi if [ ! -z ${cell} ] ; then echo -ne "TEL;CELL:$(echo ${cell} | sed 's/ //g')\x0d\x0a"; fi echo -ne "END:VCARD\x0d\x0a" ; done >> $GIGASET ; done
Le script
Il faut renseigner les 3 variables suivantes :
weburl
(sans le http:// au début) est l'adresse de l'interface web du téléphonepinnumber
est le numéro à 4 chiffres pour s'authentifier (mot de passe)vcfile
est le chemin vers le fichier d'annuaire généré précédemment.
#!/usr/bin/python # coding: utf-8 # # Installer : python, python-selenium, chromedriver, xvfb import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # On récupère les variables weburl = "A RENSEIGNER !!!" pinnumber = "A RENSEIGNER !!!" vcfile = "A RENSEIGNER !!!" # On initie un navigateur driver = webdriver.Firefox() # On va à l'adresse de l'interface du Gigaset et on s'authentifie driver.get("http://" + weburl + "/") password = driver.find_element_by_id("password") password.send_keys(pinnumber) driver.find_element_by_class_name("buttonLink100").click() # On va à la page de gestion des répertoires driver.get("http://" + weburl + "/settings_phonebook_transfer.html"); # On supprime l'ancien répertoire driver.find_element_by_link_text("Effacer").click(); try: wait = WebDriverWait(driver, 20) element = wait.until(EC.alert_is_present()) alert = driver.switch_to_alert(); alert.accept(); wait = WebDriverWait(driver, 20) element = wait.until(EC.alert_is_present()) alert = driver.switch_to_alert(); alert.accept(); except: print "no alert" # On renseigne le chemin vers le fichier vcf du nouveau répertoire elem = driver.find_element_by_xpath("//input[@type='file']"); elem.send_keys(vcfile); driver.find_element_by_link_text("Transfert").click(); # On attend que ça mouline puis on valide le message et on se logout try: wait = WebDriverWait(driver, 600) element = wait.until(EC.alert_is_present(), 'Timed out waiting for PA creation ' + 'confirmation popup to appear.') alert = driver.switch_to_alert(); alert.accept(); driver.get("http://" + weburl + "/logout.html"); except: print "no alert"