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.
  • [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.