Документация к модулю mod_xml_radius от FreeSWITCH

в 10:34, , рубрики: ip-телефония

Копаясь в сети, документацию не нашел. Стоит задача настройки этого модуля, причем так, чтобы потом можно было это передавать в поддержку. Соответственно, были изучены исходники и написан текст ниже. Надеюсь, он кому-то поможет. Текст написан так, что бы он был понятен уже работавшим с FreeSWITCH. Поэтому начинать знакомство с FreeSWITCH именно с этого текста не советую.

Отдельно хочу отметить, что в исходный текст модуля были внесены некоторые (очень небольшие) изменения, подробнее — в конце публикации.

Модуль на данный момент (14/10/2014) практически не имеет документации. Все измышления ниже получены по факту изучения исходников, тематических списков рассылки и остатков документации (в т.ч. истории изменений) wiki.freeswitch.org/wiki/Mod_xml_radius.

Дебаг не включается из консоли (почему – ХЗ, не разбирался). Для его включения в конфигурационный файл модуля, пример которого идет в комплекте с исходниками, добавить секцию:

 <global>
    <param name="debug" value="7"/>
 </global>

Значение может быть любое отличное от 0 (проверяется как булева переменная).

Если в конфигурационном файле модуля определены такие секции как: auth_invite и auth_reg (в исходном модуле проверяется только наличие секции auth_invite и загрузка параметров и их проверка проводится явно ненормально, очень похоже на описку автора, который блоки делал copy-paste и забыл поменять имя переменной в двух местах), то модуль биндит обработку запросов секции глобальной конфигурации

<param name="xml-handler-bindings" value="directory"/>

на собственную функцию работы с событиями и запросами по стандартному механизму mod_xml_curl (см.соответствующую документацию на сайте фрисвича). При этом реальная работа происходит только если поле sip_auth_method обрабатываемого ивента определено и имеет значение “INVITE” или “REGISTER”. В этом случае свичу возвращается XML-конфиг, по которому свич может сам провести аутентификацию.

Модуль заполняет запросы RADIUS`у в соответствии с собственным конфигом и словарями, поставляемыми в комплекте. Каждому значению name строки параметров присваивается значение из переменной канала (Channel variable), заданной значением variable (а если такой переменной канала нет, то значением из variable_secondary) в соответствии со строкой format.

Модуль определяет собственные хендлеры на глобальные события свича .on_routing и .on_reporting:

1135 static const switch_state_handler_table_t state_handlers = {
1136     /*.on_init */ NULL,
1137     /*.on_routing */ mod_xml_radius_accounting_start,
1138     /*.on_execute */ NULL,
1139     /*.on_hangup */ NULL,
1140     /*.on_exchange_media */ NULL,
1141     /*.on_soft_execute */ NULL,
1142     /*.on_consume_media */ NULL,
1143     /*.on_hibernate */ NULL,
1144     /*.on_reset */ NULL,
1145     /*.on_park */ NULL,
1146     /*.on_reporting */ mod_xml_radius_accounting_end
1147 };

События генерируются в тот момент, когда состояние канала меняется на ROUTING и REPORTING соответственно. В секциях acct_start и acct_end конфигурационного файла должно быть определено хотя бы одно условие срабатывания (condition), иначе при загрузке секции конфига генерируется ошибка (не факт, надо проверить, т, к. код это не подтверждает, это информация была найдена где-то в сети). Эти хендлеры передают RADIUS`у информацию по этим событиям свича, которую получают из переменных канала (Channel variables). Каждому значению name строки параметров соответствующей секции конфигурационного файла присваивается значение из переменной канала, заданной значением variable (а если его в переменных канала нет, то из variable_secondary) в соответствии со значением format.

В случае вызова radius_auth (приложения, которое можно вызывать из конфигурационного файла) возвращается (как текст) результат авторизации в RADIUS`е: 0, если аутентификация успешная, и отрицательное значение (которое вернул RADIUS), если нет. Результат выполнения записывается в переменную канала radius_auth_result. Так же, если в ответе RADIUS`а пришли наборы AV-пар, то приложение создает и заполняет соответствующие переменные канала не добавляя лидирующих radius_ в название переменных (по крайней мере, я кода добавления radius_ не нашел).

Отдельно по моим изменениям в исходник модуля. Они вносят косметические изменения в сообщения дебага и исправляют то, что ИМХО является опиской автора. diff к модулю в ниже. К огромному сожалению, не могу сказать в какой версии исходников я работаю (плохо умею пользоваться git). На момент написания письма версия текущая, diff сформирован при помощи git diff из корневой папки исходников.

diff --git a/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c b/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c
index bc75843..94e127a 100644
--- a/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c
+++ b/src/mod/xml_int/mod_xml_radius/mod_xml_radius.c
@@ -201,7 +201,7 @@ switch_status_t do_config()
 			goto err;
 		}		
 	} else {
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Could not find 'auth_invite' section in config file.n");		
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Could not find 'auth_reg' section in config file.n");		
 	}
 
 	if ((tmp = switch_xml_child(cfg, "global")) != NULL ) {
@@ -741,7 +741,7 @@ switch_xml_t mod_xml_radius_auth_reg(switch_event_t *params) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mod_xml_radius: starting registration authenticationn");
 	}
 	
-	if ( mod_xml_radius_new_handle(&new_handle, globals.auth_invite_configs) != SWITCH_STATUS_SUCCESS ) {
+	if ( mod_xml_radius_new_handle(&new_handle, globals.auth_reg_configs) != SWITCH_STATUS_SUCCESS ) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to load radius handle for registration authenticationn");
 		goto err;		
 	}
@@ -849,7 +849,7 @@ static switch_xml_t mod_xml_radius_directory_search(const char *section, const c
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mod_xml_radius: starting authenticationn");
 		switch_event_serialize(params, &event_buf, SWITCH_TRUE);
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Event: %s n", event_buf);
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Section: %s nTag: %snKey_name: %snKey_value: %sn", 
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "nSection: %s nTag: %snKey_name: %snKey_value: %sn", 
 						  section, tag_name, key_name, key_value);
 	}
 	
@@ -1087,7 +1087,7 @@ SWITCH_STANDARD_APP(radius_auth_handle)
 	temp = NULL;
 
 	if ( result != 0 ) {
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mod_xml_radius: Failed to authenticaten");
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "mod_xml_radius: Failed to authenticate, authentication result: %d n", result);
 		goto err;
 	}
 
@@ -1169,7 +1169,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_radius_load)
 		return SWITCH_STATUS_TERM;
 	}
 	
-	if ( globals.auth_invite_configs ) {
+	if ( globals.auth_invite_configs && globals.auth_reg_configs ) {
 		status = switch_xml_bind_search_function(mod_xml_radius_directory_search, switch_xml_parse_section_string("directory"), NULL);
 	}
 		

Автор: Borikinternet

Источник

Поделиться

* - обязательные к заполнению поля