Как стать автором
Обновить

OpenRadius поддержка UTF-8 в лог-файлах

Если кто-нибудь использовал OpenRadius, то знает, что существует проблема кодировок при выводе информации в лог-файлы, а именно: программа обработчик пишет в UTF-8 нужно, чтобы и в лог-файл попадала в UTF-8.
В конфигурационном файле configuration описали интерфейс:
interface(name="rad_my",
prog="/usr/bin/java -jar /opt/my/myprog.jar",
prog="/usr/bin/java -jar /opt/my/myprog.jar",
prog="/usr/bin/java -jar /opt/my/myprog.jar",
flags=Ascii + Short-Attr + Named-Const,
timeout=3),


Так вот, как выяснилось программа, указанная в “prog” запускает с пустым переменным окружением, за исключением пары переменных которые создаются OpenRadius для служебных нужд.
А если Java приложение запустилось без параметра LANG то включается видимо самая первая кодировка — US-ASCII, что совсем не радует наших программеров т.к. они пишут отладочную информацию на русском языке, да и вообще все остальную тоже.
OpenRadius написан на языке C, таких программеров у нас в конторе нет.
Я работаю системным администратором и программированием занимаюсь только на скриптовых языках, пришлось мне вспоминать институтский курс программирования на C/C++.

Нашел системный вызов execve в файле subprocs.c понял, что где-то формируется собственное переменное окружение, т.к. иначе скорее всего использовали бы execvp.
И о чудо, в этом же файле – это делают!
Мне только требовалось читать переменную окружения LANG у родительского процесса и вкладывать в дочерние, поскольку не являюсь C-программером подправьте если, где не красиво написал.
Изменения которые внес:
diff -dur ./openradius-0.9.12c/common/subprocs.c ./openradius-0.9.12c.lang/common/subprocs.c
--- ./openradius-0.9.12c/common/subprocs.c 2005-06-21 13:40:48.000000000 +0600
+++ ./openradius-0.9.12c.lang/common/subprocs.c 2009-12-08 12:23:50.000000000 +0500
@@ -138,7 +138,18 @@
c[len + 8] = 0; ret->envp[1] = c;

/* Set third element */
- ret->envp[2] = 0;
+ const char * env_lang_value = getenv("LANG");
+ const int len_PR_ENV_LANG = strlen(PR_ENV_LANG);
+ const int len_env_lang_value = strlen(env_lang_value);
+
+ c = (char *)malloc((len = len_PR_ENV_LANG + len_env_lang_value) + 1);
+ if (!c) { proc_del(ret); return 0; }
+ memcpy(c, PR_ENV_LANG, len_PR_ENV_LANG);
+ memcpy(c + len_PR_ENV_LANG, env_lang_value, len_env_lang_value);
+ c[len] = 0; ret->envp[2] = c;
+
+ /* Set fourth element */
+ ret->envp[3] = 0;

/*
* Initialise the other members
diff -dur ./openradius-0.9.12c/common/subprocs.h ./openradius-0.9.12c.lang/common/subprocs.h
--- ./openradius-0.9.12c/common/subprocs.h 2005-06-21 13:41:10.000000000 +0600
+++ ./openradius-0.9.12c.lang/common/subprocs.h 2009-12-08 12:21:06.000000000 +0500
@@ -48,10 +48,11 @@

/* Environment */

-#define PR_ENV_VARS 2
+#define PR_ENV_VARS 3

#define PR_ENV_IFACEVER "RADIUSINTERFACEVERSION="
#define PR_ENV_IFACEFLAGS "RADIUSINTERFACEFLAGS=0x"
+#define PR_ENV_LANG "LANG="

/* Ring size - send/receive window, really */


Пересобрал и все заработало!
LANG в наших системах = ru_RU.UTF-8

Очередной раз показал программерам, что настоящий админ может всё!

Ну а почему же используем OpenRadius а не freeRadius ?? Потому, что программисты так привыкли и переписывать не хотят!

Настроил тестовую связку freeradius+jradius+java даже написал тестовое приложение, и медленно и настойчиво пытаюсь заставить руководство, чтобы оно заставило программеров использовать все возможности масштабирования и надежности JAVA!!! пока не получилось :(
если интересно в следущей публикации расскажу о JRadius и как с ним работать, т.к. в Инете крайне мало документации по нему.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.