Есть задача - заставить писать в 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 ?
>[оверквотинг удален]
>
> "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);
пишет syntax error before "uid_t"
>пишет syntax error before "uid_t"На какую строчку ругается? Что на этой строчке?
>>пишет syntax error before "uid_t"
>
>На какую строчку ругается? Что на этой строчке?как я понял uid_t это тип данных
в структуре server_rec есть server_uid
как в си в функции объявить переменную - ей присвоить значение server_uid и потом уже переменную печатать в строке лога ?
кстати - второй вопрос - можно ли как-то сделать так что б не каждое сообщение о ошибках редактировать - они разнесены по всему коду и выискивать утомительно очень ?
в модуле 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)что ему еще надо ?
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 должен иметь мой
>вот так написал - он стал в логи выдавать 65534 это как
>я понимаю максимальный номер - id показывает что я 30144
>
>процесс принадлежит мне и uid должен иметь мойОчень похоже, что 65534 это uid пользователя nobody от которого у вас Апач запущен (и ОСь, наверное, FreeBSD?)
спасибо за подсказку - действительно в конфиге пропустил User nobody
теперь работает как надо - дальше буду тестировать с виртуальными хостами - результат напишу
>в модуле 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 пользователя (можно конечно и 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
Выложу тут
критика принимается :)
Только в ./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
>Выложу тут
>критика принимается :)[...]
>+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 выполнение не доходит.
т.е. просто убрать endpwent() ?