#!/usr/bin/perl -w
# $Id: dmesg 6 2011-12-04 21:29:01Z sanders $
#
# perly dmesg filter for human readable timestamps
# 
use strict;

my $show_age = 1; # Switch to show age of events instead of uptime at event.

foreach my $argv (@ARGV) {
	if ($argv =~ m#-u|--uptime#) {
		$show_age = 0;
	}
    if ($argv =~ m#-h|--help#) {
        showHelp();
    }
}

my $cur_uptime = `/usr/bin/awk '{print \$1}' /proc/uptime`;
chomp($cur_uptime);

open (DMESG, "/bin/dmesg|") or die "Can't exec dmesg: $!\n";
while (my $line = <DMESG>) {
	if ($line =~ /^\[\s*?(\d+\.\d+)\]\s/) {
		my $uptime_at_event = $1;

		my $diff = 0;
		if ($show_age) {
			$diff = $cur_uptime - $uptime_at_event;
		} else {
			$diff = $uptime_at_event;
		}

		my $day = int($diff / 86400); $diff -= ($day * 86400);
		my $hrs = int($diff / 3600); $diff -= ($hrs * 3600);
		my $min = int($diff / 60); $diff -= ($min * 60);
		my $sec = $diff;

		my $formatted = sprintf("%03dd%02dh%02dm%02ds", $day, $hrs, $min, $sec);
		$line =~ s/^\[\s*?\d+\.\d+\]/[$formatted]/;
		print "$line";
	}
}
close(DMESG);
exit 0;

########

sub showHelp {
    print "perly dmesg filter for human readable timestamps\n\n";
    print "defaults to displaying how long ago it was an event occurred.\n";
    print "use -u to display events timed since boot (default dmesg style)\n";
    exit 0;
}
