Pièce jointe « voip-1.4-export-configs.py »
Téléchargement 1 #! /usr/bin/env python
2 # -*- encoding: utf-8 -*-
3
4 """
5 Outil d'extraction des comptes voip depuis les fichiers de configuration Asterisk.
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 : 17 juillet 2012
11 Revisé par : Jean Christophe ANDRÉ @octobre2012
12
13 """
14 import os
15 import os.path
16 import sys
17 import re
18 import time
19 import tarfile
20 import commands
21 import subprocess
22
23 # quelques variables
24 RACINE_AUF = "/etc/asterisk/auf"
25 SIP_LOCAL = os.path.join(RACINE_AUF, "sip.local")
26 VOICEMAIL_LOCAL = os.path.join(RACINE_AUF, "voicemail.local")
27 DOSSIER_MIGRATION = "/usr/local/asterisk-migration"
28 COMPTES_VOIP = os.path.join(DOSSIER_MIGRATION, "comptes-voip.txt")
29 DOSSIER_DES_CLES = "/usr/share/asterisk/keys/"
30 CONFIG_ARCHIVEE = os.path.join(DOSSIER_MIGRATION, "voip-migration-config.tar.gz")
31 COMPTES_SIP = {}
32 COMPTES_VM = {}
33
34 def reformat_sip_local():
35 """Extraction et reformatage des données du sip.local"""
36 cle = ""
37 compte_courant = {}
38 try:
39 donnees_sip = open(SIP_LOCAL,'r')
40 except IOError:
41 print >>sys.stderr, "[Erreur code 19] : ATTENTION, le fichier %s n'a pas été trouvé. Si vous l'avez nommé autrement, veuillez modifier le script en conséquence ... arrêt de l'exécution du script ... terminé" % SIP_LOCAL
42 sys.exit(1)
43
44 for l in donnees_sip:
45 l = l.strip()
46 # on saute les lignes en commentaire
47 if l.startswith(';'): continue
48 # on traite les autres lignes
49 if l.startswith('['):
50 if cle and compte_courant:
51 COMPTES_SIP[cle] = compte_courant
52 compte_courant = {}
53 cle = l[1:-1]
54 elif '=' in l and not l.startswith(';'):
55 var,val = l.split('=',1)
56 compte_courant[var.strip()] = val.strip()
57 if compte_courant:
58 COMPTES_SIP[cle] = compte_courant
59 #print COMPTES_SIP
60
61 def reformat_vm_local():
62
63 """Extraction et reformatage des données du voicemail.local"""
64
65 try:
66 donnees_vm = open(VOICEMAIL_LOCAL,'r')
67 except IOError:
68 print >>sys.stderr, "[Erreur code 19] : ATTENTION, le fichier %s n'a pas été trouvé. Si vous l'avez nommé autrement, veuillez modifier le script en conséquence ... arrêt de l'exécution du script ... terminé" % VOICEMAIL_LOCAL
69 sys.exit(1)
70
71 for l in donnees_vm:
72 l = l.strip()
73 if '=>' in l and not l.startswith(';'):
74 exten,info = l.split('=>',1)
75 exten = exten.strip()
76 secret,nom,adel = info.split(',')
77 secret = secret.strip().lstrip('-')
78 nom = nom.strip()
79 adel = adel.strip()
80 COMPTES_VM[exten] = {
81 'secret' : secret,
82 'nom' : nom,
83 'adel' : adel,
84 }
85 #print COMPTES_VM
86
87
88
89 if __name__ == '__main__':
90
91 # on s'assure d'être sur le bon serveur (Asterisk 1.4), sinon on quitte
92 version_asterisk = commands.getoutput("apt-cache policy asterisk | grep -i install")
93 if ":1.4" not in version_asterisk:
94 print '''Oups ... Etes-vous sûr d'être sur le bon serveur ?
95 Nous avons trouvé : Asterisk %s
96 Ce script doit être exécuté sur l'ancien serveur Asterisk (1.4) !
97
98 .... Fin du script .....
99 ''' % version_asterisk
100 sys.exit(1)
101
102 # On crée le dossier de migration
103 if not os.path.isdir(DOSSIER_MIGRATION):
104 os.makedirs(DOSSIER_MIGRATION, 0755)
105
106 # on reformate et récupère toutes les données du sip.local et du voicemail.local
107 reformat_sip_local()
108 reformat_vm_local()
109
110 f_comptes = open(COMPTES_VOIP, 'w')
111 f_comptes.write(";extension:mot-de-passe-sip:boite_vocale:mot-de-passe-voicemail:courriel:nom-complet\n")
112
113 print '''*********************************************************************************
114 Extraction des comptes existants
115 *********************************************************************************'''
116
117 nombre_compte = 0
118
119 for cle in COMPTES_SIP:
120 # extension et mot de passe SIP proviennent du sip.local
121 extension = cle
122 mdp_sip = COMPTES_SIP[cle]['secret']
123
124 # on va chercher les autres données dans les données voicemail
125 # si on tombre sur un compte particulier, par ex. pas de 'mailbox', on arrête tout
126 try:
127 boite_vocale,junk = COMPTES_SIP[cle]['mailbox'].split('@',1)
128 mdp_vm = COMPTES_VM[boite_vocale]['secret']
129 adel = COMPTES_VM[boite_vocale]['adel']
130 nom_complet = COMPTES_VM[boite_vocale]['nom']
131 except KeyError:
132 print >>sys.stderr, '''\n\n[Erreur code 19] : ATTENTION ATTENTION ATTENTION
133
134 Il manque à l'extension '%s' l'un des paramètres suivants : mailbox, mot de passe voicemail, courriel ou nom complet. Vous avez donc, peut-être une config particuliere (compte pstn, etc.) ... "
135
136 Veuillez procéder manuellement a la config de ce compte (%s) ''' % (extension,extension)
137
138 raw_input("\nAppuyer sur Entrée pour continuer ...")
139
140 continue
141
142 nombre_compte += 1
143 print "Traitement du compte : %s ......" % extension
144 time.sleep(0.25)
145
146 f_comptes.write("%s:%s:%s:%s:%s:%s\n" % (extension, mdp_sip, boite_vocale, mdp_vm, adel, nom_complet))
147
148 f_comptes.close()
149
150 print '''\n\n
151 Extraction terminée : %s comptes trouvés
152 ***********************************************''' % (nombre_compte)
153 for i in [1, 2, 3]:
154 print '''...........'''
155 time.sleep(0.25)
156
157 time.sleep(0.5)
158
159 print '''\n\nrécupération de la clé privée'''
160
161 # on s'assure que le auf-ville est bien configuré dans debconf
162 prefixe_cle = commands.getoutput("debconf-show asterisk-config-auf | awk -F: '/asterisk-config-auf\/clef:/ {print $2}'").strip()
163 if prefixe_cle == "auf-ville":
164 subprocess.call(["dpkg-reconfigure", "-plow", "asterisk-config-auf"])
165 prefixe_cle = commands.getoutput("debconf-show asterisk-config-auf | awk -F: '/asterisk-config-auf\/clef:/ {print $2}'").strip()
166
167 # on récupère le préfixe du fichier de clé
168 NOM_CLE = "%s.key" % prefixe_cle
169
170 # on va chercher la clé
171 os.chdir(DOSSIER_DES_CLES)
172 for fichier in os.listdir("."):
173 if fichier == NOM_CLE:
174 PRIVATE_KEY = os.path.join(DOSSIER_DES_CLES, fichier)
175 print "\nClé %s trouvée ......" % NOM_CLE
176
177 time.sleep(0.25)
178 print "\nArchivage des données de configurations ......"
179
180 # on crée une archive content le fichier des comptes et la clé
181 tar = tarfile.open(CONFIG_ARCHIVEE, "w:gz")
182 for f in [COMPTES_VOIP, PRIVATE_KEY]:
183 tar.add(f)
184 tar.close
185
186 time.sleep(0.25)
187 print "\nArchivage terminée ....\n"
188
189 raw_input("Appuyer sur Entrée pour lire les instructions pour la suite à faire ..." )
190
191 print '''\n\n
192 FIN DE L'EXPORTATION DES DONNÉES :
193 ************************************************
194
195 NB : lisez attentivement les instructions qui suivent :
196
197 - l'archive %s vient d'être créée et contient :
198 - le fichier %s : tous vos comptes voip
199 - le fichier %s : votre clé privée Asterisk
200
201 ==> Transférez cette archive sur le nouveau serveur (Asterisk 1.8) ...
202 ==> pour en finaliser la configuration avec le script d'importation
203 ==> ... (voip-1.8-import-configs.py)
204
205 *********************************************************************************\n''' % (CONFIG_ARCHIVEE, os.path.basename(COMPTES_VOIP), NOM_CLE)
206
207 raw_input("Appuyer sur Entrée pour terminer ...")
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.