ajout d'un exemple de systeme d'autoconfiguration via http
[ipphone-tools.git] / autoconfig / autoconfig.cgi
1 #!/bin/bash
2
3 # réagit en fonction de "QUERY_STRING" : 
4 # set=xx-xx-xx-xx-xx-xx   renvoie un fichier .set
5 # cfg=xx-xx-xx-xx-xx-xx   renvoie le fichier de config
6
7 BASEMICROLOGICIEL=micrologiciel
8 BASECONFIGURATION=configuration
9
10 # fin de la configuration
11
12 TAILLEMICROLOGICIEL=983040
13
14 PROGRAMME="${0##*/}"
15 erreur () {
16         echo "${PROGRAMME}: ERREUR: $@" 1>&2
17         exit 1
18 }
19
20 TEMPFILE="$(tempfile)"
21 trap "rm \"$TEMPFILE\"" 0 1 15
22
23 # analyse de QUERY_STRING : type de requete, adresse mac
24 TYPE=`expr match "$QUERY_STRING" '\([[:alpha:]]\+\)='`
25 MAC=`expr match "$QUERY_STRING" '.*=\([[:xdigit:]-]\{17\}\)' | tr A-F a-f`
26 # echo type=$TYPE mac=$MAC
27 # env
28
29 version_micrologiciel () {
30         # entrée : un nom de fichier micrologiciel
31         #          au format ...-${version_auteur}-auf${version_auf}...
32         # sortie : le numéro de version au standard AuF
33         version_auteur=`expr match "$1" '.*-\([0-9]\+\)-'`
34         [ ${#version_auteur} != 3 ] && return 1
35         version_auf=`expr match "$1" '.*-auf\([0-9]\+\)'`
36         [ ${#version_auf} = 1 ] && version_auf="0${version_auf}"
37         [ ${#version_auf} != 2 ] && return 1
38         echo "${version_auteur}${version_auf}"
39         return 0
40 }
41
42 micrologiciel () {
43         # on cherche d'abord un micrologiciel pour l'adresse MAC donnée
44         # (permet de proposer un micrologiciel spécifique par poste)
45         MICROLOGICIEL="${BASEMICROLOGICIEL}-${1}"
46         while [ -L "${MICROLOGICIEL}" ]
47         do
48                 MICROLOGICIEL=`readlink "${MICROLOGICIEL}"`
49         done
50         # s'il n'y a pas de micrologiciel spécifique, on prend celui par défaut
51         if [ ! -e "${MICROLOGICIEL}" ]
52         then
53                 MICROLOGICIEL="${BASEMICROLOGICIEL}"
54                 while [ -L "${MICROLOGICIEL}" ]
55                 do
56                         MICROLOGICIEL=`readlink "${MICROLOGICIEL}"`
57                 done
58         fi
59         if [ ! -e "${MICROLOGICIEL}" ]
60         then
61                 erreur "fichier de micrologiciel '${MICROLOGICIEL}' inexistant"
62                 return 1
63         fi
64         # la version du micrologiciel
65         VERSION=`version_micrologiciel "${MICROLOGICIEL}"`
66         if [ $? != 0 ]
67         then
68                 erreur "pas de version pour le micrologiciel '${MICROLOGICIEL}'"
69                 return 1
70         fi
71         TAILLE=`stat -c %s "${MICROLOGICIEL}"`
72         if [ "$TAILLE" != "$TAILLEMICROLOGICIEL" ]
73         then
74                 erreur "taille du micrologiciel '${MICROLOGICIEL}' incorrecte"
75                 return 1
76         fi
77         echo "BIN ${MICROLOGICIEL}:${VERSION}"
78         return 0
79 }
80
81 noserieconfig () {
82         # reçoit en argument l'adresse MAC du poste
83         # renvoie le numéro de série = numéro de série pour la config de base
84         # + numéro de série de la configuration du poste (si elle existe)
85         NOBASE=`sed 's/^.*NUMERO_DE_SERIE_BASE: *\([0-9]*\).*$/\1/p;d' ${BASECONFIGURATION}-base 2> /dev/null`
86         NOPOSTE=`sed 's/^.*NUMERO_DE_SERIE: *\([0-9]*\).*$/\1/p;d' ${BASECONFIGURATION}-${1} 2> /dev/null`
87         expr ${NOBASE:-0} + ${NOPOSTE:-0}
88 }
89
90 configuration () {
91         # reçoit en argument l'adresse MAC du poste
92         # renvoie simplement la concaténation fichier de base + fichier du poste
93         echo "[SETTING]"
94         sed '/^#/d;/^[[:space:]]*$/d' "${BASECONFIGURATION}-base" 2> /dev/null
95         sed '/^#/d;/^[[:space:]]*$/d' "${BASECONFIGURATION}-${1}" 2> /dev/null
96         echo "[END]"
97 }
98
99 sendfile () {
100         #echo "Connection: close"
101         echo "Content-Length: $(stat -c %s "$1")"
102         echo "Content-Type: text/plain"
103         echo ""
104         cat "$1"
105 }
106
107 case $TYPE in
108         set)
109                 # on renvoie le micrologiciel
110                 micrologiciel $MAC >> "$TEMPFILE"
111                 # puis la configuration : lien vers un appel à ce script avec
112                 # QUERY_STRING=cfg suivi du numéro de version 
113                 echo -n "CFG ${MAC}.cfg:" >> "$TEMPFILE"
114                 noserieconfig $MAC >> "$TEMPFILE"
115                 echo "END" >> "$TEMPFILE"
116                 sendfile "$TEMPFILE"
117                 exit 0
118                 ;;
119         cfg)
120                 configuration $MAC >> "$TEMPFILE"
121                 sendfile "$TEMPFILE"
122                 exit 0
123                 ;;
124         *)      
125                 erreur "type de requête non géré : '$TYPE'"
126                 exit 1
127                 ;;
128 esac