Catégorie : xivo

#Xivo et #smtp authentifié (Gmail)

Le smtp « smtp.gmail.com » requiert une authentification (login/mdp) avec le mode tls activé. En cherchant un peu partout sur internet, j’ai écrit cette petite note pour moi. Les sources sont divers et variées mais je n’ai pas gardé les sources. N’hésitez pas à me contacter si vous êtes à l’origine de certaines parties.

(MAJ source : http://projects.xivo.io/boards/1/topics/2882?r=2892#message-2892)

Installation des paquets nécessaires

apt-get install libsasl2-2 ca-certificates libsasl2-modules

Configuration de postfix

Il est nécessaire d’utiliser un template afin que la configuration ne soit pas perdue à chaque régénération du fichier.

Copie du fichier source

mkdir -p /etc/xivo/custom-templates/mail/etc/postfix
cp /usr/share/xivo-config/templates/mail/etc/postfix/main.cf /etc/xivo/custom-templates/mail/etc/postfix/main.cf

Configuration du template

Editer le fichier /etc/xivo/custom-templates/mail/etc/postfix/main.cf. Mettre ces options à la fin du fichier

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/postfix/cacert.pem
smtp_use_tls = yes

Mot de passe

Ajouter votre mot de passe dans le fichier /etc/postfix/sasl_passwd

[smtp.gmail.com]:587    user@domain:password

Affecter les droits et recharger la configuration postfix

chmod 400 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd

Gestion du certificat pour le mode tls

cat /etc/ssl/certs/ssl-cert-snakeoil.pem | sudo tee -a /etc/postfix/cacert.pem

Redémarrage de postfix

/etc/init.d/postfix restart

Régénération du fichier main.cf à partir du template

Appuyer sur le bouton « sauvegarder » dans Configuration > Réseau > Messagerie. Puis sur le bouton « Appliquer les modifications système » dans Configuration > Système de  contrôle.

Test

echo « Mail de test N°1 » | mutt -s « Test mail » monEmail

Quelques commandes postfix

Lister les messages en Queue

postqueue -p

Supprimer tous les messages en Queue

postsuper -d ALL

 

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

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]