diff --git a/Bundler/asterisk-server.xml b/Bundler/asterisk-server.xml
index 333a929..0bf0ed0 100644
--- a/Bundler/asterisk-server.xml
+++ b/Bundler/asterisk-server.xml
@@ -3,4 +3,8 @@
+
+
+
+
diff --git a/Cfg/etc/asterisk/extensions.conf/extensions.conf b/Cfg/etc/asterisk/extensions.conf/extensions.conf
new file mode 100644
index 0000000..240b3d4
--- /dev/null
+++ b/Cfg/etc/asterisk/extensions.conf/extensions.conf
@@ -0,0 +1,229 @@
+[general]
+static=yes
+writeprotect=no
+autofallthrough=yes
+clearglobalvars=no
+priorityjumping=no
+
+[globals]
+CONSOLE=Console/dsp
+IAXINFO=guest
+TRUNK=Zap/g2
+TRUNKMSD=1
+
+[voicemail]
+exten => _1XXXX,1,VoiceMail(${EXTEN}@666)
+exten => _1XXXX,n,GotoIf($["${VMSTATUS}" = "FAILED"]?inconnu:hangup)
+exten => _1XXXX,n(inconnu),Goto(voicemail,i,1)
+exten => _1XXXX,n(hangup),Hangup()
+include => numero-invalide
+
+[crans-sms]
+;#include "/usr/scripts/var/sip/sip_accounts_alias"
+exten => 7806,1,Goto(imprimante-sms,${CUT(CUT(CUT(MESSAGE(from),<,2),@,1),:,2)},1)
+exten => _[a-zA-Z0-9].,1,AGI(alias)
+exten => _[a-zA-Z0-9].,n,Set(ACTUALFROM=${CUT(CUT(MESSAGE(from),<,2),@,1)})
+exten => _[a-zA-Z0-9].,n,Set(DOMAINFROM=${CUT(CUT(MESSAGE(from),@,2),>,1)})
+exten => _[a-zA-Z0-9].,n,Set(nom=${SHELL(/usr/scripts/sip/scripts/num_to_callerid ${CUT(ACTUALFROM,:,2)})})
+exten => _[a-zA-Z0-9].,n,MessageSend(sip:${EXTEN},"${nom}" <${ACTUALFROM}@${DOMAINFROM}>)
+exten => _[a-zA-Z0-9].,n,NoOp(Send status is ${MESSAGE_SEND_STATUS})
+exten => _[a-zA-Z0-9].,n,GotoIf($["${MESSAGE_SEND_STATUS}" != "SUCCESS"]?sendfailedmsg)
+exten => _[a-zA-Z0-9].,n,Hangup()
+exten => _[a-zA-Z0-9].,n(sendfailedmsg),GotoIf($["${SHELL(/usr/scripts/sip/scripts/user_exist.py ${EXTEN} )}" = "TRUE"]?enqueue)
+exten => _[a-zA-Z0-9].,n,Set(MESSAGE(body)="[${STRFTIME(${EPOCH},,%d/%m/%Y-%H:%M:%S)}] Your message to ${EXTEN} has failed. Retry later.")
+exten => _[a-zA-Z0-9].,n,MessageSend(${ACTUALFROM},ServiceCenter)
+exten => _[a-zA-Z0-9].,n,Hangup()
+exten => _[a-zA-Z0-9].,n(enqueue),AGI(sms_delay,"\"${nom}\"" <${ACTUALFROM}@${DOMAINFROM}>,sip:${EXTEN},${BASE64_ENCODE(${MESSAGE(body)})},${EXTEN})
+exten => _[a-zA-Z0-9].,n,Hangup()
+
+[horloge]
+exten => 1234,1,Ringing()
+exten => 1234,n,Wait(3)
+exten => 1234,n,AGI(alias)
+exten => 1234,n,AGI(agi://127.0.0.1:1234)
+exten => 1234,n,Set(COUNTER=0);
+exten => 1234,n,Answer()
+exten => 1234,n(time),Wait(1)
+exten => 1234,n,SayUnixTime(,Europe/Paris,AdBY kM)
+exten => 1234,n,Set(COUNTER=$[${COUNTER} + 1]);
+exten => 1234,n,Wait(1)
+exten => 1234,n,GotoIf($[${COUNTER} < 2]?time)
+exten => 1234,n,Playback(vm-goodbye)
+exten => 1234,n,Hangup()
+include => hangup
+
+
+[conference]
+exten => _9XXXX,1,Ringing
+exten => _9XXXX,n,Wait(3)
+exten => _9XXXX,n,Answer()
+exten => _9XXXX,n,ConfBridge(${EXTEN})
+exten => _9XXXX,n,Hangup()
+include => hangup
+
+
+
+[crans-sip]
+exten => _[a-zA-Z0-9+].,1,Gotoif($["${SIPDOMAIN}" = "crans.org"]?internal)
+exten => _[a-zA-Z0-9+].,n,Gotoif($["${SIPDOMAIN}" = "sip.crans.org"]?internal)
+exten => _[a-zA-Z0-9+].,n,Gotoif($["${SIPDOMAIN}" = ""]?internal)
+exten => _[a-zA-Z0-9+].,n(external),AGI(history,add,${UNIQUEID},${CALLERID(num)},${EXTEN}@${SIPDOMAIN})
+exten => _[a-zA-Z0-9+].,n,Goto(crans-sip-autre,${EXTEN},1)
+exten => _[a-zA-Z0-9+].,n(internal),AGI(history,add,${UNIQUEID},${CALLERID(num)},${EXTEN})
+exten => _[a-zA-Z0-9+].,n,Goto(crans-sip-dispatch,${EXTEN},1)
+
+
+[crans-from-external]
+exten => _[a-zA-Z0-9].,1,Noop(external call: ${CALLERID(num)}@${CDR(channel):4:-9})
+exten => _[a-zA-Z0-9].,n,Set(__SIPFROMDOMAIN=${CDR(channel):4:-9})
+exten => _[a-zA-Z0-9].,n,AGI(history,add,${UNIQUEID},${CALLERID(num)}@${CDR(channel):4:-9},${EXTEN})
+exten => _[a-zA-Z0-9].,n,Noop(Ip: ${CHANNEL(recvip)})
+exten => _[a-zA-Z0-9].,n,Goto(crans-sip-account,${EXTEN},1)
+
+
+[crans-sip-dispatch]
+exten => 01189998819991197253,1,Goto(crans-sip-internal-special,${EXTEN},1) ; petit hack pour ne pas envoyer le numéro dans crans-sip-dial
+exten => _0ZXXXXXXXX!,1,Goto(crans-sip-dial,+33${EXTEN:1},1) ; on remplace 0[1-9] par +33[1-9]
+exten => _00!,1,Goto(crans-sip-dial,+${EXTEN:2},1) ; on remplace 00 par +
+exten => _+!,1,Goto(crans-sip-dial,${EXTEN},1)
+exten => _[a-zA-Z0-9].,1,Goto(crans-sip-internal,${EXTEN},1)
+
+[test-playback]
+exten => 3333,1,Ringing
+exten => 3333,n,Wait(2)
+exten => 3333,n,Answer
+exten => 3333,n,Playback(higurashi)
+exten => 3333,n,Hangup()
+include => hangup
+
+[messagerie]
+exten => 666,1,Ringing
+exten => 666,n,Wait(2)
+exten => 666,n,VoiceMailMain(s${CALLERID(num)}@666)
+exten => 666,n,Hangup()
+include => hangup
+
+[crans-sip-autre]
+;exten => _[a-zA-Z0-9].,1,AGI(billing)
+exten => _[a-zA-Z0-9].,1,Dial(SIP/${EXTEN}@${SIPDOMAIN},120,tr)
+exten => _[a-zA-Z0-9].,n,Noop(Status: ${DIALSTATUS})
+exten => _[a-zA-Z0-9].,n,Hangup()
+include => hangup
+
+[voice-recorder]
+exten => 7777,1,Ringing
+exten => 7777,n,Wait(2)
+exten => 7777,n,Playback(parlez apres le bip sonore)
+exten => 7777,n,record(mytest.alaw,5,30) ; record audio and video to a file "mytest"
+exten => 7777,n,playback(beep)
+exten => 7777,n,playback(mytest) ; play the recorded file
+exten => 7777,n,hangup()
+include => hangup
+
+
+[crans-sip-internal-special]
+exten => 01189998819991197253,1,Goto(multidial,nounou,1)
+exten => 2024561111,1,Goto(multidial,bureau,1)
+exten => 00911,1,Goto(multidial,cableur,1)
+exten => 911,1,Goto(multidial,cableur,1)
+exten => 119,1,Goto(multidial,imprimeur,1)
+exten => 3333,1,Goto(test-playback,${EXTEN},1)
+exten => 666,1,Goto(messagerie,${EXTEN},1)
+exten => 1234,1,Goto(horloge,${EXTEN},1)
+exten => 7777,1,Goto(voice-recorder,${EXTEN},1)
+exten => 7806,1,Goto(imprimante,${EXTEN},1)
+exten => _9XXXX,1,Goto(conference,${EXTEN},1)
+include => numero-invalide
+
+[crans-sip-account]
+exten => _1XXXX,1,Ringing
+exten => _1XXXX,n,Wait(1)
+exten => _1XXXX,n,Dial(SIP/${EXTEN},30)
+exten => _1XXXX,n,Goto(voicemail,${EXTEN},1)
+include => numero-invalide
+
+[crans-sip-internal]
+;#include "/usr/scripts/var/sip/sip_accounts_alias"
+exten => _[a-zA-Z][a-zA-Z0-9].,1,AGI(alias)
+exten => _1XXXX,1,Goto(crans-sip-account,${EXTEN},1)
+include => crans-sip-internal-special
+
+[imprimante-sms]
+exten => _1XXXX,1,Set(code=${SHELL(/usr/scripts/sip/scripts/code_impression.py ${EXTEN})})
+exten => _1XXXX,n,Set(MESSAGE(to)=sip:${EXTEN}@crans.org)
+exten => _1XXXX,n,Set(MESSAGE(from)="Impression" )
+exten => _1XXXX,n,GotoIf($[ "${code}" = "NONE" ]?nocode:code)
+exten => _1XXXX,n(nocode),Set(MESSAGE(body)=vous n'avez pas de code en cours de validité)
+exten => _1XXXX,n,Goto(send)
+exten => _1XXXX,n(code),Set(MESSAGE(body)=code : ${code}#)
+exten => _1XXXX,n(send),MessageSend(sip:${EXTEN},${MESSAGE(from)})
+exten => _1XXXX,n,Hangup()
+
+[imprimante]
+exten => 7806,1,Ringing
+exten => 7806,n,Wait(3)
+exten => 7806,n,Answer
+exten => 7806,n,Set(code=${SHELL(/usr/scripts/sip/scripts/code_impression.py ${CALLERID(num)})})
+exten => 7806,n,GotoIf($[ "${code}" = "NONE" ]?hangup)
+exten => 7806,n,Set(MESSAGE(to)=sip:${CALLERID(num)@crans.org})
+exten => 7806,n,Set(MESSAGE(from)="Impression" )
+exten => 7806,n,Set(MESSAGE(body)=code : ${code}#)
+exten => 7806,n,MessageSend(sip:${CALLERID(num)},${MESSAGE(from)})
+exten => 7806,n,Playback(impression-1)
+exten => 7806,n,SayDigits(${code}#)
+exten => 7806,n,Wait(3)
+exten => 7806,n,SayDigits(${code}#)
+exten => 7806,n,Playback(impression-2)
+exten => 7806,n,Hangup(16)
+exten => 7806,n(hangup),Playback(impression-3)
+exten => 7806,n,Hangup(16)
+include => hangup
+
+[multidial]
+;#include "/usr/scripts/var/sip/sip_multidial"
+exten => _[a-zA-Z0-9].,1,Set(nums=${SHELL(/usr/scripts/sip/scripts/right_to_nums ${EXTEN})})
+exten => _[a-zA-Z0-9].,n,GotoIf($["${nums}" != "NONE"]?ring:nonvalide)
+exten => _[a-zA-Z0-9].,n(ring),Ringing
+exten => _[a-zA-Z0-9].,n,Wait(4)
+exten => _[a-zA-Z0-9].,n,Dial(${nums},30)
+exten => _[a-zA-Z0-9].,n,Wait(3)
+exten => _[a-zA-Z0-9].,n,VoiceMail(${EXTEN}@666)
+exten => _[a-zA-Z0-9].,n,Hangup()
+exten => _[a-zA-Z0-9].,n(nonvalide),Goto(numero-invalide,i,1)
+include => hangup
+
+[crans-sip-dial]
+; On autorise que les numéro normaux et les 08 gratuits
+exten => _+33[123459]XXXXXXXX,1,Set(policie=${SHELL(/usr/scripts/sip/agi/history quota ${EXTEN})})
+exten => _+33[123459]XXXXXXXX,n,GotoIf($[ "${policie}" != "ALLOWED" ]?hangup)
+exten => _+33[123459]XXXXXXXX,n,AGI(billing)
+;exten => _+33[123459]XXXXXXXX,n,Dial(SIP/${EXTEN}@forfait-ovh,60,L(1800000:60000:20000))
+exten => _+33[123459]XXXXXXXX,n(hangup),Hangup(16)
+exten => _+3380[0459]XXXXXX,1,Set(policie=${SHELL(/usr/scripts/sip/agi/history quota ${EXTEN})})
+exten => _+3380[0459]XXXXXX,n,GotoIf($[ "${policie}" != "ALLOWED" ]?hangup)
+exten => _+3380[0459]XXXXXX,n,Dial(SIP/${EXTEN}@forfait-ovh,60,L(1800000:60000:20000))
+exten => _+3380[0459]XXXXXX,n(hangup),Hangup(16)
+include => numero-invalide
+
+[ovh-sip]
+exten => s,1,Ringing
+exten => s,n,Wait(2)
+exten => s,n,Answer
+exten => s,n,Read(digit,composez le numero de votre correspondant suivit de la touche diese,25,,,60)
+exten => s,n,AGI(history,add,${UNIQUEID},${CALLERID(num)},${digit})
+exten => s,n,Goto(crans-sip-internal,${digit},1)
+exten => h,1,AGI(history,update,${UNIQUEID},${CDR(billsec)})
+exten => h,n,Hangup()
+
+[numero-invalide]
+exten => i,1,AGI(history,delete,${UNIQUEID})
+exten => i,n,Noop(Ip: ${CHANNEL(recvip)})
+exten => i,n,Playback(numero non attribue)
+exten => i,n,Wait(2)
+exten => i,n,Playback(numero non attribue)
+exten => h,n,Hangup(16)
+include => hangup
+
+[hangup]
+exten => h,1,AGI(history,update,${UNIQUEID},${CDR(billsec)})
+exten => h,n,Hangup()
diff --git a/Cfg/etc/asterisk/extensions.conf/info.xml b/Cfg/etc/asterisk/extensions.conf/info.xml
new file mode 100644
index 0000000..8d4a1f0
--- /dev/null
+++ b/Cfg/etc/asterisk/extensions.conf/info.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Cfg/etc/asterisk/voicemail.conf/info.xml b/Cfg/etc/asterisk/voicemail.conf/info.xml
new file mode 100644
index 0000000..8d4a1f0
--- /dev/null
+++ b/Cfg/etc/asterisk/voicemail.conf/info.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/Cfg/etc/asterisk/voicemail.conf/voicemail.conf b/Cfg/etc/asterisk/voicemail.conf/voicemail.conf
new file mode 100644
index 0000000..75cd3dc
--- /dev/null
+++ b/Cfg/etc/asterisk/voicemail.conf/voicemail.conf
@@ -0,0 +1,31 @@
+[general]
+format = wav49|gsm|wav
+serveremail = sip
+attach = yes
+mailcmd=/usr/sbin/sendmail -t
+skipms = 3000
+maxsilence = 10
+silencethreshold = 128
+maxlogins = 3
+maxsecs = 300
+minsecs = 1
+externpass = /usr/scripts/sip/scripts/update_pin
+forcename=yes
+forcegreeting=yes
+charset = UTF-8
+
+fromstring = "Sip Cr@ns"
+emaildateformat = %d/%m/%Y à %H:%M:%S
+emailsubject = [Sip Cr@ns] Nouveau message vocal
+emailbody = Bonjour ${VM_NAME},\r\n\r\nLe numéro ${VM_CALLERID} a tenté\r\nde vous joindre sans succès le ${VM_DATE}.\nCette personne vous a laissé un message de ${VM_DUR} seconde(s).\r\nVous pouvez le consulter en appelant votre boite vocale. \r\n\r\nBonne journée !\r\n\r\n-- \r\nVoicemail, service effectué par Asterisk\n
+
+pagerfromstring = [Sip Cr@ns]
+pagersubject = Nouveau message vocal
+pagerbody = Nouveau message de ${VM_DUR} seconde(s), dans la boite ${VM_MAILBOX}, laissé le ${VM_DATE} par ${VM_CALLERID}.
+
+[666]
+nounou => 098765432,les Nounous du Crans,roots@crans.org,,attach=yes|delete=yes
+bureau => 098765432,le CA du Crans,bureau@crans.org,,attach=yes|delete=yes
+imprimeur => 098765432,les Imprimeurs du Crans,impression@crans.org,,attach=yes|delete=yes
+cableur => 098765432,les Câbleurs du Crans,respbats@lists.crans.org,,attach=yes|delete=yes
+#include "/usr/scripts/var/sip/sip_accounts_voicemail"
diff --git a/Python/etc/asterisk/manager.conf b/Python/etc/asterisk/manager.conf
new file mode 100644
index 0000000..8a5aaee
--- /dev/null
+++ b/Python/etc/asterisk/manager.conf
@@ -0,0 +1,45 @@
+info["owner"] = "asterisk"
+info["group"] = "asterisk"
+info["perms"] = 0644
+
+include("secrets")
+
+out(""";
+; Asterisk Call Management support
+; Géré par bcfg2
+
+; By default asterisk will listen on localhost only.
+[general]
+enabled = yes
+port = 5038
+bindaddr = 0.0.0.0
+
+; No access is allowed by default.
+; To set a password, create a file in /etc/asterisk/manager.d
+; use creative permission games to allow other serivces to create their own
+; files
+#include "manager.d/*.conf"
+
+[django]
+secret =""" + secrets.asterisk_django_passwd + """
+deny=0.0.0.0/0.0.0.0
+permit=127.0.0.1/255.255.255.0
+permit=10.231.136.0/255.255.255.0
+write = config
+
+; Le mot de passe est aussi present dans /etc/crans/secrets.py
+; (update accordingly )
+[sms]
+secret = """ + secrets.asterisk_sms_passwd + """
+deny=0.0.0.0/0.0.0.0
+permit=127.0.0.1/255.255.255.0
+permit=10.231.136.0/255.255.255.0
+read = system
+write = system,message
+
+[billing]
+secret = """ + secrets.asterisk_billig_passwd + """
+deny=0.0.0.0/0.0.0.0
+permit=127.0.0.1/255.255.255.0
+read = call,system
+write = call""")
diff --git a/Python/etc/asterisk/sip.conf b/Python/etc/asterisk/sip.conf
new file mode 100644
index 0000000..164fef7
--- /dev/null
+++ b/Python/etc/asterisk/sip.conf
@@ -0,0 +1,88 @@
+info["owner"] = "asterisk"
+info["group"] = "asterisk"
+info["perms"] = 0644
+
+include("secrets")
+
+out("""[general]
+language=fr
+context=crans-from-external
+outofcall_message_context=crans-sms
+vmexten=666
+bindport=5060•
+bindaddr=::
+srvlookup=yes•
+domain = crans.org
+fromdomain=crans.org
+domain = sip.crans.org
+domain = sip.v6.crans.org
+domain = sip.v4.crans.org
+qualify = 10000
+qualifyfreq = 60
+realm = asterisk
+rtpholdtimeout=300
+rtptimeout=60
+register => 0033972113270:G1mrWTZ43Z8S@sip.ovh.fr
+
+tlsenable=yes
+tcpenable=yes
+tlsbindaddr=::
+tcpbindaddr=::
+tlscertfile=/etc/asterisk/cert/asterisk.pem
+tlscafile=/etc/ssl/certs/cacert.org.pem
+tlscipher=ALL
+tlsclientmethod=tlsv1
+
+videosupport=yes
+disallow=all
+allow=alaw
+allow=ulaw
+allow=h263
+;allow=h263p
+;allow=h261•
+allow=h264
+;allow=g729
+;maxcallbitrate=512
+;localnet=138.231.0.0/255.255.0.0
+;localnet=138.231.144.0/255.225.248.0
+;localnet=138.231.136.0/255.225.248.0
+
+nat=force_rport,comedia
+
+
+[forfait-ovh]
+type=peer
+host=sip.ovh.fr
+;allow=all
+context=ovh-sip
+language=fr
+insecure=port,invite
+fromuser=""" + secrets.sip_username + """
+unername=""" + secrets.sip_username + """
+secret=""" + secrets.sip_secret + """
+canreinvite=no
+dtmfmode=auto
+video=no
+restrictcid=no
+amaflags=default
+
+;template par default des lignes pour le crans
+[default-crans](!)
+type=friend
+transport=udp,tcp,tls
+fromdomain=crans.org
+host=dynamic
+context=crans-sip
+language=fr
+insecure=port
+canreinvite=no
+dtmfmode=auto
+call-limit = 10
+video=yes
+restrictcid=no
+amaflags=default
+accept_outofcall_message=yes
+outofcall_message_context=crans-sms
+encryption=may
+
+#include "/usr/scripts/var/sip/sip_accounts" """)