diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/daemon/abrt_event.conf | 2 | ||||
-rw-r--r-- | src/gui-gtk/main.c | 7 | ||||
-rw-r--r-- | src/gui-wizard-gtk/main.c | 10 | ||||
-rw-r--r-- | src/lib/make_descr.c | 40 | ||||
-rwxr-xr-x | src/plugins/abrt-action-install-debuginfo.py | 10 | ||||
-rw-r--r-- | src/plugins/abrt-dump-oops.c | 96 |
6 files changed, 98 insertions, 67 deletions
diff --git a/src/daemon/abrt_event.conf b/src/daemon/abrt_event.conf index 191782c1..2c78bfa9 100644 --- a/src/daemon/abrt_event.conf +++ b/src/daemon/abrt_event.conf @@ -74,6 +74,6 @@ EVENT=post-create analyzer=Kerneloops abrt-action-analyze-oops } 2>/dev/null -EVENT=report analyzer=Kerneloops abrt-action-kerneloops +EVENT=report_kerneloops.org analyzer=Kerneloops abrt-action-kerneloops EVENT=report_Bugzilla analyzer=Python abrt-action-bugzilla -c /etc/abrt/plugins/Bugzilla.conf EVENT=report_Logger abrt-action-print -o "${Log_File:-/var/log/abrt.log}" diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c index 3a8b4aa8..fd1e9d57 100644 --- a/src/gui-gtk/main.c +++ b/src/gui-gtk/main.c @@ -20,6 +20,9 @@ #include "abrtlib.h" #include "parse_options.h" #include "abrt-gtk.h" +#if HAVE_LOCALE_H +# include <locale.h> +#endif #define PROGNAME "abrt-gtk" @@ -61,6 +64,10 @@ int main(int argc, char **argv) { /* I18n */ setlocale(LC_ALL, ""); +#if ENABLE_NLS + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); +#endif gtk_init(&argc, &argv); diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c index 8e00271a..3dc0b824 100644 --- a/src/gui-wizard-gtk/main.c +++ b/src/gui-wizard-gtk/main.c @@ -21,6 +21,9 @@ #include "parse_options.h" #include "wizard.h" #include "libreport-gtk.h" +#if HAVE_LOCALE_H +# include <locale.h> +#endif #define PROGNAME "bug-reporting-wizard" @@ -59,6 +62,13 @@ void reload_crash_data_from_dump_dir(void) int main(int argc, char **argv) { + /* I18n */ + setlocale(LC_ALL, ""); +#if ENABLE_NLS + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); +#endif + gtk_init(&argc, &argv); char *env_verbose = getenv("ABRT_VERBOSE"); diff --git a/src/lib/make_descr.c b/src/lib/make_descr.c index 1ebdfc4d..08c9bca2 100644 --- a/src/lib/make_descr.c +++ b/src/lib/make_descr.c @@ -117,6 +117,7 @@ char* make_description_mailx(crash_data_t *crash_data) char* make_description_bz(crash_data_t *crash_data) { struct strbuf *buf_dsc = strbuf_new(); + struct strbuf *buf_big_dsc = strbuf_new(); struct strbuf *buf_long_dsc = strbuf_new(); GHashTableIter iter; @@ -126,6 +127,7 @@ char* make_description_bz(crash_data_t *crash_data) while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value)) { struct stat statbuf; + int stat_err = 0; unsigned flags = value->flags; const char *content = value->content; if (flags & CD_FLAG_TXT) @@ -153,7 +155,6 @@ char* make_description_bz(crash_data_t *crash_data) /* Not one-liner */ if (buf_long_dsc->len != 0) strbuf_append_char(buf_long_dsc, '\n'); - strbuf_append_str(buf_long_dsc, tmp); } else @@ -164,7 +165,7 @@ char* make_description_bz(crash_data_t *crash_data) else { statbuf.st_size = strlen(content); - goto add_attachment_info; + goto add_big_file_info; } } if (flags & CD_FLAG_BIN) @@ -172,28 +173,27 @@ char* make_description_bz(crash_data_t *crash_data) /* In many cases, it is useful to know how big binary files are * (for example, helps with diagnosing bug upload problems) */ - if (stat(content, &statbuf) != 0) - statbuf.st_size = (off_t) -1; - - add_attachment_info: ; - char *descr; - if (statbuf.st_size >= 0) - descr = xasprintf("%s, %llu bytes", name, (long long)statbuf.st_size); - else - descr = xstrdup(name); - bool was_multiline = 0; - char *tmp = NULL; - add_content(&was_multiline, &tmp, "Attached file", descr); - free(descr); - strbuf_append_str(buf_dsc, tmp); - free(tmp); + stat_err = stat(content, &statbuf); + add_big_file_info: + strbuf_append_strf(buf_big_dsc, + (stat_err ? "%s file: %s\n" : "%s file: %s, %llu bytes\n"), + ((flags & CD_FLAG_BIN) ? "Binary" : "Text"), + name, + (long long)statbuf.st_size + ); } } - /* One-liners go first, then multi-line items */ - if (buf_dsc->len != 0 && buf_long_dsc->len != 0) - strbuf_append_char(buf_dsc, '\n'); + /* One-liners go first, then big files, then multi-line items */ + if (buf_dsc->len != 0 && (buf_big_dsc->len != 0 || buf_long_dsc->len != 0)) + strbuf_append_char(buf_dsc, '\n'); /* add empty line */ + + if (buf_big_dsc->len != 0 && buf_long_dsc->len != 0) + strbuf_append_char(buf_big_dsc, '\n'); /* add empty line */ + char *big_dsc = strbuf_free_nobuf(buf_big_dsc); + strbuf_append_str(buf_dsc, big_dsc); + free(big_dsc); char *long_dsc = strbuf_free_nobuf(buf_long_dsc); strbuf_append_str(buf_dsc, long_dsc); diff --git a/src/plugins/abrt-action-install-debuginfo.py b/src/plugins/abrt-action-install-debuginfo.py index 2fc9af8c..6eaaae8a 100755 --- a/src/plugins/abrt-action-install-debuginfo.py +++ b/src/plugins/abrt-action-install-debuginfo.py @@ -239,7 +239,7 @@ class DebugInfoDownload(YumBase): if verbose != 0 or len(not_found) != 0: print _("Can't find packages for %u debuginfo files") % len(not_found) if verbose != 0 or total_pkgs != 0: - print _("Found %u packages to download") % total_pkgs + print _("Packages to download: %u") % total_pkgs print _("Downloading %.2fMb, installed size: %.2fMb") % ( todownload_size / (1024**2), installed_size / (1024**2) @@ -302,7 +302,7 @@ def log2(message): print "LOG2:", message #eu_unstrip_OUT=`eu-unstrip "--core=$core" -n 2>eu_unstrip.ERR` -def extract_info_from_core(corefile): +def extract_info_from_core(coredump_name): """ Extracts builds with filenames, Returns a list of tuples (build_id, filename) @@ -313,8 +313,8 @@ def extract_info_from_core(corefile): #SEP = 3 EXECUTABLE = 4 - print _("Analyzing corefile '%s'") % corefile - eu_unstrip_OUT = Popen(["eu-unstrip","--core=%s" % corefile, "-n"], stdout=PIPE, bufsize=-1).communicate()[0] + print _("Analyzing coredump '%s'") % coredump_name + eu_unstrip_OUT = Popen(["eu-unstrip","--core=%s" % coredump_name, "-n"], stdout=PIPE, bufsize=-1).communicate()[0] # parse eu_unstrip_OUT and return the list of build_ids # eu_unstrip_OUT = ("0x7f42362ca000+0x204000 c4d35d993598a6242f7525d024b5ec3becf5b447@0x7f42362ca1a0 /usr/lib64/libcanberra-gtk.so.0 - libcanberra-gtk.so.0\n" @@ -333,7 +333,7 @@ def extract_info_from_core(corefile): #print eu_unstrip_OUT # we failed to get build ids from the core -> die if not eu_unstrip_OUT: - print "Can't get build ids from %s" % corefile + print "Can't get build ids from %s" % coredump_name return RETURN_FAILURE lines = eu_unstrip_OUT.split('\n') diff --git a/src/plugins/abrt-dump-oops.c b/src/plugins/abrt-dump-oops.c index 5b6a2062..0a38b6ae 100644 --- a/src/plugins/abrt-dump-oops.c +++ b/src/plugins/abrt-dump-oops.c @@ -66,47 +66,47 @@ struct line_info { char level; }; -static int record_oops(GList **oopses, struct line_info* lines_info, int oopsstart, int oopsend) +static int record_oops(GList **oops_list, struct line_info* lines_info, int oopsstart, int oopsend) { int q; int len; - char *oops; - char *version; + int rv = 1; len = 2; for (q = oopsstart; q <= oopsend; q++) - len += strlen(lines_info[q].ptr) + 1; - - oops = (char*)xzalloc(len); + len += strlen(lines_info[q].ptr) + 1; - version = NULL; - for (q = oopsstart; q <= oopsend; q++) + /* too short oopses are invalid */ + if (len > 100) { - if (!version) - version = extract_version(lines_info[q].ptr); - - if (lines_info[q].ptr[0]) + char *oops = (char*)xzalloc(len); + char *dst = oops; + char *version = NULL; + for (q = oopsstart; q <= oopsend; q++) { - strcat(oops, lines_info[q].ptr); - strcat(oops, "\n"); + if (!version) + version = extract_version(lines_info[q].ptr); + if (lines_info[q].ptr[0]) + { + dst = stpcpy(dst, lines_info[q].ptr); + dst = stpcpy(dst, "\n"); + } } + if ((dst - oops) > 100) + queue_oops(oops_list, oops, version ? version : "undefined"); + else + /* too short oopses are invalid */ + rv = 0; + free(oops); + free(version); } - int rv = 1; - /* too short oopses are invalid */ - if (strlen(oops) > 100) - queue_oops(oopses, oops, version ? version : "undefined"); - else - { - VERB3 log("Dropped oops: too short"); - rv = 0; - } - free(oops); - free(version); + + VERB3 if (rv == 0) log("Dropped oops: too short"); return rv; } #define REALLOC_CHUNK 1000 -static int extract_oopses(GList **oopses, char *buffer, size_t buflen) +static int extract_oopses(GList **oops_list, char *buffer, size_t buflen) { char *c; int linecount = 0; @@ -353,7 +353,7 @@ next_line: if (oopsend <= i) { VERB3 log("End of oops at line %d (%d): '%s'", oopsend, i, lines_info[oopsend].ptr); - if (record_oops(oopses, lines_info, oopsstart, oopsend)) + if (record_oops(oops_list, lines_info, oopsstart, oopsend)) oopsesfound++; oopsstart = -1; inbacktrace = 0; @@ -388,7 +388,7 @@ next_line: { int oopsend = i-1; VERB3 log("End of oops at line %d (end of file): '%s'", oopsend, lines_info[oopsend].ptr); - if (record_oops(oopses, lines_info, oopsstart, oopsend)) + if (record_oops(oops_list, lines_info, oopsstart, oopsend)) oopsesfound++; } @@ -420,14 +420,21 @@ static int scan_syslog_file(GList **oops_list, int fd, struct stat *statbuf, int off_t cur_pos = lseek(fd, 0, SEEK_CUR); if (statbuf->st_size <= cur_pos) + { + /* If file was truncated, treat it as a new file. + * (changing inode# causes caller to think that file was closed or renamed) + */ + if (statbuf->st_size < cur_pos) + statbuf->st_ino++; return partial_line_len; /* we are at EOF, nothing to do */ + } VERB3 log("File grew by %llu bytes, from %llu to %llu", (long long)(statbuf->st_size - cur_pos), (long long)(cur_pos), (long long)(statbuf->st_size)); - /* Do not try to allocate an absurd amount of memory. */ + /* Do not try to allocate an absurd amount of memory */ int sz = MAX_SCAN_BLOCK - READ_AHEAD; if (sz > statbuf->st_size - cur_pos) sz = statbuf->st_size - cur_pos; @@ -476,13 +483,10 @@ static int save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt) { unsigned countdown = 16; /* do not report hundreds of oopses */ unsigned idx = oops_cnt; - time_t t = time(NULL); - pid_t my_pid = getpid(); - VERB1 log("Saving %u oopses as crash dump dirs", idx >= countdown ? countdown-1 : idx); + VERB1 log("Saving %u oopses as dump dirs", idx >= countdown ? countdown-1 : idx); char *tainted_str = NULL; - /* once tainted flag is set to 1, only restart can reset the flag to 0 */ FILE *tainted_fp = fopen("/proc/sys/kernel/tainted", "r"); if (tainted_fp) { @@ -490,41 +494,47 @@ static int save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt) fclose(tainted_fp); } else - error_msg("/proc/sys/kernel/tainted does not exist"); + perror_msg("Can't open '%s'", "/proc/sys/kernel/tainted"); + time_t t = time(NULL); + const char *iso_date = iso_date_string(&t); + uid_t my_euid = geteuid(); + pid_t my_pid = getpid(); int errors = 0; - while (idx != 0 && --countdown != 0) { - char path[sizeof(DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu") + 3 * sizeof(long)*3]; - sprintf(path, DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu", (long)t, (long)my_pid, (long)idx); + char path[sizeof(DEBUG_DUMPS_DIR"/oops-YYYY-MM-DD-hh:mm:ss-%lu-%lu") + 2 * sizeof(long)*3]; + sprintf(path, DEBUG_DUMPS_DIR"/oops-%s-%lu-%lu", iso_date, (long)my_pid, (long)idx); char *first_line = (char*)g_list_nth_data(oops_list, --idx); char *second_line = (char*)strchr(first_line, '\n'); /* never NULL */ *second_line++ = '\0'; - struct dump_dir *dd = dd_create(path, /*uid:*/ 0); + struct dump_dir *dd = dd_create(path, /*uid:*/ my_euid); if (dd) { dd_create_basic_files(dd, /*uid:*/ 0); dd_save_text(dd, FILENAME_ANALYZER, "Kerneloops"); +// TODO: drop FILENAME_EXECUTABLE? dd_save_text(dd, FILENAME_EXECUTABLE, "kernel"); dd_save_text(dd, FILENAME_KERNEL, first_line); +// TODO: drop FILENAME_CMDLINE? dd_save_text(dd, FILENAME_CMDLINE, "not_applicable"); dd_save_text(dd, FILENAME_BACKTRACE, second_line); - /* Optional, makes generated bz more informative */ +// TODO: add "Kernel oops: " prefix, so that all oopses have recognizable FILENAME_REASON? +// kernel oops 1st line may look quite puzzling otherwise... strchrnul(second_line, '\n')[0] = '\0'; dd_save_text(dd, FILENAME_REASON, second_line); if (tainted_str && tainted_str[0] != '0') dd_save_text(dd, FILENAME_TAINTED, tainted_str); - free(tainted_str); dd_close(dd); } else errors++; } + free(tainted_str); return errors; } @@ -607,7 +617,7 @@ int main(int argc, char **argv) ino_t fd_ino = statbuf.st_ino; if (stat(filename, &statbuf) != 0 || statbuf.st_ino != fd_ino) /* yes */ { - VERB2 log("Can't stat '%s', closing fd", filename); + VERB2 log("Inode# changed, closing fd"); close(file_fd); if (wd >= 0) inotify_rm_watch(inotify_fd, wd); @@ -702,6 +712,10 @@ int main(int argc, char **argv) * the code will handle all possibilities. */ VERB3 log("Change in '%s' detected", filename); + /* Let them finish writing to the log file. otherwise + * we may end up trying to analyze partial oops. + */ + sleep(1); } } /* while (1) */ |