summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2011-03-16 17:01:59 +0100
committerKarel Klic <kklic@redhat.com>2011-03-16 17:01:59 +0100
commitfdff56470b7efcd863aa553a11d4527c6450a52a (patch)
tree36aca30306e254dc512313b16938b7f6c61dcf7f
parentaabe431a2126782243050d336130bcf76606b9b8 (diff)
parent238ccf5d227daad08bc4f0111e6eff97456bd82b (diff)
downloadabrt-fdff56470b7efcd863aa553a11d4527c6450a52a.tar.gz
abrt-fdff56470b7efcd863aa553a11d4527c6450a52a.tar.xz
abrt-fdff56470b7efcd863aa553a11d4527c6450a52a.zip
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
-rw-r--r--src/daemon/abrt_event.conf2
-rw-r--r--src/gui-gtk/main.c7
-rw-r--r--src/gui-wizard-gtk/main.c10
-rw-r--r--src/lib/make_descr.c40
-rwxr-xr-xsrc/plugins/abrt-action-install-debuginfo.py10
-rw-r--r--src/plugins/abrt-dump-oops.c96
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) */