ajout d'un exemple de systeme d'autoconfiguration via http master
authorThomas NOEL <thomas@zep.(none)>
Wed, 5 Mar 2008 10:02:01 +0000 (10:02 +0000)
committerThomas NOEL <thomas@zep.(none)>
Wed, 5 Mar 2008 10:02:01 +0000 (10:02 +0000)
autoconfig/LISEZMOI.txt [new file with mode: 0644]
autoconfig/autoconfig.cgi [new file with mode: 0755]
autoconfig/configuration-00-09-45-ba-00-01 [new file with mode: 0644]
autoconfig/configuration-base [new file with mode: 0644]
autoconfig/micrologiciel [new symlink]
autoconfig/micrologiciel-00-09-45-ba-00-01 [new symlink]
autoconfig/micrologiciel-test [new symlink]

diff --git a/autoconfig/LISEZMOI.txt b/autoconfig/LISEZMOI.txt
new file mode 100644 (file)
index 0000000..6e624e4
--- /dev/null
@@ -0,0 +1,116 @@
+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
+
diff --git a/autoconfig/autoconfig.cgi b/autoconfig/autoconfig.cgi
new file mode 100755 (executable)
index 0000000..2df8c3e
--- /dev/null
@@ -0,0 +1,128 @@
+#!/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
diff --git a/autoconfig/configuration-00-09-45-ba-00-01 b/autoconfig/configuration-00-09-45-ba-00-01
new file mode 100644 (file)
index 0000000..b63dc01
--- /dev/null
@@ -0,0 +1,24 @@
+#\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
diff --git a/autoconfig/configuration-base b/autoconfig/configuration-base
new file mode 100644 (file)
index 0000000..b819794
--- /dev/null
@@ -0,0 +1,165 @@
+#\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
diff --git a/autoconfig/micrologiciel b/autoconfig/micrologiciel
new file mode 120000 (symlink)
index 0000000..b5fe7e3
--- /dev/null
@@ -0,0 +1 @@
+ipphone5-156-auf4.bin
\ No newline at end of file
diff --git a/autoconfig/micrologiciel-00-09-45-ba-00-01 b/autoconfig/micrologiciel-00-09-45-ba-00-01
new file mode 120000 (symlink)
index 0000000..9629c0a
--- /dev/null
@@ -0,0 +1 @@
+micrologiciel-test
\ No newline at end of file
diff --git a/autoconfig/micrologiciel-test b/autoconfig/micrologiciel-test
new file mode 120000 (symlink)
index 0000000..5aad899
--- /dev/null
@@ -0,0 +1 @@
+ipphone5-156-auf5.bin
\ No newline at end of file