URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7337
[ Назад ]

Исходное сообщение
"uid_t взять из структуры server_rec и в errorlog апача"

Отправлено Аноним , 25-Апр-08 15:15 
Есть задача - заставить писать в errorlog апача uid виртуального хоста - где происходит ошибка.
после чтения доков по apache  нашел что есть структура server_rec ( http://httpd.apache.org/dev/apidoc/apidoc_server_rec.html )  в которой есть uid_t
Эта структура различна для разных виртуальных хостов - следовательно именно то что нужно
нашел где в исходниках код описывающий генерацию логов - это файл http_core.c

примерно такая функция генерит сообщение о ошибке

ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, cmd->server,
                     "cannot use a full URL in a 401 ErrorDocument "
                     "directive --- ignoring!");

А теперь вопрос человека который с Си не знаком и чтения литературы для чайников меня ни как не просветлила - как вставить в  сообщение uid_t ?


Содержание

Сообщения в этом обсуждении
"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено phpcoder , 25-Апр-08 15:19 
>[оверквотинг удален]
>            
>         "cannot use
>a full URL in a 401 ErrorDocument "
>            
>         "directive ---
>ignoring!");
>
>А теперь вопрос человека который с Си не знаком и чтения литературы
>для чайников меня ни как не просветлила - как вставить в
> сообщение uid_t ?

Что-то вроде:
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, cmd->server,
                     "cannot use a full URL in a 401 ErrorDocument "
                     "directive --- ignoring! (uid = %u)", uid);



"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено Аноним , 25-Апр-08 15:45 
пишет syntax error before "uid_t"

"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено phpcoder , 25-Апр-08 15:53 
>пишет syntax error before "uid_t"

На какую строчку ругается? Что на этой строчке?


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено dima , 29-Апр-08 11:49 
>>пишет syntax error before "uid_t"
>
>На какую строчку ругается? Что на этой строчке?

как я понял uid_t это тип данных
в структуре server_rec есть server_uid
как в си в функции объявить переменную  - ей присвоить значение server_uid  и потом уже переменную печатать в строке лога ?
кстати - второй вопрос - можно ли как-то сделать так что б не каждое сообщение о ошибках редактировать - они разнесены по всему коду и выискивать утомительно очень ?


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено dima , 30-Апр-08 15:19 
в модуле mod_log_config.c написал такую вещь
static const char *log_uid_vh(request_rec *r, char *a)
{
    return ap_psprintf( "%d", r->server->server_uid);
}

и добавил что б в конфиг оно писалось если добавить в customlog " %g " combined
в итоге при попытке записать в лог выдает ошибку
child pid 12099 exit signal Segmentation fault (11)

что ему еще надо ?


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено dima , 30-Апр-08 15:27 
static const char *log_uid_vh(request_rec *r, char *a)
{
    return ap_psprintf( r->pool, "%d", r->server->server_uid);
}

вот так написал - он стал в логи выдавать 65534 это как я понимаю максимальный номер - id показывает что я 30144

процесс принадлежит мне и uid должен иметь мой


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено phpcoder , 30-Апр-08 15:30 
>вот так написал - он стал в логи выдавать 65534 это как
>я понимаю максимальный номер - id показывает что я 30144
>
>процесс принадлежит мне и uid должен иметь мой

Очень похоже, что 65534 это uid пользователя nobody от которого у вас Апач запущен (и ОСь, наверное, FreeBSD?)


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено dima , 30-Апр-08 15:51 
спасибо за подсказку - действительно в конфиге пропустил User nobody
теперь работает как надо - дальше буду тестировать с виртуальными хостами - результат напишу

"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено phpcoder , 30-Апр-08 15:28 
>в модуле mod_log_config.c написал такую вещь
>static const char *log_uid_vh(request_rec *r, char *a)
>{
>    return ap_psprintf( "%d", r->server->server_uid);
>}

Видимо, ap_psprintf() вернула NULL. Разбирайтесь почему. Она память выделяет сама? Или ей нужен указательна па строку, в которую она запишет что надо?



"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено dima , 04-Май-08 13:22 
если кому интересно будет как заставить в логи писать uid пользователя (можно конечно и gid )
есть в апаче такая структура server_rec в которой содержится server_uid и server_gid
это то откуда буду брать информацию
в каждой функции не обходимо объявить указатель на  server_rec *s;

для каждого error_log сообщения нужно прописать откуда и что берем  (привожу пример)

ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, server_conf,
            "%s configured -- resuming normal operations %d",
            ap_get_server_version(), s->server_uid);

соответственно по всему коду нужно найти те сообщения в которые надо добавить
для access_log все проще

задаем что б  при описании лога в конфиге параметр %g заставлял писать uid

static const char *log_uid_vh(request_rec *r, char *a)
{
    return ap_psprintf( r->pool, "%d", r->server->server_uid);
}

и в log_item_list  добавим
{
    'g', log_uid_vh, 0
  },

теперь в конфиге задаем
LogFormat " %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %v %g "  combined
параметр %g вконце заставляет писать в access_log необходимые нам uid


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено dima , 06-Май-08 16:02 
Выложу тут
критика принимается :)


Только в ./apache_1.3.41: config.status
Только в ./apache_1.3.41: Makefile
Только в ./apache_1.3.41/src/ap: Makefile
Только в ./apache_1.3.41/src: apaci
Только в ./apache_1.3.41/src: Configuration.apaci
Только в ./apache_1.3.41/src/include: ap_config_auto.h
Только в ./apache_1.3.41/src/lib: Makefile
diff -ur ./oorig/src/main/http_log.c ./apache_1.3.41/src/main/http_log.c
--- ./oorig/src/main/http_log.c 2006-07-12 12:16:05.000000000 +0400
+++ ./apache_1.3.41/src/main/http_log.c 2008-05-06 15:42:51.000000000 +0400
@@ -30,6 +30,7 @@
#include "http_log.h"
#include "http_main.h"

+#include <pwd.h>
#include <stdarg.h>

typedef struct {
@@ -277,6 +278,9 @@
#endif
     size_t len;
     int save_errno = errno;
+    uid_t uidd = s->server_uid;
+    struct passwd *pwd;
+    pwd = getpwuid(uidd);
     FILE *logf;

     if (s == NULL) {
@@ -311,13 +315,15 @@
     }

     if (logf) {
-       len = ap_snprintf(errstr, sizeof(errstr), "[%s] ", ap_get_time());
+       len = ap_snprintf(errstr, sizeof(errstr), "[%s] %s ", ap_get_time(), pwd->pw_name);
+       endpwent();
     } else {
        len = 0;
     }

     len += ap_snprintf(errstr + len, sizeof(errstr) - len,
-           "[%s] ", priorities[level & APLOG_LEVELMASK].t_name);
+           "[%s] %s ", priorities[level & APLOG_LEVELMASK].t_name, pwd->pw_name);
+               endpwent();

#ifndef TPF41
     if (file && (level & APLOG_LEVELMASK) == APLOG_DEBUG) {
Только в ./apache_1.3.41/src/main: http_log.c~
Только в ./apache_1.3.41/src/main: Makefile
Только в ./apache_1.3.41/src: Makefile
Только в ./apache_1.3.41/src: Makefile.config
Только в ./apache_1.3.41/src/modules: Makefile
Только в ./apache_1.3.41/src/modules/standard: Makefile
diff -ur ./oorig/src/modules/standard/mod_log_config.c ./apache_1.3.41/src/modules/standard/mod_log_config.c
--- ./oorig/src/modules/standard/mod_log_config.c       2006-07-12 12:16:05.000000000 +0400
+++ ./apache_1.3.41/src/modules/standard/mod_log_config.c       2008-05-06 15:49:16.000000000 +0400
@@ -416,6 +416,15 @@
     return r->server->server_hostname;
}

+static const char *log_uid_vh(request_rec *r, char *a)
+{
+       uid_t uidd_mod = r->server->server_uid;
+       struct passwd *pwd;
+       pwd = getpwuid(uidd_mod);
+       return ap_psprintf( r->pool, "%s", pwd->pw_name);
+       endpwent();
+}
+
static const char *log_server_port(request_rec *r, char *a)
{
     return ap_psprintf(r->pool, "%u",
@@ -528,6 +537,11 @@
     {
         'U', log_request_uri, 1
     },
+
+    {
+       'g', log_uid_vh, 0
+    },
+
     {
         'v', log_virtual_host, 0
     },
Только в ./apache_1.3.41/src/modules/standard: mod_log_config.c~
Только в ./apache_1.3.41/src: modules.c
Только в ./apache_1.3.41/src/os/unix: Makefile
Только в ./apache_1.3.41/src/regex: Makefile
Только в ./apache_1.3.41/src/support: Makefile


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено phpcoder , 06-Май-08 16:23 
>Выложу тут
>критика принимается :)

[...]
>+static const char *log_uid_vh(request_rec *r, char *a)
>+{
>+       uid_t uidd_mod = r->server->server_uid;
>+       struct passwd *pwd;
>+       pwd = getpwuid(uidd_mod);
>+       return ap_psprintf( r->pool, "%s", pwd->pw_name);
>+       endpwent();
>+}
>+

endpwent() не выполняется никогда, т.к. до кода после return выполнение не доходит.


"uid_t взять из структуры server_rec и в errorlog апача"
Отправлено dima , 06-Май-08 19:00 
т.е. просто убрать endpwent() ?