Auteur : seb

Xivo dans le « cloud » et OpenVPN

Je lance une petite série d’articles sur ce que j’ai fait avec Xivo. Pour rappel, Xivo est l’ipbx basé sur Asterisk développé par la société française Avencall. Je suis partenaire Avencall et certifié Xivo.

Un de mes clients m’avait demandé d’installer Xivo sur un de leur serveur (chez online). L’idée était de garder toutes les fonctionnalités de Xivo tout en hébergeant Xivo à l’extérieur de leur bureau. Pourquoi ne pas choisir tout simplement une appliance ? Le client ne voulait pas avoir d’infrastructure informatique en interne. De plus, esprit startup oblige, ils se voyaient déjà ouvrir des bureaux un peu partout dans le monde.

Sur le principe, héberger un Asterisk ou un Xivo est très simple mais on se retrouve rapidement avec de nombreux problèmes. Au niveau sécurité, les communications ne sont pas chiffrées et peuvent donc être écoutées très facilement. Il existe bien une version chiffrée des flux (le srtp), mais ce n’est pas simple à mettre en place. D’autres problèmes me gênent énormément. On perd le système de provisioning de Xivo, l’annuaire interne, programmation des touches à distance, etc … En gros, les fonctionnalités « sympas » de Xivo sont perdues.

Comment faire ? Pour réussir à ne pas perdre les fonctionnalités, il fallait que l’interface « voix » soit sur un réseau virtuel. Ma solution s’appelle : OpenVPN.

Côté serveur, j’ai donc installé Xivo et OpenVPN. J’ai fermé tous les ports du serveur à l’exception d’un port UDP servant pour OpenVPN.

Côté clients (téléphones), je devais trouver une solution pour me connecter au travers d’OpenVPN. Par chance ce dernier étant opensource, un grand nombre de téléphones SIP inclus un client OpenVPN. J’ai donc fait quelques essais avec des téléphones SNOM et Yealink. Ces deux constructeurs sont partenaires Avencall et leurs produits sont qualifiés pour Xivo. J’ai pu me connecter sur le serveur OpenVPN avec les produits de ces deux constructeurs. J’ai rencontré quelques problèmes avec SNOM. Par exemple, impossible après avoir provisionné mon poste de le réinitialiser à distance ou de modifier la programmation des touches. Pour réussir, je devais réinitialiser le téléphone et refaire un provisioning complet. Avec les téléphones Yealink (T41P et T46G), je n’ai rencontré aucun problème. A l’occasion, il faudra que je teste à nouveau SNOM pour vérifier si les problèmes existent toujours ou pas.

Vous trouverez ci-après un petit schéma de principe. travaux - Xivo - openvpn


Rated 4,3 out of 5 by 17
reviewers.

Rated 4 out of 5 by Très bon rapport qualité/prix
Je suis ravie d’avoir acheté ce produit. Il est très agréable de se réveiller en douceur.
17 octobre 2016
Rated 5 out of 5 by Très bon simulateur d’aube
J’en cherchais un pour remplacer mon vieux NafNaf LYS et je suis tombé sur celui-ci, franchement, il est beaucoup mieux et tiens moins de place, facile à régler même si il nécessite au moins pour la première fois le manuel d’utilisation, à puissance 10 il éclaire parfaitement la chambre, il me réveille quelques minutes avant d’entendre la radio c’est donc qu’il fait bien son job, la radio en FM marche super bien, bien mieux que mon NafNaf, il peut faire office de lampe de chevet, il garde les réglages d’alarme, station radio mais par contre pas l’heure si coupure de courant, dommage, mais c’est le seul point noir de ce simulateur.
27 septembre 2016
Rated 4 out of 5 by BONNE SURPRISE
très satisfaite de ce produit et très surprise, je ne pensais pas être aussi contente le réveil est idéal avec les oiseaux et la lumière qui vous réveil en douceur , réglage facile et tactile
je le recommande
16 juillet 2016
Rated 5 out of 5 by super qualité prix
Cet article correspond totalement à nos espérances. Pour un réveil en douceur au son de la nature.
27 juin 2016
Rated 5 out of 5 by Parfait
Un excellent produit.
Tout est réglable.
Surtout bien adapter les réglages, car la luminosité débute 30 minutes avant le réveil,
un réveil tel que je l’attendais : luminosité douce, chants d’oiseaux
28 janvier 2016


  • 2016-10-31 T07:09:17.789-05:00
  • bvseo_lps, prod_bvrr, vn_prr_5.6
  • cp-1, bvpage1
  • co_hasreviews, tv_17, tr_17
  • loc_en_US, sid_000000000001004725, prod, sort_default


page:

2
3
4
> Suivant

Mur végétal – Green wall d’Aix-en-Provence

Le mur végétal se trouve sur la partie nord du pond Max Juvenal. Il a été réalisé en 2008 par le botaniste Patrick Blanc, célèbre pour ses nombreuses réalisations dans le monde entier.

Vous pouvez utiliser l’appli YouTube et bouger votre smartphone ou votre tablette pour voir l’image se déplacer. On peut regarder à droite, à gauche, en bas, en haut… attention au vertige !

Annuaire inversé pour #Xivo (#asterisk)

Le script php

J’ai créé un script en php. Vous pouvez le placer où vous voulez, il faut qu’il soit joignable depuis Xivo. J’ai appelé ce script 118218.php car il va chercher les informations sur 118218.fr.[sociallocker]

<?php

// 118218.php is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
//
// @package   118218.php
// @copyright 2014 Sébastien TIMONER (EURL STIMSYSTEM) <s.timoner@stimsystem.com>
// @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
//

 $prefix = "0033";
  
  header('HTTP/1.1 200 OK');
  header('Content-Type: text/plain; charset=utf-8');
  
  if (isset($_GET["search"])){
    $search = $_GET["search"];
    search($search);
  }else if (isset($_GET["phonesearch"])){
    $phone = $_GET["phonesearch"];	
    searchphone($phone);
  }

  // recherche inversée
  function searchphone($phone){
    $searchphone = normalizePhoneNumber($phone);
    $url = "http://www.118218.fr/recherche?geo_id=&distance=&category=&phone=".$searchphone."&where=";
    $page = getPage($url);
    writeHeader();
    extractData($page,$phone);
  }
  
  // recherche dans l'annuaire
  function search($search){
    writeHeader();
    $arr = explode(",",$search);
    $nom = urlencode(trim($arr[0]));
    (isset($arr[1]) && (strtolower(trim($arr[1]))!=""))?$ville=trim($arr[1]):$ville="";
    $pro = (isset($arr[2]) && (strtolower(trim($arr[2]))=="pro"));
    if ($pro){
      $url = "http://www.118218.fr/recherche?category=&what=$nom&where=$ville";
    }else{
      $url = "http://www.118218.fr/recherche?category=&who=$nom&where=$ville";
    }
    $page = getPage($url);
    extractData($page);
  }

  function writeLn($name,$phone,$ville){
    $arr = explode("\n",$ville);
    $ville = "";
    foreach ($arr as $line){
      $ville .= trim($line);
    }
    echo "$name|$phone|$ville \n";
  }
  function writeHeader(){
    writeLn("name","phone","ville");
  }

  function getPage($url){
    $cookie = 'cookies.txt';
    $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg,text/html,application/xhtml+xml'; 
    $headers[] = 'Connection: Keep-Alive'; 
    $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'; 
    $useragent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'; 

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);

    curl_setopt($ch, CURLOPT_COOKIEJAR,$cookie);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);

    $output = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    $output = mb_convert_encoding($output, 'HTML-ENTITIES', 'UTF-8');
    return $output;	
  }
    
  function normalizePhoneNumber($phoneNumber) {
    $phoneNumber = preg_replace('/[^0-9]/','',$phoneNumber);
    global $prefix;
    if(strlen($phoneNumber) > 10) {
      $phoneNumber = '0'.substr($phoneNumber, strlen($prefix), strlen($phoneNumber)-strlen($prefix));
    }
    return $phoneNumber;
  }	

  function extractData($page,$forcetel=""){
    libxml_use_internal_errors(true);
    $dom = new DomDocument();
    $dom->encoding = 'UTF-8';		
    $dom->loadHTML($page);
    if (is_object($dom)){
      $lp = $dom->getElementById('resultsColumn');
      if (is_object($lp)){
        $nom = "";
        $adresse = "";
        $tel = "";
        $sections = $lp->getElementsByTagName("section");
        foreach($sections as $section){
          $class = $section->getAttributeNode('class');
          $classValue=trim($class->value);
          $classNeedle = "searchResult";
          $pos = strpos($classValue,$classNeedle);
          if ($pos !== false){
            
            $listeh2 = $section->getElementsByTagName("h2");
            foreach($listeh2 as $h2){
              $nom = trim($h2->textContent);
            }
            $addresss = $section->getElementsByTagName("address");
            foreach($addresss as $address){
              $adresse = trim($address->textContent);
            }
            
            if ($forcetel<>""){
              $tel=$forcetel;
            }else{
              $telephones = $section->getElementsByTagName("p");
              foreach($telephones as $telephone){
                $class = $telephone->getAttributeNode('class');
                if (is_object($class)){
                  if (trim($class->value)=="telephone"){
                    $tel = normalizePhoneNumber($telephone->textContent);
                  }
                }
              }
            }
            if (trim($tel)<>""){
              writeLn($nom,$tel,$adresse);
            }
          }
        }
      }
    }
    return;
  }

?>

Le script est une passerelle entre Xivo et 118218. Il est appelé lors d’un appel entrant. Le numéro de l’appelant est passé en paramètre (« phonesearch »). Le script ouvre la page de recherche chez 118218 et en extrait le résultat.

Configuration Xivo

Ajouter une nouvelle source de répertoire

Configuration > Gestion > Répertoires

Capture d’écran 2015-11-10 à 10.32.11

Nom du répertoire : 118218
Type : Webservices
URI : http://<votre espace web>:<port>/118218.php

Capture d’écran 2015-11-10 à 10.32.21

Mapper les champs

Services > Serveur CTI > Répertoires > Définitions

Capture d’écran 2015-11-10 à 10.30.11

Nom du répertoire : 118218
URI : http://<votre espace web>:<port>/118218.php
Séparateur : |
Comparaison direct sur : search
Comparaison inverse sur : phonesearch

fullname : name
phone : phone
reverse : name
ville : ville

Capture d’écran 2015-11-10 à 10.30.32

Déclarer le répertoire

Il faut ajouter le répertoire dans :

Services > Serveur CTI > Répertoires > Répertoires inverses et Services > Serveur CTI > Répertoires > Répertoires directs

Capture d’écran 2015-11-10 à 10.30.42

Capture d’écran 2015-11-10 à 10.30.55

Conclusion

La recherche sera exécutée si le numéro n’est ni connu dans le répertoire interne ni dans le xivodir. Le script permet également la recherche directe.

[/sociallocker]