Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #--8<-----------------------------------------------------------------------------------------------
- ####### Логика маршрутизации ############################################
- route {
- $var(is_debug)=m4_IS_DEBUG;
- $var(non_payer)="m4_NON_PAYER_SIP_ADDRESS";
- $var(asterisk_ip)="m4_ASTERISK_IP";
- $var(asterisk_port)="m4_ASTERISK_PORT";
- $var(opensips_ip)="m4_DEFAULT_IP";
- $var(opensips_port)="m4_DEFAULT_PORT";
- $var(unitel_ip)="m4_PBX_IP";
- $var(reg_on_aster)=m4_REG_ON_ASTER;
- # ----------------------------------------------------------------------
- # Sanity Check Section
- if (!mf_process_maxfwd_header("10")) {
- sl_send_reply("483","Too Many Hops");
- exit;
- }
- #...................................................................
- # Последовательные запросы
- ## Восстановление маршрута для запросов со скрытой топологией
- if (has_totag() && (uri == myself) && is_method("INVITE|ACK|BYE|UPDATE"))
- {
- if (match_dialog())
- {
- xlog(" in-dialog topology hiding request - $DLG_dir\n");
- route(m4_DEFAULT);
- exit;
- }
- }
- #...................................................................
- if (has_totag()) {
- if (loose_route()) {
- if (is_method("BYE")) {
- setflag(1);
- setflag(3);
- } else if (is_method("INVITE")) {
- record_route();
- }
- route(m4_DEFAULT);
- } else {
- if ( is_method("ACK") ) {
- if ( t_check_trans() ) {
- t_relay();
- exit;
- } else {
- exit;
- }
- }
- sl_send_reply("404","Not here");
- }
- exit;
- } # if (has_totag())
- # Инициирующие запросы
- #...................................................................
- ## Перенаправлять запросы через Asterisk
- if (db_is_user_in("$fu", "asterisk"))
- {
- if(!has_totag() && is_method("INVITE"))
- {
- topology_hiding();
- }
- }
- #.......................................................................
- #...................................................................
- if (is_method("CANCEL"))
- {
- if (t_check_trans())
- t_relay();
- exit;
- }
- t_check_trans();
- if (!(method=="REGISTER") && from_uri==myself) /*НЕ multidomain версия*/
- {
- if(!check_source_address("0")){
- if (!proxy_authorize("", "subscriber")) {
- proxy_challenge("", "0");
- exit;
- }
- if (!db_check_from()) {
- sl_send_reply("403","Forbidden auth ID");
- exit;
- }
- consume_credentials();
- }
- }
- #...................................................................
- #
- # ----------------------------------------------------------------------
- # Loose Route Section (Loose - свободный)
- if (loose_route()) {
- xlog("L_ERR",
- "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
- if (!is_method("ACK"))
- sl_send_reply("403","Preload Route denied");
- exit;
- }
- if (!is_method("REGISTER|MESSAGE"))
- record_route();
- if (is_method("INVITE")) {
- setflag(1); # Вести учет
- setflag(2); # Учитывать пропущенные звонки
- setflag(3); # Учитывать неудачные транзакции
- }
- # ----------------------------------------------------------------------
- # Call Type Processing Section
- # Секция, обрабатывающая различные типы вызовов.
- # ----------------------------------------------------------------------
- # Выход из из внутридоменной маршрутизации
- if (!uri==myself)
- {
- if(from_uri==myself)
- {
- append_hf("P-hint: outbound\r\n");
- route(m4_DEFAULT);
- }
- else
- sl_send_reply("403", "Not here");
- }
- if (is_method("PUBLISH"))
- {
- sl_send_reply("503", "Service Unavailable");
- exit;
- }
- if (is_method("REGISTER"))
- {
- if (!www_authorize("", "subscriber"))
- {
- www_challenge("", "0"); # Шлет пакет 401 Unauthorized
- exit;
- }
- if (!db_check_to())
- {
- sl_send_reply("403","Forbidden auth ID");
- exit;
- }
- if (!save("location")) # сохранение данных AOR в таблице расположений MySQL
- sl_reply_error();
- exit;
- } # if (is_method("REGISTER"))
- # Этот код отбрасывает запросы без правильного заполненного URI.
- if ($rU==NULL) {
- # Запрос без имени пользователя в RURI
- sl_send_reply("484","Address Incomplete");
- exit;
- }
- alias_db_lookup("dbaliases");
- if(!dp_translate("0","$rU/$rU")){
- send_reply("420", "Invalid Destination");
- exit;
- }
- # Для пользователей группы Asterisk маршрут отправляем через Asterisk
- if (db_is_user_in("$fu", "asterisk"))
- {
- $avp(dest)="media";
- }
- xlog("$avp(dest)");
- if ($avp(dest)=="usrloc") {
- # Маршрут для usrloc
- route(m4_USRLOC);
- }
- ....
- send_reply("420", "Invalid Extension");
- exit;
- }
- route[m4_DEFAULT] {
- # для INVITEs используем несколько вспомогательных путей
- if (is_method("INVITE")) {
- #xlog("---> INVITE detected");
- # Запускаем новую ветвь
- t_on_branch("2"); # вызов branch_route[2]
- t_on_reply("2"); # вызов onreply_route[2]
- t_on_failure("1");
- }
- if (!t_relay()) {
- send_reply("500","Internal Error");
- };
- exit;
- }
- #-----------------------------------------------------------------------
- #-----------------------------------------------------------------------
- # Маршрут для поиска пользователей
- route[m4_USRLOC]{
- if (!lookup("location", "m")) {
- switch ($retcode) {
- case -1:
- case -3:
- t_newtran();
- t_reply("404", "Not Found");
- exit;
- case -2:
- sl_send_reply("405", "Method Not Allowed");
- exit;
- }
- }
- setflag(2);
- route(m4_DEFAULT);
- }
- #-----------------------------------------------------------------------
- route[m4_PSTN] {
- if(!do_routing()){
- send_reply("503", "No rules found matching the URI prefix");
- exit;
- }
- setflag(10); # flag 10 – флаг транзакции для перехвата ошибок маршрута
- route(m4_DEFAULT);
- }
- #-----------------------------------------------------------------------
- route[m4_MEDIA] {
- rewritehostport("m4_ASTERISK_IP:m4_ASTERISK_PORT");
- route(m4_DEFAULT);
- }
- #-----------------------------------------------------------------------
- branch_route[2] {
- # xlog("new branch at $ru\n");
- }
- #-----------------------------------------------------------------------
- onreply_route[2] {
- #xlog("incoming reply from $si\n");
- }
- #-----------------------------------------------------------------------
- failure_route[1] {
- if (t_was_cancelled()) {
- exit;
- }
- if(isflagset(10)){
- if (use_next_gw()) {
- #xlog ("next gateway $ru \n");
- t_on_failure("1");
- t_relay();
- exit;
- }
- else {
- t_reply("503", "Service not available, no more gateways");
- exit;
- }
- }
- }
- #--8<-----------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement