Command-line history logging utilities
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

124 lines
2.4 KiB

#!/usr/bin/env perl
=pod
=head1 NAME
commandlog-log - show commandlog history
=head1 SYNOPSIS
# Get most recent log entries:
commandlog log
# Get the 100 most recent log entries:
commandlog log -n 100
# Get all log entries:
commandlog log -n 0
# Get entries for January 1st (this is crap and needs work):
commandlog log --after="2019-01-01 00:00:00" --before="2019-01-02 00:00:00"
# Get entries for the current directory:
commandlog log --path .
# Run some query with debugging output enabled:
commandlog log --debug [...]
=head1 AUTHOR
Brennen Bearnes
=cut
use warnings;
use strict;
use 5.10.0;
use Cwd;
use Data::Dumper;
use DBI;
use File::Spec;
use Getopt::Long;
use Pod::Usage;
use SQL::Abstract;
use Sys::Hostname;
use App::CommandLog;
# Handle options, including help generated from the POD above.
my $debug = 0;
my $limit;
my $before_date;
my $after_date;
my $path;
GetOptions(
'debug' => \$debug,
'number=s' => \$limit,
'before=s' => \$before_date,
'after=s' => \$after_date,
'path=s' => \$path,
'help' => sub { pod2usage(0) },
) or pod2usage(2);
unless (defined $limit) {
unless ($before_date || $after_date) {
$limit = 10;
}
}
my %where = ();
if (length($after_date) && length($before_date))
{
# We have both a start and an endpoint.
$where{datetime} = [ '-and' => { '>', $after_date },
{ '<', $before_date } ];
}
elsif (length($after_date))
{
# Just a starting point.
$where{datetime} = { '>', $after_date };
}
elsif (length($before_date))
{
# Just an ending point.
$where{datetime} = { '<', $before_date };
}
if (defined $path) {
# Resolve stuff like ".", "..", etc.:
my $abs_path = File::Spec->rel2abs($path);
$where{path} = { '=', $abs_path };
}
my $limit_clause = '';
if ($limit) {
$limit_clause = sprintf(' LIMIT %d', $limit);
}
my $dbfile = $ENV{HOME} . "/cli.db";
my $dbh = App::CommandLog::get_dbh($dbfile);
my $sql = SQL::Abstract->new;
my ($query, @bind) = $sql->select(
'commands',
'*',
\%where,
{-desc => 'datetime'}
);
if ($debug) {
say STDERR $query . $limit_clause;
say STDERR Dumper(%where);
say STDERR Dumper(@bind);
}
my $sth = $dbh->prepare($query . $limit_clause);
$sth->execute(@bind);
while (my $data = $sth->fetchrow_hashref()) {
say join "\t", $data->{id}, $data->{datetime}, $data->{command};
}
$sth->execute();