--- /dev/null
+Système d'autoconfiguration des IP Phone 5 AUF
+
+NB : ceci est un _prototype_ largement améliorable, voir le TODO à la fin de ce
+document.
+
+Rappel sur le fonctionnement de l'autoprovisioning sur les IP Phone 5 :
+=======================================================================
+1. on configure le téléphone en mode autoconfig avec
+ type de mise à jour = MAC
+ adresse de mise à jour = http://nom.du.serveur
+2. lorsque le téléphone démarre, il cherche le fichier
+ http://nom.du.serveur/xx-xx-xx-xx-xx-xx.set où xx-xx-xx-xx-xx-xx
+ est son adresse MAC. Ce fichier contient entre autre deux lignes :
+ BIN firmware:version_f
+ CFG config:version_c
+ avec :
+ firmware = le fichier binaire du micrologiciel du téléphone
+ version_f = le numéro de version du micrologiciel, sur 5 chiffres
+ config = le fichier de configuration du téléphone (fichier texte)
+ version_c = le numéro de version de la configuration
+3. Si le numéro de version du micrologiciel est supérieur à la version
+ actuellement présente dans le téléphone, celui-ci télécharge le
+ fichier binaire (http://nom.du.serveur/firmware) et redémarre dessus.
+4. Si la version de la configuration est supérieure à la version actuelle le
+ téléphone télécharge le fichier http://nom.du.serveur/config, met à jour
+ sa configuration avec les nouvelles données puis redémarre.
+
+
+Principe du système proposé ici :
+=================================
+Il s'agit d'un script CGI qui sait générer les fichiers .set et .cfg en
+fonction du dernier micrologiciel et de la dernière configuration présents dans
+le répertoire.
+
+
+Télécharger le logiciel :
+=========================
+Il est pour l'instant disponible uniquement via Subversion. Si vous ne l'avez
+pas déjà fait, installez "subversion" sur votre poste de travail (ou même sur
+le serveur cible) avec "aptitude install subversion"
+
+Puis téléchargez le répertoire avec :
+ svn co http://trac.sn.auf.org/svn/ipphone/autoconfig
+
+Ça vous créera un répertoire "autoconfig" contenant le script, entre autre.
+Faites alors l'installation en copiant les fichiers depuis ce répertoire (voir
+ci-dessous). Si une nouvelle version du script est disponible, il vous suffira
+de revenir dans ce répertoire source et de taper "svn update" pour l'obtenir.
+
+
+Installation :
+==============
+1. créer un répertoire où seront placés le script CGI et les fichiers
+ micrologiciels et configuration (/srv/www/voip-autoconfig dans la suite de ce
+ document)
+2. monter un serveur Web (éventuellement un VirtualHost) avec les ré-écritures
+ suivantes :
+ RewriteEngine on
+ RewriteRule ^/([0-9a-f-]{17}).(set|cfg) /autoconfig?$2=$1 [passthrough]
+ ScriptAlias /autoconfig /srv/www/voip-autoconfig/autoconfig.cgi
+3. placer un micrologiciel dans le répertoire, avec un nom au format
+ ipphone5-VVV-aufNN.bin, avec VVV le numéro de version du micrologiciel sur
+ 3 chiffres et NN le numéro de sous-version spécifique AuF
+3a. faire un lien dessus avec le nom "micrologiciel" pour que ce soit celui
+ utilisé par défaut
+3b. faire un lien dessus avec le nom "micrologiciel-xx-xx-xx-xx-xx-xx" si vous
+ voulez qu'un téléphone spécifique l'utilise
+4. placer un fichier "configuration-base" contenant les données de configuration
+ générales à tous les téléphones. Penser à modifier le numéro de série
+ en cas de mise à jour (NUMERO_DE_SERIE_BASE:NNN)
+5. Si besoin, écrire un fichier configuration-xx-xx-xx-xx-xx-xx pour
+ chaque téléphone IP
+
+Déploiement d'un téléphone :
+============================
+1. configurer le téléphone en mode "autoprovisioning" (type de mise à jour = MAC
+ et adresse de mise à jour = http://nom.du.serveur au niveau de l'interface
+ web de configuration de l'IP Phone)
+2. afin d'éviter d'avoir à envoyer des données confidentielles en clair via le
+ script, indiquez le nom d'utilisateur et les différents mots de passe
+ directement au niveau de l'interface web du téléphone (et non pas dans
+ le fichier de configuration dédié au téléphone)
+3. rebooter le téléphone, il doit se mettre à jour. C'est tout.
+
+Utilisation avancée :
+====================
+- Préférez utiliser des liens symboliques pour le micrologiciel, par exemple:
+ micrologiciel-stable -> ipphone5-156-auf4.bin
+ micrologiciel-test -> ipphone5-156-auf5.bin
+- Pour proposer un micrologiciel spécifique à un téléphone :
+ micrologiciel-00-09-45-ba-00-01 -> micrologiciel-test
+
+
+En cas de soucis :
+==================
+- Regardez les logs apache
+- Faites des wget pour voir ce qui se passe
+- rappel : ce script CGI est une proposition, un prototype. S'il plante,
+ demandez de l'aide sur la liste technique de l'AUF ;)
+
+TODO :
+======
+- vérifier que l'IP qui fait les requêtes correspond bien à l'adresse MAC,
+ ça serait le minimum de sécurité acceptable si on transmet des mots de
+ passe dans les configurations
+- permettre des configurations "groupes" via des configuration-xx-xx
+ où "xx-xx" est le début de l'adresse MAC (xx, xx-xx, xx-xx-xx, etc)
+- adapter pour les autres types de mise à jour (IP, username, etc.)
+- virer les bachismes (marche pas avec dash qui sera le shell par
+ défaut dans Etch je crois) => fait
+- packager en .deb
+- trouver le moyen de connaitre le numéro de version de la configuration
+ actuellement stockée dans un IP phone 5 (affichage sur l'écran
+ lors du boot ?) => plutôt supprimer le mot "VoIP" de l'affichage lors de
+ l'appui sur [Local IP] et ajouter la version de la config' en fin de ligne
+
--- /dev/null
+#!/bin/bash
+
+# réagit en fonction de "QUERY_STRING" :
+# set=xx-xx-xx-xx-xx-xx renvoie un fichier .set
+# cfg=xx-xx-xx-xx-xx-xx renvoie le fichier de config
+
+BASEMICROLOGICIEL=micrologiciel
+BASECONFIGURATION=configuration
+
+# fin de la configuration
+
+TAILLEMICROLOGICIEL=983040
+
+PROGRAMME="${0##*/}"
+erreur () {
+ echo "${PROGRAMME}: ERREUR: $@" 1>&2
+ exit 1
+}
+
+TEMPFILE="$(tempfile)"
+trap "rm \"$TEMPFILE\"" 0 1 15
+
+# analyse de QUERY_STRING : type de requete, adresse mac
+TYPE=`expr match "$QUERY_STRING" '\([[:alpha:]]\+\)='`
+MAC=`expr match "$QUERY_STRING" '.*=\([[:xdigit:]-]\{17\}\)' | tr A-F a-f`
+# echo type=$TYPE mac=$MAC
+# env
+
+version_micrologiciel () {
+ # entrée : un nom de fichier micrologiciel
+ # au format ...-${version_auteur}-auf${version_auf}...
+ # sortie : le numéro de version au standard AuF
+ version_auteur=`expr match "$1" '.*-\([0-9]\+\)-'`
+ [ ${#version_auteur} != 3 ] && return 1
+ version_auf=`expr match "$1" '.*-auf\([0-9]\+\)'`
+ [ ${#version_auf} = 1 ] && version_auf="0${version_auf}"
+ [ ${#version_auf} != 2 ] && return 1
+ echo "${version_auteur}${version_auf}"
+ return 0
+}
+
+micrologiciel () {
+ # on cherche d'abord un micrologiciel pour l'adresse MAC donnée
+ # (permet de proposer un micrologiciel spécifique par poste)
+ MICROLOGICIEL="${BASEMICROLOGICIEL}-${1}"
+ while [ -L "${MICROLOGICIEL}" ]
+ do
+ MICROLOGICIEL=`readlink "${MICROLOGICIEL}"`
+ done
+ # s'il n'y a pas de micrologiciel spécifique, on prend celui par défaut
+ if [ ! -e "${MICROLOGICIEL}" ]
+ then
+ MICROLOGICIEL="${BASEMICROLOGICIEL}"
+ while [ -L "${MICROLOGICIEL}" ]
+ do
+ MICROLOGICIEL=`readlink "${MICROLOGICIEL}"`
+ done
+ fi
+ if [ ! -e "${MICROLOGICIEL}" ]
+ then
+ erreur "fichier de micrologiciel '${MICROLOGICIEL}' inexistant"
+ return 1
+ fi
+ # la version du micrologiciel
+ VERSION=`version_micrologiciel "${MICROLOGICIEL}"`
+ if [ $? != 0 ]
+ then
+ erreur "pas de version pour le micrologiciel '${MICROLOGICIEL}'"
+ return 1
+ fi
+ TAILLE=`stat -c %s "${MICROLOGICIEL}"`
+ if [ "$TAILLE" != "$TAILLEMICROLOGICIEL" ]
+ then
+ erreur "taille du micrologiciel '${MICROLOGICIEL}' incorrecte"
+ return 1
+ fi
+ echo "BIN ${MICROLOGICIEL}:${VERSION}"
+ return 0
+}
+
+noserieconfig () {
+ # reçoit en argument l'adresse MAC du poste
+ # renvoie le numéro de série = numéro de série pour la config de base
+ # + numéro de série de la configuration du poste (si elle existe)
+ NOBASE=`sed 's/^.*NUMERO_DE_SERIE_BASE: *\([0-9]*\).*$/\1/p;d' ${BASECONFIGURATION}-base 2> /dev/null`
+ NOPOSTE=`sed 's/^.*NUMERO_DE_SERIE: *\([0-9]*\).*$/\1/p;d' ${BASECONFIGURATION}-${1} 2> /dev/null`
+ expr ${NOBASE:-0} + ${NOPOSTE:-0}
+}
+
+configuration () {
+ # reçoit en argument l'adresse MAC du poste
+ # renvoie simplement la concaténation fichier de base + fichier du poste
+ echo "[SETTING]"
+ sed '/^#/d;/^[[:space:]]*$/d' "${BASECONFIGURATION}-base" 2> /dev/null
+ sed '/^#/d;/^[[:space:]]*$/d' "${BASECONFIGURATION}-${1}" 2> /dev/null
+ echo "[END]"
+}
+
+sendfile () {
+ #echo "Connection: close"
+ echo "Content-Length: $(stat -c %s "$1")"
+ echo "Content-Type: text/plain"
+ echo ""
+ cat "$1"
+}
+
+case $TYPE in
+ set)
+ # on renvoie le micrologiciel
+ micrologiciel $MAC >> "$TEMPFILE"
+ # puis la configuration : lien vers un appel à ce script avec
+ # QUERY_STRING=cfg suivi du numéro de version
+ echo -n "CFG ${MAC}.cfg:" >> "$TEMPFILE"
+ noserieconfig $MAC >> "$TEMPFILE"
+ echo "END" >> "$TEMPFILE"
+ sendfile "$TEMPFILE"
+ exit 0
+ ;;
+ cfg)
+ configuration $MAC >> "$TEMPFILE"
+ sendfile "$TEMPFILE"
+ exit 0
+ ;;
+ *)
+ erreur "type de requête non géré : '$TYPE'"
+ exit 1
+ ;;
+esac
--- /dev/null
+#\r
+# Configuration spécifique pour un poste\r
+#\r
+# NUMÉRO DE SÉRIE DE LA CONFIGURATION : doit être incrémenté à chaque\r
+# modification\r
+#\r
+# Attention ! Laisser cette ligne en commentaire !!\r
+# NUMERO_DE_SERIE:1\r
+#\r
+\r
+# NB : il faudrait mieux éviter d'envoyer les mots de passe via # ce script\r
+# (données en clair et accessibles sans # mot de passe)\r
+\r
+# superpassword = 12345678\r
+# password = 1234\r
+\r
+# phonenumber: numéro de téléphone de l'appareil (format 00paysnuméro)\r
+phonenumber = 002211221\r
+# account : nom du compte IAX\r
+account = thomas.noel\r
+# pin : mot de passe du compte IAX\r
+# pin = pasterrible\r
+\r
+\r
--- /dev/null
+#\r
+# Configuration de base pour tous les postes\r
+#\r
+# Pour ajouter ou modifier des paramètres pour un poste, il faut créer un\r
+# fichier configuration-xx-xx-xx-xx-xx-xx où xx-xx-xx-xx-xx-xx est l'adresse\r
+# MAC du poste\r
+#\r
+# TODO : permettre des configuration-xx-xx (avec le début de l'adresse MAC)\r
+# pour faire des groupes de téléphones classés par adresse MAC\r
+#\r
+#\r
+# NUMÉRO DE SÉRIE DE LA CONFIGURATION : doit être incrémenté à chaque\r
+# modification\r
+#\r
+# Attention ! Laisser cette ligne en commentaire !!\r
+# NUMERO_DE_SERIE_BASE:1\r
+#\r
+# Le numéro de série de la configuration pour un poste sera la somme du numéro\r
+# de série indiqué ci-dessus et du numéro de série indiqué dans un éventuel\r
+# fichier configuration-xx-xx-xx-xx-xx-xx\r
+#\r
+#\r
+\r
+# Paramètres protocoles IAX2\r
+#############################\r
+\r
+protocol = iax2\r
+service = 1\r
+\r
+# serviceaddr : adresse du serveur IAX2 (asterisk)\r
+serviceaddr = voip.sn.auf\r
+registerttl = 300\r
+# phonenumber: numéro de téléphone de l'appareil (format 00paysnuméro)\r
+phonenumber = 002211221\r
+# account : nom du compte IAX\r
+account = thomas.noel\r
+# pin : mot de passe du compte IAX\r
+pin = zutdezut\r
+localport = 4569\r
+# dmtf : 0=inband audio, 1=outband signal\r
+dtmf = 1\r
+remotedialplan = 0\r
+\r
+\r
+# Paramètres système\r
+#####################\r
+\r
+deviceattr = 1\r
+superpassword = 12345678\r
+password = 1234\r
+\r
+## Mise à jour automatique au démarrage\r
+# upgradetype : 0=disable, 1=all, 2=mac, 3=pppid, 4=account, 5=phonenumber\r
+upgradetype = 2\r
+upgradeaddr = http://thomas-pc.sn.auf\r
+\r
+## Heure\r
+\r
+# sntpip : adresse IP du serveur NTP\r
+sntpip = 213.154.65.66\r
+# timezone : fuseau horaire, voir l'interface web pour la liste complete\r
+timezone = 26\r
+# daylight : suivre l'heure d'été (0/1)\r
+daylight = 0\r
+\r
+## Debug\r
+# Laisser à "no check" sauf si vous savez ce que vous faites\r
+# debug : 0=disable, 1=output, 2=output all, 3=remote debug, 4=no check\r
+debug = 4\r
+\r
+\r
+# Paramètres réseau\r
+####################\r
+\r
+## Ethernet\r
+# mac = 00-09-45-ba-00-01\r
+vlan = 0\r
+vlanid = 0\r
+\r
+## IPv4\r
+\r
+# iptype : type de configuration IP : 0=static, 1=dhcp, 2=pppoe, 3=modem\r
+\r
+# iptype=0\r
+# ip = 192.168.1.100\r
+# subnetmask = 255.255.255.0\r
+# router = 192.168.1.1\r
+# dns = 192.168.1.1\r
+# dns2 = 192.168.1.2\r
+\r
+iptype=1\r
+\r
+# iptype=2\r
+# pppid = \r
+# ppppin = \r
+# dns = 192.168.1.1\r
+# dns2 = 192.168.1.2\r
+\r
+# iptype=3\r
+# pppid = \r
+# ppppin = \r
+\r
+\r
+# Paramètres audio\r
+###################\r
+\r
+# codecs : 0=g729, 1=g7231, 2=g711u, 3=g711a, 4=gsm, 5=iLBDC, 6=null\r
+codec1 = 2\r
+codec2 = 3\r
+codec3 = 4\r
+codec4 = 6\r
+codec5 = 6\r
+codec6 = 6\r
+\r
+# Voice Activity Detection\r
+vad = 1\r
+# Automatic Gain Control\r
+agc = 0\r
+# Audio Echo Canceller\r
+aec = 1\r
+\r
+audioframes = 2\r
+jittersize = 0\r
+\r
+# ilbcpayload : spécifique au codec ILBC\r
+ilbcpayload = 97\r
+# 6.3k : haute résolution pour le codec g.723.1 (0/1)\r
+6.3k = 1\r
+\r
+## Volumes\r
+# Combiné\r
+handsetin = 7\r
+handsetout = 20\r
+# Mode mains libres\r
+speakerin = 12\r
+speakerout = 20\r
+\r
+## Sonnerie\r
+# ringtype : 0=dtmf, 1=not disturb, 2=user define, 3=advanced\r
+ringtype = 0\r
+\r
+# Paramètres de numérotation\r
+#############################\r
+\r
+# dialplan : 0=disable, 1=enable, 2=dialnum, 3=prefix, 4=hotline\r
+dialplan = 0\r
+dialnumber = \r
+dddcode = 10\r
+iddcode = \r
+iddprefix = \r
+dddprefix = \r
+# innerline : 0=disable, 1=enable, 2=omit prefix\r
+innerline = 0\r
+innerlineprefix = \r
+\r
+# très important : permet de recevoir un appel alors qu'on est déjà en communication \r
+callwaiting = 1\r
+fwdnumber = \r
+fwdpoweroff = 0\r
+fwdnoanswer = 0\r
+fwdalways = 0\r
+fwdbusy = 0\r
+answer = 30\r
+digitmap = 0\r
+\r
--- /dev/null
+ipphone5-156-auf4.bin
\ No newline at end of file
--- /dev/null
+micrologiciel-test
\ No newline at end of file
--- /dev/null
+ipphone5-156-auf5.bin
\ No newline at end of file