Search
Write a publication
Pull to refresh

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 и как с ним работать, т.к. в Инете крайне мало документации по нему.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.