]> www.infradead.org Git - users/mchehab/rasdaemon.git/commitdiff
ras-mc-ctl: add support for queuing the errors
authorMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 29 May 2013 12:33:45 +0000 (09:33 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 29 May 2013 13:16:04 +0000 (10:16 -0300)
As the mc_event table is filled by rasdaemon, we need a tool to
extract data from it.

So, use the existing perl script for the basic queries.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
configure.ac
misc/rasdaemon.spec.in
util/ras-mc-ctl.in

index 14767ae96ff0221c7529eb36f364f2474877bca9..eae3ef435cdd8f15ca5921b5c5bc156a2a2102a4 100644 (file)
@@ -60,6 +60,8 @@ CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -Wstrict-prototypes"
 AC_SUBST([rasstatedir], [$localstatedir/lib/rasdaemon])
 AC_DEFINE_DIR([RASSTATEDIR], [rasstatedir], [rasdaemon db store state dir])
 AC_SUBST([RASSTATEDIR])
+
 AC_DEFINE([RAS_DB_FNAME], ["ras-mc_event.db"], [ras events database])
+AC_SUBST([RAS_DB_FNAME], ["ras-mc_event.db"])
 
 AC_OUTPUT
index 6fc46fb0ae1208dab9270da15dbe893a1fa2d367..5850691a82695e71e6c07f6bd2d73059a037277d 100644 (file)
@@ -7,7 +7,7 @@ License:                GPLv2
 URL:                   https://git.fedorahosted.org/git/rasdaemon.git
 Source0:               http://mchehab.fedorapeople.org/@PACKAGE@-@PACKAGE_VERSION@.tar.bz2
 BuildRoot:             %{_tmppath}/%{name}-%{version}-%{release}
-Requires:              hwdata, dmidecode
+Requires:              hwdata, dmidecode, perl-dbd-sqlite
 BuildRequires:         autoconf, automake, gettext-devel, libtool, sqlite-devel
 ExclusiveArch:         %{ix86} x86_64
 Requires(post):                systemd-units
index 895469f00c9506da923dcc45471d17fe46d11b40..32c4edb3106b790ef5ca6d07fe13e6d1d19c90f3 100755 (executable)
@@ -35,6 +35,7 @@ use File::Find;
 use Getopt::Long;
 use POSIX;
 
+my $dbname      = "@RASSTATEDIR@/@RAS_DB_FNAME@";
 my $prefix      = "@prefix@";
 my $sysconfdir  = "@sysconfdir@";
 my $dmidecode   = find_prog ("dmidecode");
@@ -71,6 +72,8 @@ Usage: $prog [OPTIONS...]
  --delay=N          Delay N seconds before writing DIMM labels.
  --labeldb=DB       Load label database from file DB.
  --layout           Display the memory layout.
+ --summary          Presents a summary of the logged errors.
+ --errors           Shows the errors stored at the error database.
  --help             This help message.
 EOF
 
@@ -107,6 +110,14 @@ if ($conf{opt}{status}) {
     exit ($status ? 0 : 1);
 }
 
+if ($conf{opt}{summary}) {
+    summary ();
+}
+
+if ($conf{opt}{errors}) {
+    errors ();
+}
+
 exit (0);
 
 sub parse_cmdline
@@ -119,6 +130,8 @@ sub parse_cmdline
     $conf{opt}{delay} = 0;
     $conf{opt}{display_memory_layout} = 0;
     $conf{opt}{guess_dimm_label} = 0;
+    $conf{opt}{summary} = 0;
+    $conf{opt}{errors} = 0;
 
     my $rref = \$conf{opt}{report};
     my $mref = \$conf{opt}{mainboard};
@@ -133,7 +146,10 @@ sub parse_cmdline
                          "delay:s" =>         \$conf{opt}{delay},
                          "labeldb=s" =>       \$conf{labeldb},
                          "status" =>          \$conf{opt}{status},
-                        "layout" =>          \$conf{opt}{display_memory_layout});
+                         "layout" =>          \$conf{opt}{display_memory_layout},
+                         "summary" =>         \$conf{opt}{summary},
+                         "errors" =>          \$conf{opt}{errors}
+            );
 
     usage(1) if !$rc;
 
@@ -805,6 +821,49 @@ sub find_prog
     return "";
 }
 
+sub summary
+{
+    require DBI;
+
+    my $dbh = DBI->connect("dbi:SQLite:dbname=$dbname", "", "", {});
+
+    my $query = "select top_layer,middle_layer,lower_layer, count(*) from mc_event group by top_layer,middle_layer,lower_layer";
+    my $query_handle = $dbh->prepare($query);
+    $query_handle->execute();
+
+    $query_handle->bind_columns(\my($top, $mid, $low, $count));
+
+    print "Memory controller events summary:\n";
+    while($query_handle->fetch()) {
+        print "location: $top:$mid:$low errors: $count\n";
+    }
+
+    $query_handle->finish;
+    undef($dbh);
+}
+
+sub errors
+{
+    require DBI;
+
+    my $dbh = DBI->connect("dbi:SQLite:dbname=$dbname", "", "", {});
+
+    my $query = "select id, timestamp, err_count, err_type, err_msg, label, mc, top_layer,middle_layer,lower_layer, address, grain, syndrome, driver_detail from mc_event order by id";
+
+    my $query_handle = $dbh->prepare($query);
+    $query_handle->execute();
+
+    $query_handle->bind_columns(\my($id, $time, $count, $type, $msg, $label, $mc, $top, $mid, $low, $addr, $grain, $syndrome, $detail));
+
+    print "Memory controller events:\n";
+    while($query_handle->fetch()) {
+        print "$id $time $count $type error(s): $msg at $label location: $mc:$top:$mid:$low, addr $addr, grain $grain, syndrome $syndrome $detail\n";
+    }
+
+    $query_handle->finish;
+    undef($dbh);
+}
+
 sub log_msg   { print STDERR "$prog: ", @_ unless $conf{opt}{quiet}; }
 sub log_error { log_msg ("Error: @_"); }