Notes sur
l’intégration du follow-me dans les futures versions d’astrad.
Nicolas
Bondier, 2012-04-30
Récapitulatif
des modifications des échanges SIP à effectuer à l’intérieur du réseau
Switzernet.
Etape
1 : Appel d’un téléphone vers un serveur.
Etape
2 : Dans ce cas, le téléphone "A" téléphone vers "B"
qui a une règle de follow-me simultanée vers deux numéros externes, "C1"
et "C2" après 10 secondes de sonnerie vers "B".
Le serveur
astrad reçoit un appel provenant d’un téléphone sip,
il demande une autorisation au serveur radius afin de connaître les routes.
Celles-ci lui sont envoyées (en vert).
Etape
3 : Lorsqu’il reçoit la réponse radius, le serveur Astrad voit un
follow-me vers plusieurs numéros simultanés avec plusieurs vendeurs. Tout d’abors il appelle le téléphone B (qui doit sonner 10s avant
tout), puis il envoie deux INVITE à un autre serveur Astrad aléatoire. Celui-ci
pourra alors traiter ces appels simultanés comme deux appels indépendants, et
suivre la séquence de vendeur pour chaque appel sortant. Le context
fork indique qu’il ne faut pas redemander
d’autorisation à radius, mais seulement effectuer l’appel.
Etape 3
bis : Le premier serveur astrad a reçu une réponse du radius contenant un
numéro interne (SIP-UA). Il envoie toute de même les deux appels vers le
serveur Astrad suivant mais il ne fournit pas le contact pour les numéros du
follow-me. Le second Astrad, doit exécuter le script radius d’autorisation pour
savoir si ce numéro possède un follow-me, si c’est le cas, il exécute la même
procédure que le premier Astrad pour ces routes.
Attention,
il faut alors modifier le temps total d’expires pour le second follow-me, qui
doit être inferieur ou egale au temps total du
précédent expire en paramètre de la route.
#########################################
# Envoie de
la demande d’autorisation #
#########################################
# ...
#########################################
# Traitement pour chaque route #
#########################################
SI CONTEXT ‘fork’ {
var Max_expires = Min(expires
from asterisk, expires from radius);
}
var rand_astrad_ip = get_random_active_astrad();
#########################################
# traitement déjà réalisé
Pour chaque séquence de routes [i] envoyés par radius B,
C1 et C2
Pour [j] chaque route de chaque sequence {
Si SIP_UA et première route {
route[i][j][contact] = get_location(DEST);
route[i][j][cld]
= DEST;
route[i][j][display] = parse
radius cli;
route[i][j][bill_to]
= FROM;
route[i][j][expires] = parse radius expires;
}
Sinon {
route[i][j][contact] = prochain_astrad;
route[i][j][cld]
= parse radius cld;
route[i][j][display] = parse
radius cli;
route[i][j][bill_to]
= DEST;
route[i][j][expires] = parse radius expires;
}
if (Max_expires){
route[i][j][expires]
= Min(route[i][j][expires], Max_expires);
# TODO : code pour faire
soustraire les premiers expires et chaque expire de follow me (si seq) à Max_expires.
}
}
}
#########################################
# Paramètres
envoyés à Asterisk si follow-me simultané
X_ROUTE_1_0 = SIP/B@ASTRAD_DE_B
X_EXP_1_0 = 10s
X_CLI_1_0 = CLI renvoyé par radius
XROUTE_2_0 =
“SIP/X-Route_0@rand_astrad_ip&SIP/X-Route_1@rand_astrad_ip[&X-Route_2@rand_astrad_ip]”
X_BILL_TO_2_0 = “B”
X_TYPE_2_0 = “SIMULTANEOUS”
X_TIME_OUT = MAX(C1_EXPIRES, C2_EXPIRES)
X-ROUTE_2_0 = “CLD_1X@route_X,CLI_1X&CLD_1Y@route_Y,CLI_1Y;Expires:C1_EXPIRES”
X-ROUTE_2_1 = “CLD_2X@route_X,CLI_2X&CLD_2Y@route_Y,CLI_2Y&CLD_2Z@route_Z,CLI_1Z;Expires:C2_EXPIRES”
Ajout des
header dans le paquet (seulement nom des headers).
X-bill-to = X_BILL_TO_2_0
X-Route_Type = X_TYPE_2_0
X-Route_0 = X-ROUTE_2_0
X-Route_1 = X-ROUTE_2_1
Appel:
# dial(XROUTE_2_0,X_TIME_OUT)
dial( SIP/X-Route_0@RANDOM_ASTRAD & SIP/X-Route_1@RANDOM_ASTRAD,
MAX(C1_EXPIRES, C2_EXPIRES))
Ajout des
variables directement dans le paquet SIP lorsque le paquet est à destination
d’un autre astrad.
# Paquet
SIP 1
To: <sip:X-Route_0@xxx.xxx.xxx.xxx>
From: <sip:fork@xxx.xxx.xxx.xxx>
[...]
X-bill-to: X_BILL_TO_2_0
X-Route_Type:
SIMULTANEOUS
X-Route_0: CLD_1X@route_X,CLI_1X&CLD_1Y@route_Y,CLI_1Y;Expires:C1_EXPIRES
X-Route_1: CLD_2X@route_X,CLI_2X&CLD_2Y@route_Y,CLI_2Y&CLD_2Z@route_Z,CLI_1Z;Expires:C2_EXPIRES
To: <sip:X-Route_1@xxx.xxx.xxx.xxx>
From: <sip:fork@xxx.xxx.xxx.xxx>
[...]
X-bill-to: X_BILL_TO_2_0
X-Route_Type:
SIMULTANEOUS
X-Route_0: CLD_1X@route_X,CLI_1X&CLD_1Y@route_Y,CLI_1Y;Expires:C1_EXPIRES
X-Route_1: CLD_2X@route_X,CLI_2X&CLD_2Y@route_Y,CLI_2Y&CLD_2Z@route_Z,CLI_1Z;Expires:C2_EXPIRES