<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.slemoal.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Slemoal</id>
	<title>SLM - MediaWiki - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.slemoal.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Slemoal"/>
	<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php/Sp%C3%A9cial:Contributions/Slemoal"/>
	<updated>2026-04-17T22:07:18Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1318</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1318"/>
		<updated>2025-10-30T14:21:47Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiquée par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents tests j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
cloner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal-oci/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du répertoire html en racine de votre répertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du répertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des répertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl.png]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste Yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
/!\ Modifier le nom du client obligera à modifier l'ID sur les bornes SNOM lié au client&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.png]]&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
Toute les 5minutes, un script télécharge l’annuaire officiel de serveur wazo&lt;br /&gt;
&lt;br /&gt;
Dans notre exemple : &lt;br /&gt;
 http://wazo01.XXXXX.XXX:9498/0.1/directories/lookup/default/snom?xivo_user_uuid=e5d6a27c-fa64-4a7b-9939-XXXXXXXXXXcdf&amp;amp;term&lt;br /&gt;
&lt;br /&gt;
Une fois téléchargé, un second script adapte les balises xml afin de correspondre à l’annuaire des bornes snom, supprime les accents, caractères spéciaux, et le met à disposition sous un lien lié à l’ID:  &lt;br /&gt;
 https://phonebook.slemoal.fr/phonebook/ZjY2NzkwMXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précédemment dans le champ &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de répertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionnée, vous devrez vous connecter sur la borne maitre et Coller l'id généré précédemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Fichier:Outbound-1.png&amp;diff=1317</id>
		<title>Fichier:Outbound-1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Fichier:Outbound-1.png&amp;diff=1317"/>
		<updated>2024-10-31T07:31:35Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : Slemoal a téléversé une nouvelle version de Fichier:Outbound-1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1 - Urgence&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=VitalPBX&amp;diff=1316</id>
		<title>VitalPBX</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=VitalPBX&amp;diff=1316"/>
		<updated>2024-10-31T07:21:37Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Route Sortante */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[VOIP|Retour]]&lt;br /&gt;
==Release Note==&lt;br /&gt;
=== Version EMMC ===&lt;br /&gt;
[[vitalpbx_releasenote_V1.1|V1.1 - 28/03/2021]]&lt;br /&gt;
&lt;br /&gt;
[[vitalpbx_releasenote_V1.2|V1.2 - 18/04/2021]]&lt;br /&gt;
&lt;br /&gt;
[[vitalpbx_releasenote_V1.3|V1.3 - 22/05/2021]]&lt;br /&gt;
&lt;br /&gt;
=== Version MSata ===&lt;br /&gt;
[[vitalpbx_releasenote_V2.1|V2.1 - 11/09/2021]]&lt;br /&gt;
&lt;br /&gt;
[[vitalpbx_releasenote_V2.2|V2.2 - 15/11-2021]]&lt;br /&gt;
&lt;br /&gt;
[[vitalpbx_releasenote_V2.3|V2.3 - 25/03-2022]]&lt;br /&gt;
&lt;br /&gt;
=== [[vitalpbx_releasenote_Roadmap|Roadmap]] ===&lt;br /&gt;
&lt;br /&gt;
==Trunk SIP==&lt;br /&gt;
===SEWAN===&lt;br /&gt;
====Information communiqué par l'opérateur SIP====&lt;br /&gt;
Il faut demander à celui ci de définir le plan de numérotation en national (non international)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Login: trunkyyyyy@test.sewan.eu &lt;br /&gt;
Mot de passe: PASSzzzzz&lt;br /&gt;
Information du serveur : 37.97.65.78 - trunkfsc11.sewan.fr&lt;br /&gt;
Port d'authentification : 5070 [          ]&lt;br /&gt;
Durée du bail REGISTER : 600 secondes&lt;br /&gt;
STUN Server (optionnel) : stun.sewan.fr&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;SDA : &lt;br /&gt;
0351123456&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Configuration du trunk====&lt;br /&gt;
Se rendre sur l'interface VitalPBX&lt;br /&gt;
&lt;br /&gt;
PBX &amp;gt;&amp;gt; External &amp;gt;&amp;gt; Trunks&lt;br /&gt;
&lt;br /&gt;
Configurer comme l'image ci dessous&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Trunk Sewan Config-general.png]]&lt;br /&gt;
&lt;br /&gt;
Le registrar doit avoir ce format&lt;br /&gt;
 Login:Password@serveur:portSIP&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
 trunkyyyyy@test.sewan.eu:PASSzzzzz@37.97.65.78:5070&lt;br /&gt;
&lt;br /&gt;
Pour information, les fichiers de configurations auto-généré:&lt;br /&gt;
&lt;br /&gt;
/etc/asterisk/vitalpbx/sip__50-1-trunks.conf&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[trunk](p11)&lt;br /&gt;
context=trk-1-in&lt;br /&gt;
description=Trunk_sip_Sewan&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
allow=!all,alaw&lt;br /&gt;
host=37.97.65.78&lt;br /&gt;
port=5070&lt;br /&gt;
secret=PASSzzzzz&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
defaultuser=trunkyyyyy&lt;br /&gt;
remotesecret=PASSzzzzz&lt;br /&gt;
fromdomain=test.sewan.eu&lt;br /&gt;
qualify=yes&lt;br /&gt;
type=peer&lt;br /&gt;
context=trk-1-in-custom&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/asterisk/vitalpbx/sip__20-1-registers.conf&lt;br /&gt;
 [general](+)&lt;br /&gt;
 register =&amp;gt; trunkyyyyy@test.sewan.eu:PASSzzzzz@37.97.65.78:5070&lt;br /&gt;
&lt;br /&gt;
====Appel Entrant====&lt;br /&gt;
SEWAN a la particularité d'envoyer le DID (SDA) dans le champs TO de la requête SIP.&lt;br /&gt;
&lt;br /&gt;
Bien qu'il existe une option pour le recuperer depuis la GUI il s'avere qu'a ce jour ça ne peux fonctionner dans notre cas.&lt;br /&gt;
&lt;br /&gt;
Voir sujet sur le forum:&lt;br /&gt;
https://community.vitalpbx.org/forums/topic/incoming-call-problem-2/&lt;br /&gt;
&lt;br /&gt;
La solution de contournement est la suivante&lt;br /&gt;
&lt;br /&gt;
créer un fichier custom&lt;br /&gt;
 nano /etc/asterisk/vitalpbx/extensions__50-1-dialplan_custom.conf&lt;br /&gt;
&lt;br /&gt;
Ajouter le dialplan ci-dessous&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;; *********************************************************************************&lt;br /&gt;
; @Date : Sun Apr 18 12:54:49 GMT 2021&lt;br /&gt;
; @Document : extensions__50-1-dialplan_custom.conf&lt;br /&gt;
; @Author : Sébastien LE MOAL &amp;lt;slemoal@tiscom.fr&amp;gt;&lt;br /&gt;
; @Platform : VitalPBX 3.0.6-2&lt;br /&gt;
; *********************************************************************************&lt;br /&gt;
&lt;br /&gt;
[trk-1-in-custom]&lt;br /&gt;
exten =&amp;gt; _s,1,NoOp(Incoming call through: Trunk_sip_Sewan)&lt;br /&gt;
 same =&amp;gt; n,Set(DID=${CUT(CUT(SIP_HEADER(To),@,1),:,2)})&lt;br /&gt;
 same =&amp;gt; n,Goto(trk-1-in,${DID},1)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mettre les droits d’exécution&lt;br /&gt;
 chmod +x /etc/asterisk/vitalpbx/extensions__50-1-dialplan_custom.conf&lt;br /&gt;
&lt;br /&gt;
Dans l’onglet avancé du trunk, ajouter le nouveau context dans Custom Settings&lt;br /&gt;
[[Fichier:Trunk Sewan Config-advanced.png]]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;type = peers&lt;br /&gt;
parameter = context &lt;br /&gt;
value = trk-1-in-custom&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette procédure doit être valable pour tout les opérateurs SIP qui indique le DID dans le champs TO (comme OVH)&lt;br /&gt;
&lt;br /&gt;
==Route entrante==&lt;br /&gt;
===SDA===&lt;br /&gt;
Si joint la configuration d'une SDA sur 10 chiffres (format envoyé par SEWAN)&lt;br /&gt;
&lt;br /&gt;
Format standard:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Etsi: 9 chiffres&lt;br /&gt;
VN6: 6 chiffres&lt;br /&gt;
VN4: 4 chiffres&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:DID-config.png]]&lt;br /&gt;
&lt;br /&gt;
===Route par défaut===&lt;br /&gt;
Il est possible de créer une règle par défaut, afin de ne pas perdre d'appel si la SDA n'est pas renseigné.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:DID-config-Default.png]]&lt;br /&gt;
&lt;br /&gt;
==Route Sortante==&lt;br /&gt;
PBX &amp;gt;&amp;gt; External &amp;gt;&amp;gt; Outbound Routes&lt;br /&gt;
&lt;br /&gt;
Afin de conserver de la souplesse au niveau des routes sortante, nous allons créer 5 routes:&lt;br /&gt;
# Urgence&lt;br /&gt;
# National&lt;br /&gt;
# GSM&lt;br /&gt;
# Spéciaux&lt;br /&gt;
# International&lt;br /&gt;
&lt;br /&gt;
===1 - Urgence=== &lt;br /&gt;
[[Fichier:Outbound-1.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;1[578]&lt;br /&gt;
11[0-59]&lt;br /&gt;
116XXX&lt;br /&gt;
19[167]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===2 - National===&lt;br /&gt;
[[Fichier:Outbound-2.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 0[1-59]XXXXXXXX&lt;br /&gt;
&lt;br /&gt;
===3 - GSM===&lt;br /&gt;
[[Fichier:Outbound-3.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 0[67]XXXXXXXX&lt;br /&gt;
&lt;br /&gt;
===4 - Spéciaux===&lt;br /&gt;
[[Fichier:Outbound-4.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;08XXXXXXXX&lt;br /&gt;
118XXX&lt;br /&gt;
[13]XXX&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
===5 -International===&lt;br /&gt;
[[Fichier:Outbound-5.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 _00X.&lt;br /&gt;
ou pour limiter à l'union européenne&lt;br /&gt;
 _00[34].&lt;br /&gt;
&lt;br /&gt;
==Restriction d'appel==&lt;br /&gt;
===Règle de restriction d'appel===&lt;br /&gt;
PBX &amp;gt;&amp;gt; Class of Service &amp;gt;&amp;gt; Dialing Restriction rules&lt;br /&gt;
&lt;br /&gt;
Nous allons créer 4 règles de discrimination:&lt;br /&gt;
# Urgence&lt;br /&gt;
# National&lt;br /&gt;
# GSM&lt;br /&gt;
# Spéciaux&lt;br /&gt;
&lt;br /&gt;
L'international est joignable lorsque qu'aucune restriction n'est appliqué, il n'y a donc pas besoin de la créer.&lt;br /&gt;
&lt;br /&gt;
====1 - Urgence==== &lt;br /&gt;
[[Fichier:COS-dialing-restriction-1.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;118XXX&lt;br /&gt;
0XXXXXXXXX&lt;br /&gt;
_00X.&lt;br /&gt;
[13]XXX&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====2 - National====&lt;br /&gt;
[[Fichier:COS-dialing-restriction-2.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;118XXX&lt;br /&gt;
0[678]XXXXXXXX&lt;br /&gt;
_00X.&lt;br /&gt;
[13]XXX&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====3 - GSM====&lt;br /&gt;
[[Fichier:COS-dialing-restriction-3.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 0[67]XXXXXXXX&lt;br /&gt;
&lt;br /&gt;
====4 - Spéciaux====&lt;br /&gt;
[[Fichier:COS-dialing-restriction-4.png]]&lt;br /&gt;
&lt;br /&gt;
Pattern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;08XXXXXXXX&lt;br /&gt;
118XXX&lt;br /&gt;
[13]XXX&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Classe de Service===&lt;br /&gt;
PBX &amp;gt;&amp;gt; Class of Service &amp;gt;&amp;gt; Class of Service&lt;br /&gt;
&lt;br /&gt;
Nous allons affecter les Regle de restriction d'appel à des Classe de Service&lt;br /&gt;
&lt;br /&gt;
====1 - Urgence==== &lt;br /&gt;
[[Fichier:COS-1.png]]&lt;br /&gt;
&lt;br /&gt;
====2 - National====&lt;br /&gt;
[[Fichier:COS-2.png]]&lt;br /&gt;
&lt;br /&gt;
====3 - GSM====&lt;br /&gt;
[[Fichier:COS-3.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====4 - Spéciaux====&lt;br /&gt;
[[Fichier:COS-4.png]]&lt;br /&gt;
&lt;br /&gt;
====5- International====&lt;br /&gt;
Cette règle existe et s'appelle ALL, nous allons simplement modifier sa description  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:COS-5.png]]&lt;br /&gt;
&lt;br /&gt;
===Affecter une restriction à un utilisateur===&lt;br /&gt;
PBX &amp;gt;&amp;gt; Extensions &amp;gt;&amp;gt; Extensions&lt;br /&gt;
&lt;br /&gt;
Sélectionner l'extension sur la quelle vous souhaitez affecter une discrimination&lt;br /&gt;
&lt;br /&gt;
Et choisissez dans le menu déroulant la classe à lui affecter.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:COS-Exten.png]]&lt;br /&gt;
&lt;br /&gt;
==DynHost==&lt;br /&gt;
Afin d'assurer une télémaintenance ou service externe dans le cas ou le client dispose d'une IP public dynamique, il est possible d'utiliser le service Dynhost d'OVH dans le cadre de l'abonnement au domaine tiscom.fr&lt;br /&gt;
&lt;br /&gt;
===Configuration OVH===&lt;br /&gt;
Se rendre sur la page d'administration:&lt;br /&gt;
https://www.ovh.com/manager/&lt;br /&gt;
&lt;br /&gt;
====Ajouter un DynHost====&lt;br /&gt;
Avant de pouvoir utiliser le DynHost, vous devez le déclarer dans l’interface client OVH. Pour cela sélection le domaine dans lequel vous souhaitez déclarer votre DynHost.&lt;br /&gt;
&lt;br /&gt;
Cliquez ensuite sur l’onglet DynHost. Cet onglet vous affiche les DynHost déjà déclaré ainsi que les adresses IP courantes. Pour créer votre DynHost cliquez sur Ajouter un DynHost (à droite).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ovh-add-dynhost1.png]]&lt;br /&gt;
&lt;br /&gt;
La fenêtre suivante s’affiche, choisissez le sous-domaine voulu et entré l’IP 0.0.0.0. Cette adresse sera mise a jour par le script une fois celui-ci configuré.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ovh-add-dynhost2.png]]&lt;br /&gt;
&lt;br /&gt;
====Créer un identifiant DynHost====&lt;br /&gt;
Vous devrez maintenant créer un utilisateur ayant le droit de mettre à jour votre Dynhost précédemment créé. Pour cela cliquer sur Gérer les accès de la page précédente&lt;br /&gt;
[[Fichier:ovh-add-acces1.png]]&lt;br /&gt;
&lt;br /&gt;
cliquer sur Créer un identifiant, la popup suivante s’ouvre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ovh-add-acces2.png]]&lt;br /&gt;
&lt;br /&gt;
Spécifiez un suffixe d’identifiant, le nom de domaine que vous avez spécifié tout à l’heure ou * pour autoriser tout les sous domaine dynhost et le mot de passe. &lt;br /&gt;
&lt;br /&gt;
Enregistrez bien ces informations car elles devront etre renseignés dans le script.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ovh-add-acces3.png]]&lt;br /&gt;
&lt;br /&gt;
===Configuration IPBX===&lt;br /&gt;
====Script DynHost====&lt;br /&gt;
Se connecter en ssh ou console sur le serveur.&lt;br /&gt;
&lt;br /&gt;
Installer le package &amp;quot;dnsutils&amp;quot; :&lt;br /&gt;
 yum install dnsutils&lt;br /&gt;
&lt;br /&gt;
Créer le script&lt;br /&gt;
 nano /var/lib/vitalpbx/scripts/dynhost.sh&lt;br /&gt;
&lt;br /&gt;
Ajouter les lignes suivante:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/env sh&lt;br /&gt;
#########################################################&lt;br /&gt;
# Création :      Sebastien Lemoal &amp;lt;slemoal@tiscom.fr&amp;gt; #&lt;br /&gt;
# Modifications :                                     #&lt;br /&gt;
######################################################&lt;br /&gt;
&lt;br /&gt;
# Tous droits réservés&lt;br /&gt;
&lt;br /&gt;
######################&lt;br /&gt;
#      CHANGELOG     #&lt;br /&gt;
#########################################################&lt;br /&gt;
# 2021/07 - Script initial - slemoal                   #&lt;br /&gt;
#######################################################&lt;br /&gt;
&lt;br /&gt;
#######################################&lt;br /&gt;
# Définition des Variables           #&lt;br /&gt;
#####################################&lt;br /&gt;
HOST=$(uname -n) # Se change depuis l'interface web &amp;quot;Admin -&amp;gt; Network -&amp;gt; Nom d'hote&amp;quot;&lt;br /&gt;
LOGIN=domaine-id&lt;br /&gt;
PASSWORD=LenSuperMotDePasseAutogénéréDuCompteOvh&lt;br /&gt;
&lt;br /&gt;
PATH_LOG=/var/log/dynhostovh.log&lt;br /&gt;
&lt;br /&gt;
HOST_IP=$(dig +short $HOST A) # Récupérer l'IP du domaine OVH&lt;br /&gt;
&lt;br /&gt;
# Récupérer l'IP PUBLIC&lt;br /&gt;
CURRENT_IP=$(curl ifconfig.me)&lt;br /&gt;
echo curl &amp;quot;ifconfig.me=&amp;quot;$CURRENT_IP&lt;br /&gt;
if [ -z $CURRENT_IP ]&lt;br /&gt;
then&lt;br /&gt;
  CURRENT_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)&lt;br /&gt;
  echo curl &amp;quot;dig + short myip.opendns.com=&amp;quot;$CURRENT_IP&lt;br /&gt;
fi&lt;br /&gt;
CURRENT_DATETIME=$(date -R)&lt;br /&gt;
&lt;br /&gt;
#######################################&lt;br /&gt;
# Mise à jour du dynhost si besoin   #&lt;br /&gt;
#####################################&lt;br /&gt;
&lt;br /&gt;
if [ -z $CURRENT_IP ] || [ -z $HOST_IP ]&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;[$CURRENT_DATETIME]: No IP retrieved&amp;quot; &amp;gt;&amp;gt; $PATH_LOG&lt;br /&gt;
  echo &amp;quot;[$CURRENT_DATETIME]: No IP retrieved&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  if [ &amp;quot;$HOST_IP&amp;quot; != &amp;quot;$CURRENT_IP&amp;quot; ]&lt;br /&gt;
  then&lt;br /&gt;
    RES=$(curl -m 5 -L --location-trusted --user &amp;quot;$LOGIN:$PASSWORD&amp;quot; &amp;quot;https://www.ovh.com/nic/update?system=dyndns&amp;amp;hostname=$HOST&amp;amp;myip=$CURRENT_IP&amp;quot;)&lt;br /&gt;
    echo &amp;quot;[$CURRENT_DATETIME]: IPv4 has changed - request to OVH DynHost: $RES&amp;quot; &amp;gt;&amp;gt; $PATH_LOG&lt;br /&gt;
    echo &amp;quot;[$CURRENT_DATETIME]: IPv4 has changed - request to OVH DynHost: $RES&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;L'IP n'a pas changé, pas de mise à jour necessaire&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
    echo &amp;quot;HOST_IP=&amp;quot;$HOST_IP&lt;br /&gt;
    echo &amp;quot;CURRENT_IP=&amp;quot;$CURRENT_IP&lt;br /&gt;
fi&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits&lt;br /&gt;
 chmod +x /var/lib/vitalpbx/scripts/dynhost.sh&lt;br /&gt;
&lt;br /&gt;
====Configuration Web GUI====&lt;br /&gt;
Se connecter en page web à l'interface de l'IPBX&lt;br /&gt;
&lt;br /&gt;
=====Définir le nom d'hôte=====&lt;br /&gt;
 Admin -&amp;gt; Network -&amp;gt; Paramètre réseau&lt;br /&gt;
Celui ci doit être identique au sous domaine créer sur OVH&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voice-host.png]]&lt;br /&gt;
&lt;br /&gt;
=====Installer l'Addon Task Manager=====&lt;br /&gt;
 Admin -&amp;gt; Add-ons -&amp;gt; Task Manager&lt;br /&gt;
&lt;br /&gt;
=====Créer un profil Cron=====&lt;br /&gt;
 PABX -&amp;gt; Outils -&amp;gt; Profils Cron&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voice-Profil-cron.png]]&lt;br /&gt;
&lt;br /&gt;
=====Créer une tache Cron=====&lt;br /&gt;
 PABX -&amp;gt; Outils -&amp;gt; Task Manager&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voice-tache-cron.png]]&lt;br /&gt;
&lt;br /&gt;
== Bip au démarrage et arrêt ==&lt;br /&gt;
=== Installation package Beep ===&lt;br /&gt;
 cd /tmp/&lt;br /&gt;
 wget ftp://ftp.pbone.net/mirror/dag.wieers.com/redhat/el7/en/x86_64/dag/RPMS/beep-1.3-1.el7.rf.x86_64.rpm&lt;br /&gt;
 yum localinstall -y beep-1.3-1.el7.rf.x86_64.rpm&lt;br /&gt;
 rm -f beep-1.3-1.el7.rf.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
=== Créer le service ===&lt;br /&gt;
 nano /etc/init.d/beep&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;! /bin/sh -e&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          beep&lt;br /&gt;
# Required-Start:    $syslog&lt;br /&gt;
# Required-Stop:     $syslog&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: beep&lt;br /&gt;
# Description:&lt;br /&gt;
#&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
# Carry out specific functions (start, stop, restart etc)&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start)&lt;br /&gt;
    beep -l 75 -f 500 -n -l 75 -f 1000 -n -l 75 -f 2000 -n -l 75 -f 3000&lt;br /&gt;
    ;;&lt;br /&gt;
  stop)&lt;br /&gt;
    beep -l 75 -f 3000 -n -l 75 -f 2000 -n -l 75 -f 1000 -n -l 75 -f 500&lt;br /&gt;
    ;;&lt;br /&gt;
  *)&lt;br /&gt;
    echo &amp;quot;Usage: /etc/init.d/beep {start|stop}&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
    ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
exit 0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mettre les droits ===&lt;br /&gt;
 sudo chmod a+x /etc/init.d/beep&lt;br /&gt;
&lt;br /&gt;
=== Activer au prochain démarrage ===&lt;br /&gt;
 systemctl enable beep.service&lt;br /&gt;
&lt;br /&gt;
=== Redemarrer ===&lt;br /&gt;
 systemctl reboot&lt;br /&gt;
&lt;br /&gt;
=== Tester ===&lt;br /&gt;
 systemctl reboot&lt;br /&gt;
&lt;br /&gt;
==Zabbix==&lt;br /&gt;
===[[Zabbix_Agent_VitalPBX_proxy|integration et Supervision via Zabbix proxy]]===&lt;br /&gt;
&lt;br /&gt;
===Script mise à jour host===&lt;br /&gt;
Se connecter en ssh ou console sur le serveur.&lt;br /&gt;
&lt;br /&gt;
Créer le script&lt;br /&gt;
 nano /var/lib/vitalpbx/scripts/host_zabbix.sh&lt;br /&gt;
&lt;br /&gt;
Ajouter les lignes suivante:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
#########################################################&lt;br /&gt;
# Création :      Sébastien Le Moal &amp;lt;slemoal@tiscom.fr&amp;gt; #&lt;br /&gt;
# Modifications :                                     #&lt;br /&gt;
######################################################&lt;br /&gt;
&lt;br /&gt;
# Tous droits réservés&lt;br /&gt;
&lt;br /&gt;
######################&lt;br /&gt;
#      CHANGELOG     #&lt;br /&gt;
#########################################################&lt;br /&gt;
# 2021/11 - Script initial - slemoal                   #&lt;br /&gt;
#######################################################&lt;br /&gt;
&lt;br /&gt;
#######################################&lt;br /&gt;
# Définition des Variables           #&lt;br /&gt;
#####################################&lt;br /&gt;
&lt;br /&gt;
host_zabbix=`uname -n`&lt;br /&gt;
path_zabbix_proxy=/etc/zabbix/zabbix_proxy.conf&lt;br /&gt;
path_zabbix_agent2=/etc/zabbix/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
#######################################&lt;br /&gt;
# Début du script                    #&lt;br /&gt;
#####################################&lt;br /&gt;
# Proxy zabbix&lt;br /&gt;
if  ! grep -q $host_zabbix $path_zabbix_proxy;&lt;br /&gt;
	then&lt;br /&gt;
		sed -i &amp;quot;s/\(Hostname=\).*/\Hostname=${host_zabbix}/&amp;quot; ${path_zabbix_proxy}&lt;br /&gt;
		/bin/systemctl restart zabbix-proxy.service&lt;br /&gt;
		echo &amp;quot;zabbix proxy: Hostname=&amp;quot;$host_zabbix $path_zabbix_proxy &amp;quot;modifié&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;zabbix proxy: Hostname=&amp;quot;$host_zabbix&amp;quot; est à jour&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Agent2 Zabbix&lt;br /&gt;
if  ! grep -q $host_zabbix $path_zabbix_agent2;&lt;br /&gt;
	then&lt;br /&gt;
		sed -i &amp;quot;s/\(Hostname=\).*/\Hostname=${host_zabbix}/&amp;quot; ${path_zabbix_agent2}&lt;br /&gt;
		/bin/systemctl restart zabbix-agent2.service&lt;br /&gt;
		echo &amp;quot;zabbix agent2: Hostname=&amp;quot;$host_zabbix $path_zabbix_proxy &amp;quot;modifié&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;zabbix agent2: Hostname=&amp;quot;$host_zabbix&amp;quot; est à jour&amp;quot;&lt;br /&gt;
fi&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits&lt;br /&gt;
 chmod +x /var/lib/vitalpbx/scripts/host_zabbix.sh&lt;br /&gt;
&lt;br /&gt;
====Configuration Web GUI====&lt;br /&gt;
Se connecter en page web à l'interface de l'IPBX&lt;br /&gt;
&lt;br /&gt;
=====Définir le nom d'hôte=====&lt;br /&gt;
 Admin -&amp;gt; Network -&amp;gt; Paramètre réseau&lt;br /&gt;
Celui ci doit être identique au sous domaine créer sur OVH&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voice-host.png]]&lt;br /&gt;
&lt;br /&gt;
=====Installer l'Addon Task Manager=====&lt;br /&gt;
 Admin -&amp;gt; Add-ons -&amp;gt; Task Manager&lt;br /&gt;
&lt;br /&gt;
=====Créer un profil Cron=====&lt;br /&gt;
 PABX -&amp;gt; Outils -&amp;gt; Profils Cron&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voice-Profil-cron.png]]&lt;br /&gt;
&lt;br /&gt;
=====Créer une tache Cron=====&lt;br /&gt;
 PABX -&amp;gt; Outils -&amp;gt; Task Manager&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voice-tache-cron2.png]]&lt;br /&gt;
&lt;br /&gt;
== MOTD personnalisé ==&lt;br /&gt;
Lors d'une mise à jour, le motd vital PBX est réinitialisé, nous ne pouvons donc pas simplement le modifier.&lt;br /&gt;
&lt;br /&gt;
Il va nous falloir en créer un nouveau, et contrôler au démarrage si le motd vitalpbx existe et dans quel cas le supprimer&lt;br /&gt;
&lt;br /&gt;
=== Création d'un nouveau Motd ===&lt;br /&gt;
 nano /etc/profile.d/tiscomwelcome.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#Bash Colour Codes&lt;br /&gt;
txtrst=&amp;quot;\033[00;0m&amp;quot;&lt;br /&gt;
bleu=&amp;quot;\033[1;34m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
linux_ver=`cat /etc/redhat-release`&lt;br /&gt;
vitalpbx_ver=`rpm -qi vitalpbx |awk -F: '/^Version/ {print $2}'`&lt;br /&gt;
vitalpbx_release=`rpm -qi vitalpbx |awk -F: '/^Release/ {print $2}'`&lt;br /&gt;
vpbx_version=&amp;quot;${vitalpbx_ver}-${vitalpbx_release}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;&lt;br /&gt;
${bleu}&lt;br /&gt;
 _______  _                             __       __     _&lt;br /&gt;
|__   __|(_)                            \ \     / /    (_)&lt;br /&gt;
   | |    _   __   ___  ___   _ __ ___   \ \   / /___   _   ___  ___&lt;br /&gt;
   | |   | |/ __| / __|/ _ \ | '_ ' _ \   \ \ / // _ \ | | / __|/ _ \ &lt;br /&gt;
   | |   | |\__ \| (__| (_) || | | | | |   \ V /| (_) || || (__|  __/&lt;br /&gt;
   |_|   |_||___/ \___|\___/ |_| |_| |_|    \_/  \___/ |_| \___|\___|&lt;br /&gt;
${txtrst}&lt;br /&gt;
&lt;br /&gt;
 Version IPBX     : ${vpbx_version//[[:space:]]}&lt;br /&gt;
 Version Asterisk : `asterisk -rx &amp;quot;core show version&amp;quot; 2&amp;gt;/dev/null| grep -ohe 'Asterisk [0-9.]*'`&lt;br /&gt;
 Version Linux    : ${linux_ver}&lt;br /&gt;
 Nom de domaine   : `hostname`&lt;br /&gt;
 Dispo depuis     : `uptime | grep -ohe 'up .*' | sed 's/up //g' | awk -F &amp;quot;,&amp;quot; '{print $1}'`&lt;br /&gt;
 Charcge CPU      : `uptime | grep -ohe 'load average[s:][: ].*' | awk '{ print &amp;quot;Last Minute: &amp;quot; $3&amp;quot; Last 5 Minutes: &amp;quot;$4&amp;quot; Last 15 Minutes: &amp;quot;$5 }'`&lt;br /&gt;
 Utilisateurs     : `uptime | grep -ohe '[0-9.*] user[s,]'`&lt;br /&gt;
 Adresse(s) IP    : ${bleu}`ip addr | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | xargs`${txtrst}&lt;br /&gt;
 Heure courante   :`timedatectl | sed -n '/Local time/ s/^[ \t]*Local time:\(.*$\)/\1/p'`&lt;br /&gt;
 Syncro NTP       :`timedatectl |awk -F: '/NTP sync/ {print $2}'`&lt;br /&gt;
&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création d'un script afin de le jouer au démarrage ===&lt;br /&gt;
 nano /var/lib/vitalpbx/scripts/boot.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
## Supprime le motd vitalpbx si existe&lt;br /&gt;
if [ -e /etc/profile.d/vitalwelcome.sh ]&lt;br /&gt;
then&lt;br /&gt;
    rm -f /etc/profile.d/vitalwelcome.sh&lt;br /&gt;
    echo &amp;quot;vitalwelcome.sh a été supprimé&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Donner au script des droits d’exécution ===&lt;br /&gt;
 chmod +x /var/lib/vitalpbx/scripts/boot.sh&lt;br /&gt;
&lt;br /&gt;
=== Créer une nouveau service systemd ===&lt;br /&gt;
 nano /etc/systemd/system/SLM_boot.service&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[Unit]&lt;br /&gt;
Description=Lancement d'un script au démarrage du serveur&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
ExecStart=/var/lib/vitalpbx/scripts/boot.sh&lt;br /&gt;
TimeoutStartSec=0&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=default.target&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Recharger ===&lt;br /&gt;
Reloader le process systemd pour que notre nouveau service soit pris en compte:&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
=== Activer ===&lt;br /&gt;
“Activer” le service pour qu’il se lance automatiquement au démarrage de la machine:&lt;br /&gt;
 systemctl enable SLM_boot.service&lt;br /&gt;
&lt;br /&gt;
=== Tester ===&lt;br /&gt;
 cp /etc/profile.d/tiscomwelcome.sh /etc/profile.d/vitalwelcome.sh &lt;br /&gt;
 systemctl reboot&lt;br /&gt;
&lt;br /&gt;
== OpenVPN ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
 Admin -&amp;gt; Add-ons -&amp;gt; Addons&lt;br /&gt;
Installer le module '''OpenVPN'''&lt;br /&gt;
&lt;br /&gt;
=== Configuration Serveur ===&lt;br /&gt;
 Admin -&amp;gt; Network -&amp;gt; OpenVPN Serveur&lt;br /&gt;
* Enabled: Yes&lt;br /&gt;
* Port: 1194&lt;br /&gt;
* Server Range: 10.8.0.0 | 255.255.255.0&lt;br /&gt;
* Public Host: client.tiscom.fr (le nom du dynhost ovh)&lt;br /&gt;
* Keep-Alive: 10 | 120&lt;br /&gt;
* Cipher Method: Blowfish&lt;br /&gt;
* Redirect Gateway: yes (permet d'accéder au autres équipements du réseau client joignable par l'ipbx)&lt;br /&gt;
* Primary DNS: 1.1.1.1&lt;br /&gt;
* Secondary DNS: 1.0.0.1&lt;br /&gt;
* Max Clients: 100&lt;br /&gt;
* Compression: None&lt;br /&gt;
&lt;br /&gt;
=== Configuration Client ===&lt;br /&gt;
Il est possible de visualiser l'état des clients connectés dans le menu&lt;br /&gt;
 Admin -&amp;gt; Network -&amp;gt; OpenVPN Serveur: onglet Clients&lt;br /&gt;
&lt;br /&gt;
==== PC Windows ====&lt;br /&gt;
Coté VitalPBX&lt;br /&gt;
 Admin -&amp;gt; Network -&amp;gt; OpenVPN Serveur: Add Client&lt;br /&gt;
* Description: Exemple: Sébastien Le Moal&lt;br /&gt;
* Fixed IP: Optionnel, laisser vide pour dhcp&lt;br /&gt;
* Type: Generic&lt;br /&gt;
* Enabled: Yes&lt;br /&gt;
Save&lt;br /&gt;
&lt;br /&gt;
 Admin -&amp;gt; Network -&amp;gt; OpenVPN Serveur: onglet Clients&lt;br /&gt;
Cliquer sur l'icone download du client précédemment créer afin de télécharger l'archive.&lt;br /&gt;
Coté PC&lt;br /&gt;
Télécharger, installer, executer OpenVPN Connect pour Windows&lt;br /&gt;
https://openvpn.net/client-connect-vpn-for-windows/&lt;br /&gt;
&lt;br /&gt;
Glisser le fichier &amp;quot;Client full.ovpn&amp;quot; contenu dans l'archive précédemment téléchargé au centre de l'appli.&lt;br /&gt;
&lt;br /&gt;
Add&lt;br /&gt;
&lt;br /&gt;
== Gestion UPS ==&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Se connecter en ssh&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 wget https://dl4jz3rbrsfum.cloudfront.net/software/PPL_64bit_v1.4.1.rpm&lt;br /&gt;
 rpm -ivh PPL_64bit_v1.4.1.rpm&lt;br /&gt;
&lt;br /&gt;
=== Obtenir l'état de l'onduleur ===&lt;br /&gt;
 pwrstat -status&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;The UPS information shows as following:&lt;br /&gt;
&lt;br /&gt;
        Properties:&lt;br /&gt;
                Model Name................... Value600EIGP&lt;br /&gt;
                Firmware Number.............. BZDB103&amp;amp;2F4.x&lt;br /&gt;
                Rating Voltage............... 230 V&lt;br /&gt;
                Rating Power................. 360 Watt(600 VA)&lt;br /&gt;
&lt;br /&gt;
        Current UPS status:&lt;br /&gt;
                State........................ Normal&lt;br /&gt;
                Power Supply by.............. Utility Power&lt;br /&gt;
                Utility Voltage.............. 234 V&lt;br /&gt;
                Output Voltage............... 234 V&lt;br /&gt;
                Battery Capacity............. 100 %&lt;br /&gt;
                Remaining Runtime............ 60 min.&lt;br /&gt;
                Load......................... 0 Watt(0 %)&lt;br /&gt;
                Line Interaction............. None&lt;br /&gt;
                Test Result.................. Unknown&lt;br /&gt;
                Last Power Event............. Blackout at 2022/01/25 16:02:34&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtenir les paramètres du démon ===&lt;br /&gt;
 pwrstat -config&lt;br /&gt;
&lt;br /&gt;
Répertori les paramètres de démon actuels comme suit.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Daemon Configuration:&lt;br /&gt;
&lt;br /&gt;
Alarm .............................................. On&lt;br /&gt;
Hibernate .......................................... Off&lt;br /&gt;
Cloud .............................................. Off&lt;br /&gt;
&lt;br /&gt;
Action for Power Failure:&lt;br /&gt;
&lt;br /&gt;
        Delay time since Power failure ............. 60 sec.&lt;br /&gt;
        Run script command ......................... On&lt;br /&gt;
        Path of script command ..................... /etc/pwrstatd-powerfail.sh&lt;br /&gt;
        Duration of command running ................ 0 sec.&lt;br /&gt;
        Enable shutdown system ..................... On&lt;br /&gt;
&lt;br /&gt;
Action for Battery Low:&lt;br /&gt;
&lt;br /&gt;
        Remaining runtime threshold ................ 300 sec.&lt;br /&gt;
        Battery capacity threshold ................. 35 %.&lt;br /&gt;
        Run script command ......................... On&lt;br /&gt;
        Path of command ............................ /etc/pwrstatd-lowbatt.sh&lt;br /&gt;
        Duration of command running ................ 0 sec.&lt;br /&gt;
        Enable shutdown system ..................... On&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configurer l'onduleur et le démon ===&lt;br /&gt;
&lt;br /&gt;
==== Action de configuration en cas de panne de courant à titre d'exemple ====&lt;br /&gt;
 pwrstat -pwrfail -delay 60 -active on -cmd /etc/pwrstatd-powerfail.sh -duration 1 -shutdown off&lt;br /&gt;
&lt;br /&gt;
Comme ci-dessus, il faudra 1 seconde pour exécuter un script shell nommé /etc/pwrstatd-powerfail.sh et eteindre le système si l'alimentation secteur est en panne pendant 1 minute.&lt;br /&gt;
&lt;br /&gt;
==== Action de configuration pour batterie faible comme exemple ====&lt;br /&gt;
 pwrstat -lowbatt -capacity 15 -active on -cmd /etc/pwrstatd-lowbatt.sh -duration 1 -shutdown on&lt;br /&gt;
&lt;br /&gt;
Comme ci-dessus, il faudra 1 seconde pour exécuter un script shell nommé /etc/pwrstatd-lowbatt.sh et eteindre le système car la capacité de la batterie de l'onduleur est faible puis un seuil pendant 5 secondes.&lt;br /&gt;
&lt;br /&gt;
Noter:&lt;br /&gt;
# Le seuil de capacité de la batterie peut être modifié dans le fichier /etc/pwrstatd.conf.&lt;br /&gt;
# Les paramètres -pwrfail et -lowbatt sont exclusivement.&lt;br /&gt;
# L'unité de l'option -delay est la seconde.&lt;br /&gt;
# Les deux scripts shell /etc/pwrstatd-powerfail.sh et /etc/pwrstatd-lowbatt.sh ont été copiés pendant la procédure d'installation.&lt;br /&gt;
# Au moins un des paramètres -delay, -active, -cmd, -duration ou -shutdown est nécessaire.&lt;br /&gt;
# L'option -cmd peut être n'importe quel script shell du système, mais elle sera exécutée par l'autorité root.&lt;br /&gt;
# Le paramètre d'action par défaut pour -pwrfail et -lowbatt est identique au paramètre ci-dessus de l'exemple.&lt;br /&gt;
&lt;br /&gt;
==== Désinstallation ====&lt;br /&gt;
 rpm -e powerpanel &lt;br /&gt;
&lt;br /&gt;
[[Catégorie:VOIP]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Xivo_dialplan_extern&amp;diff=1315</id>
		<title>Xivo dialplan extern</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Xivo_dialplan_extern&amp;diff=1315"/>
		<updated>2024-10-30T08:44:28Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelques exemples avec &amp;quot;0&amp;quot; comme préfixe de sortie : &lt;br /&gt;
*&amp;quot;0[1-3]XXX&amp;quot; : les numéros spéciaux Français sur 4 chiffres. &lt;br /&gt;
*&amp;quot;0118XXX&amp;quot; : les renseignements téléphoniques. &lt;br /&gt;
*&amp;quot;00[1-589]XXXXXXXX&amp;quot; : correspond aux numéros fixes français. &lt;br /&gt;
*&amp;quot;00[67]XXXXXXXX&amp;quot; : correspond aux numéros de cellulaires français. &lt;br /&gt;
*&amp;quot;000XXXXX.&amp;quot; : les numéros à l'international. &lt;br /&gt;
*&amp;quot;011[23459]&amp;quot; : les numéros d’urgences Européen avec préfixe de sortie. &lt;br /&gt;
*&amp;quot;11[23459]&amp;quot; : les numéros d’urgences Européen sans préfixe de sortie&lt;br /&gt;
*&amp;quot;01[578]&amp;quot; : les numéros d’urgences Français avec préfixe de sortie. &lt;br /&gt;
*&amp;quot;1[578]&amp;quot; : les numéros d’urgences Français sans préfixe de sortie.&lt;br /&gt;
&lt;br /&gt;
Quelques exemples sans préfixe de sortie : &lt;br /&gt;
*&amp;quot;[1-3]XXX&amp;quot; : les numéros spéciaux Français sur 4 chiffres. &lt;br /&gt;
*&amp;quot;118XXX&amp;quot; : les renseignements téléphoniques. &lt;br /&gt;
*&amp;quot;0[1-589]XXXXXXXX&amp;quot; : correspond aux numéros fixes français. &lt;br /&gt;
*&amp;quot;0[67]XXXXXXXX&amp;quot; : correspond aux numéros de cellulaires français. &lt;br /&gt;
*&amp;quot;00XXXXX.&amp;quot; : les numéros à l'international. &lt;br /&gt;
*&amp;quot;11[23459]&amp;quot; : les numéros d’urgences Européen&lt;br /&gt;
*&amp;quot;1[578]&amp;quot; : les numéros d’urgences Français&lt;br /&gt;
&lt;br /&gt;
[[File:Xivo_dialplan_toextern_1.png||450px]]&lt;br /&gt;
&lt;br /&gt;
[[File:Xivo_dialplan_toextern_2.png||450px]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1314</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1314"/>
		<updated>2023-05-01T20:42:49Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiquée par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents tests j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
cloner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du répertoire html en racine de votre répertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du répertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des répertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl.png]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste Yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
/!\ Modifier le nom du client obligera à modifier l'ID sur les bornes SNOM lié au client&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.png]]&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
Toute les 5minutes, un script télécharge l’annuaire officiel de serveur wazo&lt;br /&gt;
&lt;br /&gt;
Dans notre exemple : &lt;br /&gt;
 http://wazo01.XXXXX.XXX:9498/0.1/directories/lookup/default/snom?xivo_user_uuid=e5d6a27c-fa64-4a7b-9939-XXXXXXXXXXcdf&amp;amp;term&lt;br /&gt;
&lt;br /&gt;
Une fois téléchargé, un second script adapte les balises xml afin de correspondre à l’annuaire des bornes snom, supprime les accents, caractères spéciaux, et le met à disposition sous un lien lié à l’ID:  &lt;br /&gt;
 https://phonebook.slemoal.fr/phonebook/ZjY2NzkwMXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précédemment dans le champ &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de répertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionnée, vous devrez vous connecter sur la borne maitre et Coller l'id généré précédemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo&amp;diff=1313</id>
		<title>Wazo</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo&amp;diff=1313"/>
		<updated>2023-05-01T20:35:42Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[VOIP|Retour]]&lt;br /&gt;
&lt;br /&gt;
*[[Installation Wazo sur PC engines APU]]&lt;br /&gt;
&lt;br /&gt;
*[[Xivo_RAZ|RAZ usine]]&lt;br /&gt;
*[[Xivo_RAZ_password|RAZ Mdp root]]&lt;br /&gt;
*[[Xivo_backup_ftp|Sauvegarde automatique externalisé FTP]]&lt;br /&gt;
*[[Xivo_edit_template_poste|Modification template de poste]]&lt;br /&gt;
*[[Xivo_dialplan_extern|Plan de num sortant]]&lt;br /&gt;
*[[Xivo_Musique d attente|Musique d'attente]]&lt;br /&gt;
*[[Xivo_Sous-routine de prétraitement|Sous-routine de prétraitement]]&lt;br /&gt;
*[[Wazo_Phonebook_SnomDECT|Integration de l'annuaire Wazo pour les bornes Snom]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo&amp;diff=1312</id>
		<title>Wazo</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo&amp;diff=1312"/>
		<updated>2023-05-01T20:35:26Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[VOIP|Retour]]&lt;br /&gt;
&lt;br /&gt;
*[[Installation Wazo sur PC engines APU]]&lt;br /&gt;
&lt;br /&gt;
*[[Xivo_RAZ|RAZ usine]]&lt;br /&gt;
*[[Xivo_RAZ_password|RAZ Mdp root]]&lt;br /&gt;
*[[Xivo_backup_ftp|Sauvegarde automatique externalisé FTP]]&lt;br /&gt;
*[[Xivo_edit_template_poste|Modification template de poste]]&lt;br /&gt;
*[[Xivo_dialplan_extern|Plan de num sortant]]&lt;br /&gt;
*[[Xivo_Musique d attente|Musique d'attente]]&lt;br /&gt;
*[[Xivo_Sous-routine de prétraitement|Sous-routine de prétraitement]]&lt;br /&gt;
*[[Xivo_Config Interface Reseau|Config Interface Reseau]]&lt;br /&gt;
*[[Xivo_Config DHCP|Config DHCP]]&lt;br /&gt;
*[[Xivo_Activer routage|Activer routage]]&lt;br /&gt;
*[[Wazo_Phonebook_SnomDECT|Integration de l'annuaire Wazo pour les bornes Snom]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1311</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1311"/>
		<updated>2023-05-01T20:33:56Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Saisie d'un client */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl.png]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
/!\ Modifier le nom du client obligera à modifier l'ID sur les bornes SNOM lié au client&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.png]]&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
Toute les 5minutes, un script télécharge l’annuaire officiel de serveur wazo&lt;br /&gt;
&lt;br /&gt;
Dans notre exemple : &lt;br /&gt;
 http://wazo01.telecom-ci.net:9498/0.1/directories/lookup/default/snom?xivo_user_uuid=e5d6a27c-fa64-4a7b-9939-XXXXXXXXXXcdf&amp;amp;term&lt;br /&gt;
&lt;br /&gt;
Une fois téléchargé, un second script adapte les balises xml afin de correspondre à l’annuaire des bornes snom, supprime les accents, caractères spéciaux, et le met à disposition sous un lien lié à l’ID:  &lt;br /&gt;
 https://phonebook.slemoal.fr/phonebook/ZjY2NzkwMXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-index.png&amp;diff=1310</id>
		<title>Fichier:Phonebook-index.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-index.png&amp;diff=1310"/>
		<updated>2023-05-01T20:31:00Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1309</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1309"/>
		<updated>2023-05-01T20:30:51Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Saisie d'un client */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl.png]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.png]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
Toute les 5minutes, un script télécharge l’annuaire officiel de serveur wazo&lt;br /&gt;
&lt;br /&gt;
Dans notre exemple : &lt;br /&gt;
 http://wazo01.telecom-ci.net:9498/0.1/directories/lookup/default/snom?xivo_user_uuid=e5d6a27c-fa64-4a7b-9939-XXXXXXXXXXcdf&amp;amp;term&lt;br /&gt;
&lt;br /&gt;
Une fois téléchargé, un second script adapte les balises xml afin de correspondre à l’annuaire des bornes snom, supprime les accents, caractères spéciaux, et le met à disposition sous un lien lié à l’ID:  &lt;br /&gt;
 https://phonebook.slemoal.fr/phonebook/ZjY2NzkwMXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl2.png&amp;diff=1308</id>
		<title>Fichier:Phonebook-geturl2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl2.png&amp;diff=1308"/>
		<updated>2023-05-01T20:30:34Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl.png&amp;diff=1307</id>
		<title>Fichier:Phonebook-geturl.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl.png&amp;diff=1307"/>
		<updated>2023-05-01T20:30:16Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1306</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1306"/>
		<updated>2023-05-01T20:30:07Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Récuperer l'URL de l'annuaire Wazo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl.png]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
Toute les 5minutes, un script télécharge l’annuaire officiel de serveur wazo&lt;br /&gt;
&lt;br /&gt;
Dans notre exemple : &lt;br /&gt;
 http://wazo01.telecom-ci.net:9498/0.1/directories/lookup/default/snom?xivo_user_uuid=e5d6a27c-fa64-4a7b-9939-XXXXXXXXXXcdf&amp;amp;term&lt;br /&gt;
&lt;br /&gt;
Une fois téléchargé, un second script adapte les balises xml afin de correspondre à l’annuaire des bornes snom, supprime les accents, caractères spéciaux, et le met à disposition sous un lien lié à l’ID:  &lt;br /&gt;
 https://phonebook.slemoal.fr/phonebook/ZjY2NzkwMXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1305</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1305"/>
		<updated>2023-05-01T20:29:46Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl.jpg]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
Toute les 5minutes, un script télécharge l’annuaire officiel de serveur wazo&lt;br /&gt;
&lt;br /&gt;
Dans notre exemple : &lt;br /&gt;
 http://wazo01.telecom-ci.net:9498/0.1/directories/lookup/default/snom?xivo_user_uuid=e5d6a27c-fa64-4a7b-9939-XXXXXXXXXXcdf&amp;amp;term&lt;br /&gt;
&lt;br /&gt;
Une fois téléchargé, un second script adapte les balises xml afin de correspondre à l’annuaire des bornes snom, supprime les accents, caractères spéciaux, et le met à disposition sous un lien lié à l’ID:  &lt;br /&gt;
 https://phonebook.slemoal.fr/phonebook/ZjY2NzkwMXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl1.png&amp;diff=1304</id>
		<title>Fichier:Phonebook-geturl1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl1.png&amp;diff=1304"/>
		<updated>2023-05-01T20:29:04Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : Slemoal a téléversé une nouvelle version de Fichier:Phonebook-geturl1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl1.png&amp;diff=1303</id>
		<title>Fichier:Phonebook-geturl1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-geturl1.png&amp;diff=1303"/>
		<updated>2023-05-01T20:26:16Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1302</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1302"/>
		<updated>2023-05-01T20:25:34Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
[[Fichier:phonebook-geturl.jpg]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
Toute les 5minutes, un script télécharge l’annuaire officiel de serveur wazo&lt;br /&gt;
&lt;br /&gt;
Dans notre exemple : &lt;br /&gt;
 http://wazo01.telecom-ci.net:9498/0.1/directories/lookup/default/snom?xivo_user_uuid=e5d6a27c-fa64-4a7b-9939-XXXXXXXXXXcdf&amp;amp;term&lt;br /&gt;
&lt;br /&gt;
Une fois téléchargé, un second script adapte les balises xml afin de correspondre à l’annuaire des bornes snom, supprime les accents, caractères spéciaux, et le met à disposition sous un lien lié à l’ID:  &lt;br /&gt;
 https://phonebook.slemoal.fr/phonebook/ZjY2NzkwMXXXXXXXX&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1301</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1301"/>
		<updated>2023-05-01T20:23:07Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous allons donc télécharger le répertoire sur le serveur wazo et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
[[Fichier:phonebook-geturl.jpg]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1300</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1300"/>
		<updated>2023-05-01T20:20:49Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Installation  ===&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
[[Fichier:phonebook-geturl.jpg]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1299</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1299"/>
		<updated>2023-05-01T20:20:14Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
=== Récuperer l'URL de l'annuaire Wazo ===&lt;br /&gt;
La 1ère étape consiste à récupérer le lien de l'annuaire du serveur wazo&lt;br /&gt;
[[Fichier:phonebook-geturl.jpg]]&lt;br /&gt;
&lt;br /&gt;
# Choisir la stack&lt;br /&gt;
# Saisir une mac adresse lié à un poste yealink de l’installation.&lt;br /&gt;
[[Fichier:phonebook-geturl1.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-geturl2.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Saisie d'un client ===&lt;br /&gt;
Sur la page principale :&lt;br /&gt;
# Activer&lt;br /&gt;
# Saisir un nom de client&lt;br /&gt;
# Coller l’URL précédemment obtenu&lt;br /&gt;
# L’ID est automatiquement généré après avoir sauvegardé en fonction du nom de client.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-index.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1298</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1298"/>
		<updated>2023-05-01T20:09:30Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1297</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1297"/>
		<updated>2023-05-01T20:08:41Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1296</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1296"/>
		<updated>2023-05-01T20:06:29Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
== Installation  ==&lt;br /&gt;
clonner le projet git:&lt;br /&gt;
 git clone https://github.com/slemoal51/Wazo---Phonebook.git&lt;br /&gt;
&lt;br /&gt;
déplacer le contenu du repertoire html en racine de votre repertoire apache.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /var/www/html/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Déplacer le contenu du repertoire scripts ou vous le souhaitez.&lt;br /&gt;
&lt;br /&gt;
Dans mon exemple: /etc/phonebook/&lt;br /&gt;
&lt;br /&gt;
Modifier le mot de passe dans le fichier:&lt;br /&gt;
 /var/www/html/login.php&lt;br /&gt;
&lt;br /&gt;
Adapter le chemin des repertoires dans le fichiers:&lt;br /&gt;
 /etc/phonebook/download.sh&lt;br /&gt;
 /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
Modifier crontab pour lancer les scripts toutes les 5minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1295</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1295"/>
		<updated>2023-04-28T07:28:13Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration des bornes snom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le répertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
			// Récupération des valeurs soumises&lt;br /&gt;
			$valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
			$valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
			$valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
			$valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
			 // Formatage des valeurs en tableau associatif&lt;br /&gt;
			$donnees = array();&lt;br /&gt;
			for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
				// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
				$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
				// Encodage du hash en base64&lt;br /&gt;
				$base64 = base64_encode($hash);&lt;br /&gt;
				// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
				$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
				$donnees[$i] = array(&lt;br /&gt;
					&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
					&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
					&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
					&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Écriture des données dans le fichier variables.json&lt;br /&gt;
			$contenu = json_encode($donnees);&lt;br /&gt;
			file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
			// Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
			if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
				// Charger les données depuis le fichier variables.json&lt;br /&gt;
				$contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
				$donnees = json_decode($contenu, true);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
			&amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
			&amp;lt;style&amp;gt;&lt;br /&gt;
				/* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
				.large-input {&lt;br /&gt;
						width: 300px;&lt;br /&gt;
				}&lt;br /&gt;
				/* Styles pour le tableau */&lt;br /&gt;
				body {&lt;br /&gt;
						font-family: Arial, sans-serif;&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				h1 {&lt;br /&gt;
						text-align: center;&lt;br /&gt;
						color: #333;&lt;br /&gt;
				}&lt;br /&gt;
				table {&lt;br /&gt;
						width: 100%;&lt;br /&gt;
						max-width: 800px;&lt;br /&gt;
						margin: 0 auto;&lt;br /&gt;
						border-collapse: collapse;&lt;br /&gt;
						background-color: #FFF;&lt;br /&gt;
						box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
				}&lt;br /&gt;
				th, td {&lt;br /&gt;
						padding: 10px;&lt;br /&gt;
						text-align: left;&lt;br /&gt;
				}&lt;br /&gt;
				th {&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
				}&lt;br /&gt;
				tr:nth-child(even) {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				tr:hover {&lt;br /&gt;
						background-color: #EAEAEA;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
						display: block;&lt;br /&gt;
						margin: 20px auto;&lt;br /&gt;
						padding: 10px 20px;&lt;br /&gt;
						font-size: 16px;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
				.readonly {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
						color: #999;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn {&lt;br /&gt;
						display: inline-block;&lt;br /&gt;
						vertical-align: middle;&lt;br /&gt;
						margin-left: 10px;&lt;br /&gt;
						padding: 5px 10px;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;table&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
					&amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
				   &amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
				&amp;lt;/table&amp;gt;&lt;br /&gt;
				&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/form&amp;gt;&lt;br /&gt;
			&amp;lt;script&amp;gt;&lt;br /&gt;
				// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
				function copyToClipboard(button) {&lt;br /&gt;
					var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
					input.select();&lt;br /&gt;
					input.setSelectionRange(0, 99999);&lt;br /&gt;
					document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/phonebook/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1294</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1294"/>
		<updated>2023-04-28T07:22:54Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Planifier l'exécution des scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le répertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
			// Récupération des valeurs soumises&lt;br /&gt;
			$valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
			$valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
			$valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
			$valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
			 // Formatage des valeurs en tableau associatif&lt;br /&gt;
			$donnees = array();&lt;br /&gt;
			for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
				// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
				$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
				// Encodage du hash en base64&lt;br /&gt;
				$base64 = base64_encode($hash);&lt;br /&gt;
				// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
				$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
				$donnees[$i] = array(&lt;br /&gt;
					&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
					&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
					&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
					&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Écriture des données dans le fichier variables.json&lt;br /&gt;
			$contenu = json_encode($donnees);&lt;br /&gt;
			file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
			// Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
			if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
				// Charger les données depuis le fichier variables.json&lt;br /&gt;
				$contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
				$donnees = json_decode($contenu, true);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
			&amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
			&amp;lt;style&amp;gt;&lt;br /&gt;
				/* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
				.large-input {&lt;br /&gt;
						width: 300px;&lt;br /&gt;
				}&lt;br /&gt;
				/* Styles pour le tableau */&lt;br /&gt;
				body {&lt;br /&gt;
						font-family: Arial, sans-serif;&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				h1 {&lt;br /&gt;
						text-align: center;&lt;br /&gt;
						color: #333;&lt;br /&gt;
				}&lt;br /&gt;
				table {&lt;br /&gt;
						width: 100%;&lt;br /&gt;
						max-width: 800px;&lt;br /&gt;
						margin: 0 auto;&lt;br /&gt;
						border-collapse: collapse;&lt;br /&gt;
						background-color: #FFF;&lt;br /&gt;
						box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
				}&lt;br /&gt;
				th, td {&lt;br /&gt;
						padding: 10px;&lt;br /&gt;
						text-align: left;&lt;br /&gt;
				}&lt;br /&gt;
				th {&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
				}&lt;br /&gt;
				tr:nth-child(even) {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				tr:hover {&lt;br /&gt;
						background-color: #EAEAEA;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
						display: block;&lt;br /&gt;
						margin: 20px auto;&lt;br /&gt;
						padding: 10px 20px;&lt;br /&gt;
						font-size: 16px;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
				.readonly {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
						color: #999;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn {&lt;br /&gt;
						display: inline-block;&lt;br /&gt;
						vertical-align: middle;&lt;br /&gt;
						margin-left: 10px;&lt;br /&gt;
						padding: 5px 10px;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;table&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
					&amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
				   &amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
				&amp;lt;/table&amp;gt;&lt;br /&gt;
				&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/form&amp;gt;&lt;br /&gt;
			&amp;lt;script&amp;gt;&lt;br /&gt;
				// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
				function copyToClipboard(button) {&lt;br /&gt;
					var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
					input.select();&lt;br /&gt;
					input.setSelectionRange(0, 99999);&lt;br /&gt;
					document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * bash /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1293</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1293"/>
		<updated>2023-04-28T07:21:49Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration du serveur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Dépendance ===&lt;br /&gt;
Pour le traitement des données Json&lt;br /&gt;
 apt-get install jq&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le répertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
			// Récupération des valeurs soumises&lt;br /&gt;
			$valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
			$valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
			$valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
			$valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
			 // Formatage des valeurs en tableau associatif&lt;br /&gt;
			$donnees = array();&lt;br /&gt;
			for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
				// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
				$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
				// Encodage du hash en base64&lt;br /&gt;
				$base64 = base64_encode($hash);&lt;br /&gt;
				// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
				$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
				$donnees[$i] = array(&lt;br /&gt;
					&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
					&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
					&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
					&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Écriture des données dans le fichier variables.json&lt;br /&gt;
			$contenu = json_encode($donnees);&lt;br /&gt;
			file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
			// Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
			if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
				// Charger les données depuis le fichier variables.json&lt;br /&gt;
				$contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
				$donnees = json_decode($contenu, true);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
			&amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
			&amp;lt;style&amp;gt;&lt;br /&gt;
				/* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
				.large-input {&lt;br /&gt;
						width: 300px;&lt;br /&gt;
				}&lt;br /&gt;
				/* Styles pour le tableau */&lt;br /&gt;
				body {&lt;br /&gt;
						font-family: Arial, sans-serif;&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				h1 {&lt;br /&gt;
						text-align: center;&lt;br /&gt;
						color: #333;&lt;br /&gt;
				}&lt;br /&gt;
				table {&lt;br /&gt;
						width: 100%;&lt;br /&gt;
						max-width: 800px;&lt;br /&gt;
						margin: 0 auto;&lt;br /&gt;
						border-collapse: collapse;&lt;br /&gt;
						background-color: #FFF;&lt;br /&gt;
						box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
				}&lt;br /&gt;
				th, td {&lt;br /&gt;
						padding: 10px;&lt;br /&gt;
						text-align: left;&lt;br /&gt;
				}&lt;br /&gt;
				th {&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
				}&lt;br /&gt;
				tr:nth-child(even) {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				tr:hover {&lt;br /&gt;
						background-color: #EAEAEA;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
						display: block;&lt;br /&gt;
						margin: 20px auto;&lt;br /&gt;
						padding: 10px 20px;&lt;br /&gt;
						font-size: 16px;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
				.readonly {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
						color: #999;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn {&lt;br /&gt;
						display: inline-block;&lt;br /&gt;
						vertical-align: middle;&lt;br /&gt;
						margin-left: 10px;&lt;br /&gt;
						padding: 5px 10px;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;table&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
					&amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
				   &amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
				&amp;lt;/table&amp;gt;&lt;br /&gt;
				&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/form&amp;gt;&lt;br /&gt;
			&amp;lt;script&amp;gt;&lt;br /&gt;
				// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
				function copyToClipboard(button) {&lt;br /&gt;
					var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
					input.select();&lt;br /&gt;
					input.setSelectionRange(0, 99999);&lt;br /&gt;
					document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1292</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1292"/>
		<updated>2023-04-15T16:04:26Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
			// Récupération des valeurs soumises&lt;br /&gt;
			$valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
			$valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
			$valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
			$valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
			 // Formatage des valeurs en tableau associatif&lt;br /&gt;
			$donnees = array();&lt;br /&gt;
			for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
				// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
				$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
				// Encodage du hash en base64&lt;br /&gt;
				$base64 = base64_encode($hash);&lt;br /&gt;
				// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
				$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
				$donnees[$i] = array(&lt;br /&gt;
					&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
					&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
					&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
					&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Écriture des données dans le fichier variables.json&lt;br /&gt;
			$contenu = json_encode($donnees);&lt;br /&gt;
			file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
			// Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
			if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
				// Charger les données depuis le fichier variables.json&lt;br /&gt;
				$contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
				$donnees = json_decode($contenu, true);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
			&amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
			&amp;lt;style&amp;gt;&lt;br /&gt;
				/* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
				.large-input {&lt;br /&gt;
						width: 300px;&lt;br /&gt;
				}&lt;br /&gt;
				/* Styles pour le tableau */&lt;br /&gt;
				body {&lt;br /&gt;
						font-family: Arial, sans-serif;&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				h1 {&lt;br /&gt;
						text-align: center;&lt;br /&gt;
						color: #333;&lt;br /&gt;
				}&lt;br /&gt;
				table {&lt;br /&gt;
						width: 100%;&lt;br /&gt;
						max-width: 800px;&lt;br /&gt;
						margin: 0 auto;&lt;br /&gt;
						border-collapse: collapse;&lt;br /&gt;
						background-color: #FFF;&lt;br /&gt;
						box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
				}&lt;br /&gt;
				th, td {&lt;br /&gt;
						padding: 10px;&lt;br /&gt;
						text-align: left;&lt;br /&gt;
				}&lt;br /&gt;
				th {&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
				}&lt;br /&gt;
				tr:nth-child(even) {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				tr:hover {&lt;br /&gt;
						background-color: #EAEAEA;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
						display: block;&lt;br /&gt;
						margin: 20px auto;&lt;br /&gt;
						padding: 10px 20px;&lt;br /&gt;
						font-size: 16px;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
				.readonly {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
						color: #999;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn {&lt;br /&gt;
						display: inline-block;&lt;br /&gt;
						vertical-align: middle;&lt;br /&gt;
						margin-left: 10px;&lt;br /&gt;
						padding: 5px 10px;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;table&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
					&amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
				   &amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
				&amp;lt;/table&amp;gt;&lt;br /&gt;
				&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/form&amp;gt;&lt;br /&gt;
			&amp;lt;script&amp;gt;&lt;br /&gt;
				// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
				function copyToClipboard(button) {&lt;br /&gt;
					var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
					input.select();&lt;br /&gt;
					input.setSelectionRange(0, 99999);&lt;br /&gt;
					document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1291</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1291"/>
		<updated>2023-04-15T16:04:03Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === '1234567') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
			// Récupération des valeurs soumises&lt;br /&gt;
			$valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
			$valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
			$valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
			$valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
			 // Formatage des valeurs en tableau associatif&lt;br /&gt;
			$donnees = array();&lt;br /&gt;
			for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
				// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
				$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
				// Encodage du hash en base64&lt;br /&gt;
				$base64 = base64_encode($hash);&lt;br /&gt;
				// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
				$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
				$donnees[$i] = array(&lt;br /&gt;
					&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
					&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
					&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
					&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Écriture des données dans le fichier variables.json&lt;br /&gt;
			$contenu = json_encode($donnees);&lt;br /&gt;
			file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
			// Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
			if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
				// Charger les données depuis le fichier variables.json&lt;br /&gt;
				$contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
				$donnees = json_decode($contenu, true);&lt;br /&gt;
			}&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
			&amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
			&amp;lt;style&amp;gt;&lt;br /&gt;
				/* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
				.large-input {&lt;br /&gt;
						width: 300px;&lt;br /&gt;
				}&lt;br /&gt;
				/* Styles pour le tableau */&lt;br /&gt;
				body {&lt;br /&gt;
						font-family: Arial, sans-serif;&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				h1 {&lt;br /&gt;
						text-align: center;&lt;br /&gt;
						color: #333;&lt;br /&gt;
				}&lt;br /&gt;
				table {&lt;br /&gt;
						width: 100%;&lt;br /&gt;
						max-width: 800px;&lt;br /&gt;
						margin: 0 auto;&lt;br /&gt;
						border-collapse: collapse;&lt;br /&gt;
						background-color: #FFF;&lt;br /&gt;
						box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
				}&lt;br /&gt;
				th, td {&lt;br /&gt;
						padding: 10px;&lt;br /&gt;
						text-align: left;&lt;br /&gt;
				}&lt;br /&gt;
				th {&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
				}&lt;br /&gt;
				tr:nth-child(even) {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
				}&lt;br /&gt;
				tr:hover {&lt;br /&gt;
						background-color: #EAEAEA;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
						display: block;&lt;br /&gt;
						margin: 20px auto;&lt;br /&gt;
						padding: 10px 20px;&lt;br /&gt;
						font-size: 16px;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
				.readonly {&lt;br /&gt;
						background-color: #F8F8F8;&lt;br /&gt;
						color: #999;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn {&lt;br /&gt;
						display: inline-block;&lt;br /&gt;
						vertical-align: middle;&lt;br /&gt;
						margin-left: 10px;&lt;br /&gt;
						padding: 5px 10px;&lt;br /&gt;
						background-color: #333;&lt;br /&gt;
						color: #FFF;&lt;br /&gt;
						border: none;&lt;br /&gt;
						cursor: pointer;&lt;br /&gt;
				}&lt;br /&gt;
				.copy-btn:hover {&lt;br /&gt;
						background-color: #555;&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
			&amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
			&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;table&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
						&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
					&amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
					&amp;lt;tr&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
				   &amp;lt;/tr&amp;gt;&lt;br /&gt;
					&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
				&amp;lt;/table&amp;gt;&lt;br /&gt;
				&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;/form&amp;gt;&lt;br /&gt;
			&amp;lt;script&amp;gt;&lt;br /&gt;
				// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
				function copyToClipboard(button) {&lt;br /&gt;
					var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
					input.select();&lt;br /&gt;
					input.setSelectionRange(0, 99999);&lt;br /&gt;
					document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1290</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1290"/>
		<updated>2023-04-15T14:16:50Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Autoprovisionning Wazo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1289</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1289"/>
		<updated>2023-04-15T14:15:55Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration des bornes snom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Coller l'id généré précedemment dans le champs &amp;quot;nom du fichier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-admin.jpg&amp;diff=1288</id>
		<title>Fichier:Phonebook-admin.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Fichier:Phonebook-admin.jpg&amp;diff=1288"/>
		<updated>2023-04-15T14:14:13Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1287</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1287"/>
		<updated>2023-04-15T14:13:44Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1286</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1286"/>
		<updated>2023-04-15T14:13:35Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1285</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1285"/>
		<updated>2023-04-15T14:12:38Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner:&lt;br /&gt;
* Activer&lt;br /&gt;
* Saisir URL de l'annuaire wazo&lt;br /&gt;
* Enregistrer&lt;br /&gt;
&lt;br /&gt;
L'ID est automatiquement généré par rapport au nom du client.&lt;br /&gt;
Modifier celui ci obligera à modifier l'ID sur les bornes SNOM du client&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1284</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1284"/>
		<updated>2023-04-15T14:10:13Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1283</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1283"/>
		<updated>2023-04-15T14:10:04Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:phonebook-admin.jpg]]&lt;br /&gt;
&lt;br /&gt;
Renseigner&lt;br /&gt;
* Activer &lt;br /&gt;
* le nom du client&lt;br /&gt;
* l'URL du repertoire wazo&lt;br /&gt;
Sauvegarder &lt;br /&gt;
&lt;br /&gt;
Le champs ID est automatiquement généré en fonction du nom de client.&lt;br /&gt;
Attention de ne pas le modifier, sinon il faudra modifier l'id sur les bornes snom du client.&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1282</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1282"/>
		<updated>2023-04-15T14:03:22Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Configuration des bornes snom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration page Web ==&lt;br /&gt;
Se connecter sur votre page web&lt;br /&gt;
&lt;br /&gt;
https://phonebook.slemoal/phonebook.php&lt;br /&gt;
&lt;br /&gt;
Renseigner votre mot de passe, valider.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1281</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1281"/>
		<updated>2023-04-15T13:59:03Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : {{Rouge|VOTRE_MOT_DE_PASSE}} par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1280</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1280"/>
		<updated>2023-04-15T13:57:55Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1279</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1279"/>
		<updated>2023-04-15T13:56:55Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Autoprovisionning Wazo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1278</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1278"/>
		<updated>2023-04-15T13:55:50Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1277</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1277"/>
		<updated>2023-04-15T13:55:18Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Page Web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1276</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1276"/>
		<updated>2023-04-15T13:54:27Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1275</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1275"/>
		<updated>2023-04-15T13:53:56Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1274</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1274"/>
		<updated>2023-04-15T13:52:53Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Planifier l'exécution des scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1273</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1273"/>
		<updated>2023-04-15T13:52:12Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Télécharger les répertoires */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1272</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1272"/>
		<updated>2023-04-15T13:51:44Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : /* Adapter les répertoires */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1271</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1271"/>
		<updated>2023-04-15T13:50:25Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1270</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1270"/>
		<updated>2023-04-15T13:50:17Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line highlight=&amp;quot;9-11&amp;quot;&amp;gt;# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1269</id>
		<title>Wazo Phonebook SnomDECT</title>
		<link rel="alternate" type="text/html" href="https://wiki.slemoal.fr/index.php?title=Wazo_Phonebook_SnomDECT&amp;diff=1269"/>
		<updated>2023-04-15T13:45:57Z</updated>

		<summary type="html">&lt;p&gt;Slemoal : Page créée avec « == Présentation == L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.  Fichier:wazo-m900snom-limitation.jpg  Après vérifi… »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation ==&lt;br /&gt;
L'annuaire Wazo n'est pas pris en charge sur les bornes M900 en raison d'une URL Trop grande.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-limitation.jpg]]&lt;br /&gt;
&lt;br /&gt;
Après vérification, la raison communiqué par l'éditeur wazo est exact :).&lt;br /&gt;
&lt;br /&gt;
J'ai tenté de contourner cette limitation via une redirection 301, mais sans succès.&lt;br /&gt;
&lt;br /&gt;
La seconde approche, qui elle fonctionne, est de télécharger ce répertoire et de le mettre à disposition sur un autre serveur avec une URL de taille accepté par les bornes.&lt;br /&gt;
&lt;br /&gt;
Environnement de test:&lt;br /&gt;
* Wazo version: 23.1&lt;br /&gt;
* Borne M900 version: 530.2&lt;br /&gt;
* M85 version: 530.2&lt;br /&gt;
&lt;br /&gt;
== M900 - Phonebook ==&lt;br /&gt;
Les bornes M900 peuvent gérer le répertoire distant de 4manières.&lt;br /&gt;
* Local&lt;br /&gt;
* LDAP&lt;br /&gt;
* XML Server&lt;br /&gt;
* XML MiniBrowser Server&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
Ce mode télécharge le répertoire à une intervalle prédéfini et le stock dans sa mémoire.&lt;br /&gt;
les téléphones récupère le répertoire sur la borne.&lt;br /&gt;
&lt;br /&gt;
Documentation: https://service.snom.com/display/wiki/How+to+use+the+Local+Central+Directory+on+M300%2C+M700%2C+M900+DECT+base&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
L'annuaire central du serveur LDAP permet de configurer tous les paramètres spécifiques à LDAP afin d'effectuer des recherches sur un serveur LDAP&lt;br /&gt;
&lt;br /&gt;
=== XML Server ===&lt;br /&gt;
Le choix XML server est  spécifique à Broadsoft , ce type de carnet d'adresses utilise une API propriétaire Broadsoft nommée XSI pour accéder aux répertoires.&lt;br /&gt;
&lt;br /&gt;
=== XML MiniBrowser Server ===&lt;br /&gt;
Dans ce mode, rien n'est stocké sur la borne,&lt;br /&gt;
&lt;br /&gt;
Quand un téléphone souhaite accéder à l'annuaire, il fait une requête http vers le serveur distant et télécharge le répertoire.&lt;br /&gt;
&lt;br /&gt;
=== Choix du type de serveur ===&lt;br /&gt;
De base, wazo est fait pour fonctionner avec XML Minibrowser Server, mais lors de mes différents test j'ai pu constater qu'un annuaire de plus de 160 contacts n'était pas accepté.&lt;br /&gt;
&lt;br /&gt;
Le mode Local n'ayant pas cette limitation nous adapteront le fichier xml afin de lui convenir.&lt;br /&gt;
&lt;br /&gt;
==Configuration du serveur==&lt;br /&gt;
=== VM ===&lt;br /&gt;
Dans mon cas, je suis parti avec une VM:&lt;br /&gt;
* Stockage: 4Go&lt;br /&gt;
* Rem: 1024Mo&lt;br /&gt;
&lt;br /&gt;
Sur laquelle j'ai installé une Debian 11.6 minimal avec serveur web (apache2) + php&lt;br /&gt;
&lt;br /&gt;
=== Page Web ===&lt;br /&gt;
Dans notre cas le repertoire apache racine est:&lt;br /&gt;
 /var/www/html&lt;br /&gt;
&lt;br /&gt;
Création des repertoires&lt;br /&gt;
 mkdir /var/www/html/includes&lt;br /&gt;
 mkdir /var/www/html/download&lt;br /&gt;
&lt;br /&gt;
Mise en place des droits pour appaches&lt;br /&gt;
chown www-data:www-data /var/www/html&lt;br /&gt;
chown www-data:www-data /var/www/html/includes&lt;br /&gt;
&lt;br /&gt;
Créer un fichier de redirection pour l'index&lt;br /&gt;
vi /var/www/html/index.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
header(&amp;quot;Status: 301 Moved Permanently&amp;quot;, false, 301);&lt;br /&gt;
header(&amp;quot;Location: https://www.oci.fr/oci-connect/&amp;quot;);&lt;br /&gt;
exit();&lt;br /&gt;
?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer la page d'administration en remplaçant bien sur le mot de passe : VOTRE_MOT_DE_PASSE par le votre en ligne 8&lt;br /&gt;
 vi /var/www/html/phonebook.php&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
&lt;br /&gt;
// Vérifier si le mot de passe a été soumis&lt;br /&gt;
if (isset($_POST['mot_de_passe'])) {&lt;br /&gt;
    $motDePasseSaisi = $_POST['mot_de_passe'];&lt;br /&gt;
    // Comparer le mot de passe saisi avec le mot de passe souhaité&lt;br /&gt;
    if ($motDePasseSaisi === 'VOTRE_MOT_DE_PASSE') {&lt;br /&gt;
        // Mot de passe correct, définir une variable de session pour indiquer que l'utilisateur est authentifié&lt;br /&gt;
        $_SESSION['authentifie'] = true;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Mot de passe incorrect, afficher un message d'erreur&lt;br /&gt;
        echo &amp;quot;Mot de passe incorrect.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vérifier si l'utilisateur est authentifié&lt;br /&gt;
if (!isset($_SESSION['authentifie']) || $_SESSION['authentifie'] !== true) {&lt;br /&gt;
    // Afficher le formulaire de saisie du mot de passe&lt;br /&gt;
    echo '&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;';&lt;br /&gt;
    echo 'Mot de passe : &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;mot_de_passe&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Valider&amp;quot;&amp;gt;';&lt;br /&gt;
    echo '&amp;lt;/form&amp;gt;';&lt;br /&gt;
} else {&lt;br /&gt;
    // Afficher le contenu protégé&lt;br /&gt;
    echo &amp;quot;Contenu protégé : les utilisateurs authentifiés peuvent voir ce contenu.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // Vérification si le formulaire a été soumis&lt;br /&gt;
        if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) {&lt;br /&gt;
                // Récupération des valeurs soumises&lt;br /&gt;
                $valeurs1 = isset($_POST[&amp;quot;valeur1&amp;quot;]) ? $_POST[&amp;quot;valeur1&amp;quot;] : array();&lt;br /&gt;
                $valeurs2 = isset($_POST[&amp;quot;valeur2&amp;quot;]) ? $_POST[&amp;quot;valeur2&amp;quot;] : array();&lt;br /&gt;
                $valeurs3 = isset($_POST[&amp;quot;valeur3&amp;quot;]) ? $_POST[&amp;quot;valeur3&amp;quot;] : array();&lt;br /&gt;
                $valeurs4 = isset($_POST[&amp;quot;valeur4&amp;quot;]) ? $_POST[&amp;quot;valeur4&amp;quot;] : array();&lt;br /&gt;
&lt;br /&gt;
				 // Formatage des valeurs en tableau associatif&lt;br /&gt;
				$donnees = array();&lt;br /&gt;
				for ($i = 0; $i &amp;lt; count($valeurs1); $i++) {&lt;br /&gt;
					// Génération du hash en utilisant la valeur de la colonne 2&lt;br /&gt;
					$hash = hash('sha256', $valeurs2[$i]);&lt;br /&gt;
					// Encodage du hash en base64&lt;br /&gt;
					$base64 = base64_encode($hash);&lt;br /&gt;
					// Extraction des 16 premiers caractères de l'encodage en base64&lt;br /&gt;
					$valeur4 = substr($base64, 0, 16);&lt;br /&gt;
&lt;br /&gt;
					$donnees[$i] = array(&lt;br /&gt;
						&amp;quot;valeur1&amp;quot; =&amp;gt; isset($valeurs1[$i]) ? &amp;quot;checked&amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;
						&amp;quot;valeur2&amp;quot; =&amp;gt; $valeurs2[$i],&lt;br /&gt;
						&amp;quot;valeur3&amp;quot; =&amp;gt; $valeurs3[$i],&lt;br /&gt;
						&amp;quot;valeur4&amp;quot; =&amp;gt; $valeur4&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
                // Écriture des données dans le fichier variables.json&lt;br /&gt;
                $contenu = json_encode($donnees);&lt;br /&gt;
                file_put_contents(&amp;quot;includes/variables.json&amp;quot;, $contenu);&lt;br /&gt;
        } else {&lt;br /&gt;
                // Si le formulaire n'a pas été soumis, vérifier si le fichier variables.json existe&lt;br /&gt;
                if (file_exists(&amp;quot;includes/variables.json&amp;quot;)) {&lt;br /&gt;
                        // Charger les données depuis le fichier variables.json&lt;br /&gt;
                        $contenu = file_get_contents(&amp;quot;includes/variables.json&amp;quot;);&lt;br /&gt;
                        $donnees = json_decode($contenu, true);&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
        &amp;lt;html&amp;gt;&lt;br /&gt;
        &amp;lt;head&amp;gt;&lt;br /&gt;
                &amp;lt;title&amp;gt;OCI - Phonebook&amp;lt;/title&amp;gt;&lt;br /&gt;
                &amp;lt;style&amp;gt;&lt;br /&gt;
                        /* Styles pour agrandir les champs de texte des colonnes 3 et 4 */&lt;br /&gt;
                        .large-input {&lt;br /&gt;
                                width: 300px;&lt;br /&gt;
                        }&lt;br /&gt;
                        /* Styles pour le tableau */&lt;br /&gt;
                        body {&lt;br /&gt;
                                font-family: Arial, sans-serif;&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        h1 {&lt;br /&gt;
                                text-align: center;&lt;br /&gt;
                                color: #333;&lt;br /&gt;
                        }&lt;br /&gt;
                        table {&lt;br /&gt;
                                width: 100%;&lt;br /&gt;
                                max-width: 800px;&lt;br /&gt;
                                margin: 0 auto;&lt;br /&gt;
                                border-collapse: collapse;&lt;br /&gt;
                                background-color: #FFF;&lt;br /&gt;
                                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);&lt;br /&gt;
                        }&lt;br /&gt;
                        th, td {&lt;br /&gt;
                                padding: 10px;&lt;br /&gt;
                                text-align: left;&lt;br /&gt;
                        }&lt;br /&gt;
                        th {&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:nth-child(even) {&lt;br /&gt;
                                background-color: #F8F8F8;&lt;br /&gt;
                        }&lt;br /&gt;
                        tr:hover {&lt;br /&gt;
                                background-color: #EAEAEA;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;] {&lt;br /&gt;
                                display: block;&lt;br /&gt;
                                margin: 20px auto;&lt;br /&gt;
                                padding: 10px 20px;&lt;br /&gt;
                                font-size: 16px;&lt;br /&gt;
                                color: #FFF;&lt;br /&gt;
                                background-color: #333;&lt;br /&gt;
                                border: none;&lt;br /&gt;
                                cursor: pointer;&lt;br /&gt;
                        }&lt;br /&gt;
                        input[type=&amp;quot;submit&amp;quot;]:hover {&lt;br /&gt;
                                background-color: #555;&lt;br /&gt;
                        }&lt;br /&gt;
						.readonly {&lt;br /&gt;
								background-color: #F8F8F8;&lt;br /&gt;
								color: #999;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn {&lt;br /&gt;
								display: inline-block;&lt;br /&gt;
								vertical-align: middle;&lt;br /&gt;
								margin-left: 10px;&lt;br /&gt;
								padding: 5px 10px;&lt;br /&gt;
								background-color: #333;&lt;br /&gt;
								color: #FFF;&lt;br /&gt;
								border: none;&lt;br /&gt;
								cursor: pointer;&lt;br /&gt;
						}&lt;br /&gt;
						.copy-btn:hover {&lt;br /&gt;
								background-color: #555;&lt;br /&gt;
}&lt;br /&gt;
                &amp;lt;/style&amp;gt;&lt;br /&gt;
        &amp;lt;/head&amp;gt;&lt;br /&gt;
        &amp;lt;body&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Phonebook Wazo pour Snom&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER[&amp;quot;PHP_SELF&amp;quot;]; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;table&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;#&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Activer&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;Nom du client&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;URL Annuaire Wazo&amp;lt;/th&amp;gt;&lt;br /&gt;
                                        &amp;lt;th&amp;gt;ID nouvel annuaire&amp;lt;/th&amp;gt;&lt;br /&gt;
										&amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
                                &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php for ($i = 0; $i &amp;lt; 100; $i++) { ?&amp;gt;&lt;br /&gt;
                                &amp;lt;tr&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;?php echo $i + 1; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;valeur1[]&amp;quot; &amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur1&amp;quot;]) ? $donnees[$i][&amp;quot;valeur1&amp;quot;] : ''; ?&amp;gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur2[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur2&amp;quot;]) ? $donnees[$i][&amp;quot;valeur2&amp;quot;] : ''; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur3[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur3&amp;quot;]) ? $donnees[$i][&amp;quot;valeur3&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                                        &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;valeur4[]&amp;quot; value=&amp;quot;&amp;lt;?php echo isset($donnees[$i][&amp;quot;valeur4&amp;quot;]) ? $donnees[$i][&amp;quot;valeur4&amp;quot;] : ''; ?&amp;gt;&amp;quot; class=&amp;quot;large-input readonly&amp;quot; readonly&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
						                &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Copier ID&amp;quot; class=&amp;quot;copy-btn&amp;quot; onclick=&amp;quot;copyToClipboard(this)&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
							   &amp;lt;/tr&amp;gt;&lt;br /&gt;
                                &amp;lt;?php } ?&amp;gt;&lt;br /&gt;
                        &amp;lt;/table&amp;gt;&lt;br /&gt;
                        &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enregistrer&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;/form&amp;gt;&lt;br /&gt;
				&amp;lt;script&amp;gt;&lt;br /&gt;
					// Fonction pour copier le contenu d'un champ de texte dans le presse-papier&lt;br /&gt;
					function copyToClipboard(button) {&lt;br /&gt;
						var input = button.parentNode.previousElementSibling.firstElementChild;&lt;br /&gt;
						input.select();&lt;br /&gt;
						input.setSelectionRange(0, 99999);&lt;br /&gt;
						document.execCommand(&amp;quot;copy&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				&amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;!-- Fin du contenu HTML protégé --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Nous allons installer 2 scripts&lt;br /&gt;
# Télécharger les répertoires wazo&lt;br /&gt;
# Adapter les répertoires téléchargés&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/phonebook&lt;br /&gt;
&lt;br /&gt;
==== Télécharger les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Charger les données depuis le fichier variables.json&lt;br /&gt;
contenu=$(cat /var/www/html/includes/variables.json)&lt;br /&gt;
donnees=($(echo &amp;quot;$contenu&amp;quot; | jq -r '.[] | &amp;quot;\(.valeur1),\(.valeur2),\(.valeur3),\(.valeur4)&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
# Parcourir les données et télécharger les fichiers&lt;br /&gt;
for donnee in &amp;quot;${donnees[@]}&amp;quot;; do&lt;br /&gt;
    # Extraire les valeurs de chaque colonne&lt;br /&gt;
    valeur1=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 1)&lt;br /&gt;
    valeur3=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 3)&lt;br /&gt;
    valeur4=$(echo &amp;quot;$donnee&amp;quot; | cut -d ',' -f 4)&lt;br /&gt;
&lt;br /&gt;
    # Vérifier si la case de la colonne 1 est activée&lt;br /&gt;
    if [ &amp;quot;$valeur1&amp;quot; == &amp;quot;checked&amp;quot; ]; then&lt;br /&gt;
        # Télécharger le fichier avec wget&lt;br /&gt;
        wget &amp;quot;$valeur3&amp;quot; -O &amp;quot;/var/www/html/phonebook/$valeur4&amp;quot;&lt;br /&gt;
        echo &amp;quot;Le fichier $valeur4 a été téléchargé depuis $valeur3.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/download.sh&lt;br /&gt;
&lt;br /&gt;
==== Adapter les répertoires ====&lt;br /&gt;
 vi /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
# Scrypt lancé par crontab&lt;br /&gt;
&lt;br /&gt;
sleep 5&lt;br /&gt;
&lt;br /&gt;
#Remplacer les caractères non apprecié&lt;br /&gt;
sed -i 's/&amp;amp;#39;/ /' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 'y/_àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ/ aceeeeiioouuACEEEEIIOOUU/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
## Adapter au format Tbook&lt;br /&gt;
sed -i 's#/SnomIPPhoneDirectory#/tbook#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/SnomIPPhoneDirectory/tbook complete=&amp;quot;true&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/DirectoryEntry#/item#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/DirectoryEntry/item context=&amp;quot;active&amp;quot; type=&amp;quot;colleagues&amp;quot;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Name&amp;gt;#/name&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Name&amp;gt;/name&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&lt;br /&gt;
sed -i 's#/Telephone&amp;gt;#/number&amp;gt;#' /var/www/html/phonebook/*&lt;br /&gt;
sed -i 's/Telephone&amp;gt;/number&amp;gt;/' /var/www/html/phonebook/*&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donner les droits d'exécution&lt;br /&gt;
 chmod +x /etc/phonebook/custom.sh&lt;br /&gt;
&lt;br /&gt;
==== Planifier l'exécution des scripts ====&lt;br /&gt;
Dans l'exemple ci-dessous les répertoires seront mis à jours toute les 5 minutes&lt;br /&gt;
 crontab -e&lt;br /&gt;
&lt;br /&gt;
# Télécharger les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/download.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Adapter les répertoires&lt;br /&gt;
*/5 * * * * sh /etc/phonebook/custom.sh  &amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
== Configuration des bornes snom ==&lt;br /&gt;
=== Méthode Manuel ===&lt;br /&gt;
Voici les paramètres à configurer sur la borne maitre afin que la borne à télécharger son annuaire toute les 5minutes&lt;br /&gt;
&lt;br /&gt;
Attention, si le provisionning est activé avec une configuration différente, les paramètres seront écrasés.&lt;br /&gt;
&lt;br /&gt;
PI: Le bouton &amp;quot;charger&amp;quot; permet de vider le répertoire actuel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-manuel.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Autoprovisionning Wazo ===&lt;br /&gt;
&lt;br /&gt;
La méthode &amp;quot;propre&amp;quot; est de créer une template custom pour la borne M900&lt;br /&gt;
&lt;br /&gt;
ci dessous un lien vers la documentation wazo:&lt;br /&gt;
&lt;br /&gt;
https://wazo-platform.org/documentation/overview/provisioning-admin.html&lt;br /&gt;
&lt;br /&gt;
Les champs nous intéressant sont:&lt;br /&gt;
en ligne 56 le type de repertoire (O = Local, 1 LDAP, 2 XML Server, 3 XML browser server)&lt;br /&gt;
 &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en ligne 57 l'adresse du serveur&lt;br /&gt;
 &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le nouveau fichier M900.tpl devra ressembler à celui la:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;settings&amp;gt;&lt;br /&gt;
    &amp;lt;phone-settings&amp;gt;&lt;br /&gt;
    {%- if vlan_enabled %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;{{ vlan_id }}&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;{{ vlan_priority|d('0') }}&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;vlan_id&amp;gt;&amp;lt;/vlan_id&amp;gt;&lt;br /&gt;
        &amp;lt;vlan_qos&amp;gt;&amp;lt;/vlan_qos&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;codec_tos&amp;gt;184&amp;lt;/codec_tos&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
        &amp;lt;signaling_tos&amp;gt;184&amp;lt;/signaling_tos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_username %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;{{ admin_username|e }}&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;http_user&amp;gt;guest&amp;lt;/http_user&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if admin_password %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;{{ admin_password|e }}&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;{{ admin_password|e }}&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;admin_mode_password&amp;gt;12345&amp;lt;/admin_mode_password&amp;gt;&lt;br /&gt;
        &amp;lt;http_pass&amp;gt;guest&amp;lt;/http_pass&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- if ntp_enabled %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;{{ ntp_ip }}&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- else %}&lt;br /&gt;
        &amp;lt;ntp_server&amp;gt;&amp;lt;/ntp_server&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {%- for server in XX_servers.values() %}&lt;br /&gt;
        &amp;lt;srv_sip_server_alias idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;Wazo {{ server['id'] }}&amp;lt;/srv_sip_server_alias&amp;gt;&lt;br /&gt;
        &amp;lt;user_host idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['proxy_ip'] }}&amp;lt;/user_host&amp;gt;&lt;br /&gt;
        &amp;lt;srv_srtp_auth idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;off&amp;lt;/srv_srtp_auth&amp;gt;&lt;br /&gt;
        &amp;lt;user_dtmf_info idx=&amp;quot;{{ server['id'] }}&amp;quot;&amp;gt;{{ server['dtmf_mode'] }}&amp;lt;/user_dtmf_info&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {%- for line_no, line in sip_lines.items() %}&lt;br /&gt;
        &amp;lt;user_active idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;on&amp;lt;/user_active&amp;gt;&lt;br /&gt;
        &amp;lt;user_name idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['username']|e }}&amp;lt;/user_name&amp;gt;&lt;br /&gt;
        &amp;lt;user_pname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['auth_username']|e }}&amp;lt;/user_pname&amp;gt;&lt;br /&gt;
        &amp;lt;user_pass idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['password']|e }}&amp;lt;/user_pass&amp;gt;&lt;br /&gt;
        &amp;lt;user_realname idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['display_name']|e }}&amp;lt;/user_realname&amp;gt;&lt;br /&gt;
        &amp;lt;user_mailbox idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['voicemail'] }}&amp;lt;/user_mailbox&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_hs_idx idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line_no }}&amp;lt;/subscr_sip_hs_idx&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_dect_ac_code idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ &amp;quot;{0:0&amp;gt;4}&amp;quot;.format(line_no) }}&amp;lt;/subscr_dect_ac_code&amp;gt;&lt;br /&gt;
        &amp;lt;subscr_sip_ua_data_server_id idx=&amp;quot;{{ line_no }}&amp;quot;&amp;gt;{{ line['XX_server_id'] }}&amp;lt;/subscr_sip_ua_data_server_id&amp;gt;&lt;br /&gt;
        &amp;lt;codec_priority_list idx=&amp;quot;{{ line_no }}&amp;quot; perm=&amp;quot;R&amp;quot;&amp;gt;pcma,pcmu,g722,g729,telephone-event&amp;lt;/codec_priority_list&amp;gt;&lt;br /&gt;
    {%- endfor %}&lt;br /&gt;
&lt;br /&gt;
    {% if XX_xivo_phonebook_url -%}&lt;br /&gt;
        &amp;lt;phonebook_server_location perm=&amp;quot;R&amp;quot;&amp;gt;0&amp;lt;/phonebook_server_location&amp;gt;&lt;br /&gt;
        &amp;lt;phonebook_location perm=&amp;quot;R&amp;quot;&amp;gt;https://phonebook.slemoal.fr/&amp;lt;/phonebook_location&amp;gt;&lt;br /&gt;
    {% endif -%}&lt;br /&gt;
&lt;br /&gt;
    {%- if XX_lang %}&lt;br /&gt;
        &amp;lt;language&amp;gt;{{ XX_lang[0] }}&amp;lt;/language&amp;gt;&lt;br /&gt;
        &amp;lt;web_language&amp;gt;{{ XX_lang[0] }}&amp;lt;/web_language&amp;gt;&lt;br /&gt;
        &amp;lt;tone_scheme&amp;gt;{{ XX_lang[1] }}&amp;lt;/tone_scheme&amp;gt;&lt;br /&gt;
    {%- endif %}&lt;br /&gt;
&lt;br /&gt;
    {% block settings_suffix %}{% endblock %}&lt;br /&gt;
    &amp;lt;/phone-settings&amp;gt;&lt;br /&gt;
&amp;lt;/settings&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois la borne autoprovisionner, vous devrez vous connecter sur la borne maitre et renseigner le nom du fichier xml (phonebook-nomduclient.xml)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:wazo-m900snom-auto.jpg]]&lt;/div&gt;</summary>
		<author><name>Slemoal</name></author>
		
	</entry>
</feed>