doveadm-log.c revision 8a2df8a89fc61c584429534a57a2ea20fcaf2d28
e9b6af083e34e2397a8ddbe9781920733d09d151Ted Gould/* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */
5cacbbec22b42a0480f396eb94bcfb5f746ac68aAlex Valavaniscmd_log_test(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED)
8f40ed19303d1d55144ded13fa6e3465134ffbbbinsaner unsigned int i;
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental master_service->flags |= MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR;
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental master_service_init_log(master_service, "doveadm: ");
963f23115db07f460bdd862b957f8bd9dba88b9bgustav_b for (i = 0; i < LAST_LOG_TYPE; i++) {
963f23115db07f460bdd862b957f8bd9dba88b9bgustav_b /* add timestamp so that syslog won't just write
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop "repeated message" text */
7237c264c3e0190918510e1b239fc6dd1efdfcd0nicholasbishop (unsigned int)ioloop_time);
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmentalstatic void cmd_log_reopen(int argc ATTR_UNUSED, char *argv[] ATTR_UNUSED)
9496d940d814b037c16b03e111bd238e57684125nicholasbishop /* 1 << enum log_type */
9496d940d814b037c16b03e111bd238e57684125nicholasbishop unsigned int mask;
9496d940d814b037c16b03e111bd238e57684125nicholasbishopstatic void cmd_log_find_add(struct log_find_context *ctx,
9496d940d814b037c16b03e111bd238e57684125nicholasbishop file = p_new(ctx->pool, struct log_find_file, 1);
9496d940d814b037c16b03e111bd238e57684125nicholasbishop file->path = key = p_strdup(ctx->pool, path);
22bba30d53c7a27c4437b6f9de3c3740b8f30850John Smithcmd_log_find_syslog_files(struct log_find_context *ctx, const char *path)
d67024fee7c560721468212767fb6aa221d5b542John Smith /* recursively go through all subdirectories */
d67024fee7c560721468212767fb6aa221d5b542John Smith cmd_log_find_syslog_files(ctx, str_c(full_path));
9496d940d814b037c16b03e111bd238e57684125nicholasbishop file = p_new(ctx->pool, struct log_find_file, 1);
f1f9ad8176ddd6913180a1fb76e7ce1558e6a82eMarc Jeanmouginstatic bool log_type_find(const char *str, enum log_type *type_r)
f1f9ad8176ddd6913180a1fb76e7ce1558e6a82eMarc Jeanmougin unsigned int i;
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental for (i = 0; i < LAST_LOG_TYPE; i++) {
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental if (strncasecmp(str, failure_log_type_prefixes[i], len) == 0 &&
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmentalstatic void cmd_log_find_syslog_file_messages(struct log_find_file *file)
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental const char *line, *p;
02df4842dc780e15999cae54bad38b11ed197b90nicholasbishop input = i_stream_create_fd_autoclose(&fd, 1024);
02df4842dc780e15999cae54bad38b11ed197b90nicholasbishop while ((line = i_stream_read_next_line(input)) != NULL) {
5c2e73cb2043701f57ea09c4e609e3a51004a828Alex Valavanis /* <type> log */
5c2e73cb2043701f57ea09c4e609e3a51004a828Alex Valavanisstatic void cmd_log_find_syslog_messages(struct log_find_context *ctx)
5c2e73cb2043701f57ea09c4e609e3a51004a828Alex Valavanis while (hash_table_iterate(iter, ctx->files, &key, &file)) {
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmentalcmd_log_find_syslog(struct log_find_context *ctx, int argc, char *argv[])
063bb27bebc4a01eefa879017c819a0058548955mental const char *log_dir;
063bb27bebc4a01eefa879017c819a0058548955mental else if (stat("/var/log", &st) == 0 && S_ISDIR(st.st_mode))
063bb27bebc4a01eefa879017c819a0058548955mental else if (stat("/var/adm", &st) == 0 && S_ISDIR(st.st_mode))
24efdd63267aa7bc6958eb9116285730174f9b74Alex Valavanis /* give syslog some time to write the messages to files */
70ec876c756620ca1d28d8861e47cbe37c21b2fcapenner unsigned int i;
7fcc133d7a6abd9200846c75e46a29ae74ff4a3fAlex Valavanis ctx.pool = pool_alloconly_create("log file", 1024*32);
7fcc133d7a6abd9200846c75e46a29ae74ff4a3fAlex Valavanis hash_table_create(&ctx.files, ctx.pool, 0, str_hash, strcmp);
7fcc133d7a6abd9200846c75e46a29ae74ff4a3fAlex Valavanis /* first get the paths that we know are used */
02df4842dc780e15999cae54bad38b11ed197b90nicholasbishop set = master_service_settings_get(master_service);
7fcc133d7a6abd9200846c75e46a29ae74ff4a3fAlex Valavanis cmd_log_find_add(&ctx, log_file_path, LOG_TYPE_WARNING);
6ec5144d37a7fc9228eb04f7ebd8b2c7bfead332nicholasbishop cmd_log_find_add(&ctx, log_file_path, LOG_TYPE_ERROR);
04d2e120ddfbd611206889d33696c7a1cf103e14nicholasbishop cmd_log_find_add(&ctx, log_file_path, LOG_TYPE_FATAL);
6ec5144d37a7fc9228eb04f7ebd8b2c7bfead332nicholasbishop cmd_log_find_add(&ctx, log_file_path, LOG_TYPE_INFO);
5cd6256452c48fa9071c560b8b4d002cdb3593deinsaner cmd_log_find_add(&ctx, log_file_path, LOG_TYPE_DEBUG);
f1f9ad8176ddd6913180a1fb76e7ce1558e6a82eMarc Jeanmougin strcmp(set->info_log_path, "syslog") == 0 ||
f1f9ad8176ddd6913180a1fb76e7ce1558e6a82eMarc Jeanmougin strcmp(set->debug_log_path, "syslog") == 0) {
70ec876c756620ca1d28d8861e47cbe37c21b2fcapenner /* at least some logs were logged via syslog */
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental /* print them */
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmental for (i = 0; i < LAST_LOG_TYPE; i++) {
3f32b7eb40422e3a8172495cad80a2f40a563d9cJon A. Cruz while (hash_table_iterate(iter, ctx.files, &key, &file)) {
e516eaa7497ddc87b5f6a96941d316d265b46ebcjucablues printf("%sNot found\n", failure_log_type_prefixes[i]);
e516eaa7497ddc87b5f6a96941d316d265b46ebcjucabluesstatic const char *t_cmd_log_error_trim(const char *orig)
8f40ed19303d1d55144ded13fa6e3465134ffbbbinsaner /* Trim whitespace from suffix and remove ':' if it exists */
cd090649718da48f667e425406f075cbd81d29f7JucaBlues return orig[pos] == '\0' ? orig : t_strndup(orig, pos);
6e369d7e74c36e07f5fb1e27d37923fbed7dd89cmentalstatic void cmd_log_error_write(const char *const *args, time_t min_timestamp)
47ecd8bd5fb672cd99c3cd0445360e421a4d6a42jucablues /* <type> <timestamp> <prefix> <text> */
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop unsigned int type;
5fdfb2a8aa9c3fb2d1c7d2f8b183a3643a4bc300tavmjong-free /* find type's prefix */
d16763fbe2a4e6b778d417469a8f047e86ffab91nicholasbishop for (type = 0; type < LOG_TYPE_COUNT; type++) {
d297097bc1b9d4e074089ea5d649c2a0d270ff42nicholasbishop if (strcmp(args[0], failure_log_type_names[type]) == 0) {
2ef3c2ef15d6c81069a1f6abeb5bdf502d18f616nicholasbishop doveadm_print(t_strflocaltime(LOG_TIMESTAMP_FORMAT, t));
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishop doveadm_print(t_cmd_log_error_trim(args[2]));
b068af856bbc33238f425b3221426aa52e554ce0nicholasbishop doveadm_print(t_cmd_log_error_trim(type_prefix));
7237c264c3e0190918510e1b239fc6dd1efdfcd0nicholasbishopstatic void cmd_log_errors(int argc, char *argv[])
72ca199b70b9c4f5e9bbc921ac85fe9e3f9932b9mental switch (c) {
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan input = i_stream_create_fd_autoclose(&fd, (size_t)-1);
} T_END;
void doveadm_register_log_commands(void)