From c43df6e751ad894541aea595c984f3788c31af5e Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Wed, 5 Mar 2008 10:02:01 +0000 Subject: [PATCH] ajout d'un exemple de systeme d'autoconfiguration via http --- autoconfig/LISEZMOI.txt | 116 +++++++++++++++++++ autoconfig/autoconfig.cgi | 128 +++++++++++++++++++++ autoconfig/configuration-00-09-45-ba-00-01 | 24 ++++ autoconfig/configuration-base | 165 ++++++++++++++++++++++++++++ autoconfig/micrologiciel | 1 + autoconfig/micrologiciel-00-09-45-ba-00-01 | 1 + autoconfig/micrologiciel-test | 1 + 7 files changed, 436 insertions(+) create mode 100644 autoconfig/LISEZMOI.txt create mode 100755 autoconfig/autoconfig.cgi create mode 100644 autoconfig/configuration-00-09-45-ba-00-01 create mode 100644 autoconfig/configuration-base create mode 120000 autoconfig/micrologiciel create mode 120000 autoconfig/micrologiciel-00-09-45-ba-00-01 create mode 120000 autoconfig/micrologiciel-test diff --git a/autoconfig/LISEZMOI.txt b/autoconfig/LISEZMOI.txt new file mode 100644 index 0000000..6e624e4 --- /dev/null +++ b/autoconfig/LISEZMOI.txt @@ -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 index 0000000..2df8c3e --- /dev/null +++ b/autoconfig/autoconfig.cgi @@ -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 index 0000000..b63dc01 --- /dev/null +++ b/autoconfig/configuration-00-09-45-ba-00-01 @@ -0,0 +1,24 @@ +# +# Configuration spécifique pour un poste +# +# NUMÉRO DE SÉRIE DE LA CONFIGURATION : doit être incrémenté à chaque +# modification +# +# Attention ! Laisser cette ligne en commentaire !! +# NUMERO_DE_SERIE:1 +# + +# NB : il faudrait mieux éviter d'envoyer les mots de passe via # ce script +# (données en clair et accessibles sans # mot de passe) + +# superpassword = 12345678 +# password = 1234 + +# phonenumber: numéro de téléphone de l'appareil (format 00paysnuméro) +phonenumber = 002211221 +# account : nom du compte IAX +account = thomas.noel +# pin : mot de passe du compte IAX +# pin = pasterrible + + diff --git a/autoconfig/configuration-base b/autoconfig/configuration-base new file mode 100644 index 0000000..b819794 --- /dev/null +++ b/autoconfig/configuration-base @@ -0,0 +1,165 @@ +# +# Configuration de base pour tous les postes +# +# Pour ajouter ou modifier des paramètres pour un poste, il faut créer un +# fichier configuration-xx-xx-xx-xx-xx-xx où xx-xx-xx-xx-xx-xx est l'adresse +# MAC du poste +# +# TODO : permettre des configuration-xx-xx (avec le début de l'adresse MAC) +# pour faire des groupes de téléphones classés par adresse MAC +# +# +# NUMÉRO DE SÉRIE DE LA CONFIGURATION : doit être incrémenté à chaque +# modification +# +# Attention ! Laisser cette ligne en commentaire !! +# NUMERO_DE_SERIE_BASE:1 +# +# Le numéro de série de la configuration pour un poste sera la somme du numéro +# de série indiqué ci-dessus et du numéro de série indiqué dans un éventuel +# fichier configuration-xx-xx-xx-xx-xx-xx +# +# + +# Paramètres protocoles IAX2 +############################# + +protocol = iax2 +service = 1 + +# serviceaddr : adresse du serveur IAX2 (asterisk) +serviceaddr = voip.sn.auf +registerttl = 300 +# phonenumber: numéro de téléphone de l'appareil (format 00paysnuméro) +phonenumber = 002211221 +# account : nom du compte IAX +account = thomas.noel +# pin : mot de passe du compte IAX +pin = zutdezut +localport = 4569 +# dmtf : 0=inband audio, 1=outband signal +dtmf = 1 +remotedialplan = 0 + + +# Paramètres système +##################### + +deviceattr = 1 +superpassword = 12345678 +password = 1234 + +## Mise à jour automatique au démarrage +# upgradetype : 0=disable, 1=all, 2=mac, 3=pppid, 4=account, 5=phonenumber +upgradetype = 2 +upgradeaddr = http://thomas-pc.sn.auf + +## Heure + +# sntpip : adresse IP du serveur NTP +sntpip = 213.154.65.66 +# timezone : fuseau horaire, voir l'interface web pour la liste complete +timezone = 26 +# daylight : suivre l'heure d'été (0/1) +daylight = 0 + +## Debug +# Laisser à "no check" sauf si vous savez ce que vous faites +# debug : 0=disable, 1=output, 2=output all, 3=remote debug, 4=no check +debug = 4 + + +# Paramètres réseau +#################### + +## Ethernet +# mac = 00-09-45-ba-00-01 +vlan = 0 +vlanid = 0 + +## IPv4 + +# iptype : type de configuration IP : 0=static, 1=dhcp, 2=pppoe, 3=modem + +# iptype=0 +# ip = 192.168.1.100 +# subnetmask = 255.255.255.0 +# router = 192.168.1.1 +# dns = 192.168.1.1 +# dns2 = 192.168.1.2 + +iptype=1 + +# iptype=2 +# pppid = +# ppppin = +# dns = 192.168.1.1 +# dns2 = 192.168.1.2 + +# iptype=3 +# pppid = +# ppppin = + + +# Paramètres audio +################### + +# codecs : 0=g729, 1=g7231, 2=g711u, 3=g711a, 4=gsm, 5=iLBDC, 6=null +codec1 = 2 +codec2 = 3 +codec3 = 4 +codec4 = 6 +codec5 = 6 +codec6 = 6 + +# Voice Activity Detection +vad = 1 +# Automatic Gain Control +agc = 0 +# Audio Echo Canceller +aec = 1 + +audioframes = 2 +jittersize = 0 + +# ilbcpayload : spécifique au codec ILBC +ilbcpayload = 97 +# 6.3k : haute résolution pour le codec g.723.1 (0/1) +6.3k = 1 + +## Volumes +# Combiné +handsetin = 7 +handsetout = 20 +# Mode mains libres +speakerin = 12 +speakerout = 20 + +## Sonnerie +# ringtype : 0=dtmf, 1=not disturb, 2=user define, 3=advanced +ringtype = 0 + +# Paramètres de numérotation +############################# + +# dialplan : 0=disable, 1=enable, 2=dialnum, 3=prefix, 4=hotline +dialplan = 0 +dialnumber = +dddcode = 10 +iddcode = +iddprefix = +dddprefix = +# innerline : 0=disable, 1=enable, 2=omit prefix +innerline = 0 +innerlineprefix = + +# très important : permet de recevoir un appel alors qu'on est déjà en communication +callwaiting = 1 +fwdnumber = +fwdpoweroff = 0 +fwdnoanswer = 0 +fwdalways = 0 +fwdbusy = 0 +answer = 30 +digitmap = 0 + diff --git a/autoconfig/micrologiciel b/autoconfig/micrologiciel new file mode 120000 index 0000000..b5fe7e3 --- /dev/null +++ b/autoconfig/micrologiciel @@ -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 index 0000000..9629c0a --- /dev/null +++ b/autoconfig/micrologiciel-00-09-45-ba-00-01 @@ -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 index 0000000..5aad899 --- /dev/null +++ b/autoconfig/micrologiciel-test @@ -0,0 +1 @@ +ipphone5-156-auf5.bin \ No newline at end of file -- 1.7.10.4