Pièce jointe « voip-1.8-import-configs.py »
Téléchargement 1 #! /usr/bin/env python
2 # -*- encoding: utf-8 -*-
3
4 """
5 Outil de configuration des comptes voip à partir du fichier généré par le script voip-1.4-export-comptes-utilisateurs.py.
6
7 Copyright : Agence universitaire de la Francophonie — www.auf.org
8 Licence : GNU General Public Licence, version 2
9 Auteur : Moussa NOMBRÉ
10 Date de création : 23 juillet 2012
11
12 """
13 import os
14 import os.path
15 import re
16 import sys
17 import time
18 import tarfile
19 import commands
20 import fileinput
21 import subprocess
22
23 def ecrire_entete():
24 """Ceci permet de re-écrire les entêtes fixes des fichiers de configuration"""
25
26 # sip.local
27 entete_sip = '''; /etc/asterisk/auf/sip.local est inclu par sip.conf
28 ;
29 ; Pour chaque utilisateur, faire une entree en adaptant le modele ci dessous
30 ;
31 ; NB: "Prenom NOM" doit faire au plus 16 caractères, uniquement en ASCII (pas d'accent) afin
32 ; de bien s'afficher sur le IP Phone 5 (ecran LCD de 16 caractères ASCII)
33 ; NB: <nnnnnn> est le numéro avec le préfixe international, uniquement des chiffres, sans espace
34 ; NB: mailbox=nnn@AUF doit être en conformité avec la référence du compte dans voicemail.local
35 ; NB: disallow & allow: liste les codecs possibles ; on peut changer cela pour certains clients
36 ;
37
38 ; Définition de quelques templates de configuration
39 ; pour rassembler les options communes à tous les comptes
40
41 [options-cummunes](!)
42 type=friend
43 context=AUF
44 host=dynamic
45 call-limit=10
46 disallow=all
47 allow=ulaw
48
49 [codecs-video](!)
50 allow=h264
51 allow=h263p
52 allow=h263
53 allow=h261
54
55 ; [prenom.nom](options-cummunes,codecs-video)
56 ; callerid="Prenom NOM" <nnnnnnn>
57 ; secret=motdepasse
58 ; mailbox=nnn@AUF
59
60 '''
61
62 f_sip.write(entete_sip)
63
64 # extensions.local
65 entete_exten = '''; /etc/asterisk/auf/extensions.local
66 ; Fichier inclu dans le contexte [AUF-local] de /etc/asterisk/extensions.conf
67 ;
68 ; Pour chaque utilisateur, faire une entree en modifiant "numero" et
69 ; "prenom.nom" (et RIEN d'autre) dans le modele ci dessous
70
71 ; Modele :
72 ; exten => numero,1,Macro(AUFDial,prenom.nom)
73 ; exten => numero,hint,SIP/prenom.nom&IAX2/prenom.nom
74 ; exten => prenom.nom,1,Macro(AUFDial,prenom.nom)
75 ; exten => prenom.nom,hint,SIP/prenom.nom&IAX2/prenom.nom
76 ;
77 ; Exemple :
78 ; exten => 206,1,Macro(AUFDial,thomas.noel)
79 ; exten => 206,hint,SIP/thomas.noel&IAX2/thomas.noel
80 ; exten => thomas.noel,1,Macro(AUFDial,thomas.noel)
81 ; exten => thomas.noel,hint,SIP/thomas.noel&IAX2/thomas.noel
82
83 ;;; exemple d'entrée pour la consultation de l'annuaire téléphonique
84 ;exten => 9,1,Set(CHANNEL(language)=fr)
85 ;exten => 9,n,Macro(AUFDirectory)
86
87 '''
88
89 f_exten.write(entete_exten)
90
91 # voicemail.local
92 entete_vm = '''; auf/voicemail.local : surcharge de /etc/asterisk/voicemail.conf
93 ;
94 ; Indiquez ici votre fuseau horaire local (voir la liste dans /usr/share/zoneinfo)
95 [zonemessages](+)
96 fuseaulocal = America/Montreal|'vm-received' Q 'digits/at' kM
97
98 ; Boites locales
99 [AUF]
100 language=fr
101 ;tz = fuseaulocal
102 ; Format : no_de_la_boite => mot_de_passe,Prenom Nom,prenom.nom@auf.org
103 ; * no_de_la_boite : prendre le numéro de telephone local de la personne
104 ; * le mot de passe doit être un nombre (par exemple 3 ou 4 chiffres)
105 ; * NB : en attendant qu'on trouve comment faire, mettre un "-" devant le mot
106 ; de passe pour indiquer qu'il n'est pas modifiable par l'utilisateur.
107 ; Exemple :
108 ; 206 => -0808,Thomas NOEL,thomas.noel@auf.org
109 ;
110
111
112 '''
113 f_vm.write(entete_vm)
114
115
116 def ecrire_extensions_local(ext,mb,nc):
117 """Configuration de /etc/asterisk/auf/extensions.local"""
118
119 compte_exten = '''
120
121 ; %s
122 exten => %s,1,Macro(AUFDial,%s)
123 exten => %s,hint,SIP/%s&IAX2/%s
124 exten => %s,1,Macro(AUFDial,%s)
125 exten => %s,hint,SIP/%s&IAX2/%s)''' % (nc,ext,ext,ext,ext,ext,mb,ext,mb,ext,ext)
126
127 f_exten.write(compte_exten)
128
129 def ecrire_sip_local(ext,mb,nc,mdps):
130 """Configuration de /etc/asterisk/auf/sip.local"""
131
132 compte_sip = '''
133
134 ; %s
135 [%s](options-cummunes,codecs-video)
136 callerid=\"%s\" <%s>
137 secret=%s
138 mailbox=%s@AUF''' % (nc,ext,nc,mb,mdps,mb)
139
140 f_sip.write(compte_sip)
141
142 def ecrire_voicemail_local(mb,ad,mdpvm,nc):
143 """Configuration de /etc/asterisk/auf/voicemail.local"""
144
145 compte_vm = '''
146 %s => -%s,%s,%s''' % (mb,mdpvm,nc,ad)
147
148 f_vm.write(compte_vm)
149
150
151 #***********************
152
153 if __name__ == '__main__':
154
155 # on s'assure d'être sur le bon serveur (Asterisk 1.8), sinon on quitte
156 version_asterisk = commands.getoutput("apt-cache policy asterisk | grep -i install")
157 if ":1.8" not in version_asterisk:
158 print '''Oups ... Etes-vous sûr d'être sur le bon serveur ?
159 Nous avons trouvé : Asterisk %s
160 Ce script doit être exécuté sur le nouveau serveur Asterisk (1.8) sous Wheezy !
161
162 .... Fin du script .....
163 ''' % version_asterisk
164 sys.exit(1)
165
166 # initialisation de quelques variables
167 RACINE_AUF = "/etc/asterisk/auf"
168 F_SIP_LOCAL = os.path.join(RACINE_AUF, "sip.local")
169 F_EXTENSIONS_LOCAL = os.path.join(RACINE_AUF, "extensions.local")
170 F_EXTENSIONS_GLOBAL = os.path.join(RACINE_AUF, "extensions-globals.local")
171 F_VOICEMAIL_LOCAL = os.path.join(RACINE_AUF, "voicemail.local")
172 DOSSIER_MIGRATION = "/usr/local/asterisk-migration"
173 DOSSIER_CLES = "/usr/share/asterisk/keys"
174
175 # On crée le dossier de migration
176 if not os.path.isdir(DOSSIER_MIGRATION):
177 os.makedirs(DOSSIER_MIGRATION, 0755)
178
179 # on attend en argument le chemin complet du fichier voip-migration-config.tar.gz généré par le script voip-1.4-export-comptes-utilisateurs.py.
180 if len(sys.argv) != 2:
181 print >>sys.stderr, "Usage : %s <chemin-absolu-de-larchive-venant-de-asterisk1.4>" % sys.argv[0]
182 print >>sys.stderr, "Par exemple : %s /home/mnombre/voip-migration-config.tar.gz" % sys.argv[0]
183 sys.exit(1)
184 else:
185 # Assurons-nous que le fichier existe (le chemin peut ne pas être bon, ou autre chose)
186 try:
187 # on ouvre l'archive pour récupérer ...
188 tar = tarfile.open(sys.argv[1], "r:gz")
189 tar.extractall(DOSSIER_MIGRATION)
190 # ... le fichier des comptes
191 F_COMPTES = os.path.join(os.path.join(DOSSIER_MIGRATION, "usr/local/asterisk-migration"), "comptes-voip.txt")
192 # ... la clé privée
193 os.chdir(os.path.join(DOSSIER_MIGRATION, DOSSIER_CLES.strip('/')))
194 for fichier in os.listdir("."):
195 if fichier.endswith(".key"):
196 F_PRIVATE_KEY = os.path.join(os.path.join(DOSSIER_MIGRATION, DOSSIER_CLES.strip('/')), fichier)
197 NOM_CLE = fichier
198 tar.close()
199 except IOError as e:
200 #print("({})".format(e))
201 print >>sys.stderr, "[Erreur code 19] : le fichier %s n'a pas été trouvé ... script interrompu" % F_COMPTES
202 sys.exit(1)
203
204 # on récupère les comptes
205 f_comptes = open(F_COMPTES, 'r')
206 comptes = f_comptes.readlines()[1:]
207 f_comptes.close
208
209 print '''......... Configuration locale des comptes voip ........'''
210
211 # Ouverture des fichiers en écriture
212 f_sip = open(os.path.join(RACINE_AUF, F_SIP_LOCAL), 'w')
213 f_exten = open(os.path.join(RACINE_AUF, F_EXTENSIONS_LOCAL), 'w')
214 f_vm = open(os.path.join(RACINE_AUF, F_VOICEMAIL_LOCAL), 'w')
215
216 # on écrit les entêtes
217 ecrire_entete()
218
219 # on configure les comptes
220 nombre_compte = 0
221 for objet in comptes:
222 extension, mot_de_passe_sip, boite_vocale, mot_de_passe_voicemail, courriel, nom_complet = objet.split(":")
223 nom_complet = nom_complet.strip()
224 print "Traitement du compte %s ..." % extension
225 time.sleep(0.25)
226 nombre_compte += 1
227 ecrire_extensions_local(extension,boite_vocale,nom_complet)
228 ecrire_sip_local(extension,boite_vocale,nom_complet,mot_de_passe_sip)
229 ecrire_voicemail_local(boite_vocale,courriel,mot_de_passe_voicemail,nom_complet)
230
231 print '''........... OK'''
232
233 # Ne pas oublier de refermer les fichiers
234 f_vm.close()
235 f_exten.close()
236 f_sip.close()
237
238 print '''\n........ Récupération de la clé privée asterisk ........'''
239 # importation de la clé privée
240 os.rename(F_PRIVATE_KEY, os.path.join(DOSSIER_CLES, NOM_CLE))
241
242 time.sleep(0.25)
243 print '''........... OK\n'''
244
245 # Relancer asterisk-config-auf pour paramètrer le nom du site
246 subprocess.call(["dpkg-reconfigure", "-plow", "asterisk-config-auf"])
247
248 time.sleep(0.25)
249
250 print '''\n\n*********************************************************************************
251 Configuration terminée : %s comptes traités et clé privée %s transférée
252 *********************************************************************************''' % (nombre_compte,NOM_CLE)
Fichiers joints
Pour vous référer aux pièces jointes d'une page, utilisez attachment:filename, comme indiqué ci-dessous dans la liste de fichiers. N'utilisez pas l'URL du lien [get], car elle peut changer et donc être facilement cassée.Vous n'êtes pas autorisé à joindre un fichier à cette page.