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.
  • [télécharger | voir] (2012-10-11 19:49:27, 7.2 KB) [[attachment:voip-1.4-export-configs.py]]
  • [télécharger | voir] (2012-10-11 19:21:35, 8.4 KB) [[attachment:voip-1.8-import-configs.py]]
 All files | Selected Files: delete move to page copy to page

Vous n'êtes pas autorisé à joindre un fichier à cette page.