#!/usr/local/bin/perl -w
###########################################
# daily-incidents
# Mike Schilli, 2013 (m@perlmeister.com)
###########################################
use strict;
use XML::Simple;
use LWP::UserAgent;
use JSON qw( from_json );
use Text::ASCIITable;
use Net::SMTP;
use Email::MIME;
use File::Basename;

my $host        = "127.0.0.1";
my $port        = 8089;
my $login_path  = 
     "servicesNS/admin/search/auth/login";
my $user        = "admin";
my $password    = "changeme";
my $from_email  = 'm@perlmeister.com';
my $to_email    = $from_email;
my $subject     = 'Daily Incidents';
my $smtp_server = 'smtp.provider.net';

my $ua = LWP::UserAgent->new( ssl_opts => 
  { verify_hostname => 0 } );

my $resp = $ua->post( 
  "https://$host:$port/$login_path", 
  { username => $user, 
    password => $password } );

if( $resp->is_error() ) {
  die "Login failed: ", $resp->message();
}

my $data = XMLin( $resp->content() );
my $key  = $data->{ sessionKey };

my $header = HTTP::Headers->new( 
  Authorization => "Splunk $key" );
$ua->default_headers( $header );

$resp = $ua->post( 
  "https://$host:$port/servicesNS" .
  "/admin/search/search/jobs/export",
  { search => "search fail* OR error " .
     "NOT eventtype=chatter earliest=-24h",
    output_mode => "json",
  },
);

my $t = Text::ASCIITable->new( { 
  headingText => $subject } );
$t->setCols( "date", "source", "log" );
$t->setColWidth( "date", 10 );
$t->setColWidth( "log",  34 );

for my $line ( split /\n/, 
                     $resp->content() ) {
  my $data = from_json( $line );
  next if !exists $data->{ result };
  my $r = $data->{ result };
  $t->addRow( $r->{ _time }, 
              basename( $r->{ source } ), 
              $r->{ _raw } );
}

my $smtp = Net::SMTP->new( $smtp_server );

my $email = Email::MIME->create(
  header_str => [ 
    From    => $from_email,
    To      => $to_email,
    Subject => $subject,
  ],
  parts => [
    Email::MIME->create(
      attributes => {
        content_type => "text/html",
        disposition  => "inline",
        charset      => "UTF-8",
        encoding     => "quoted-printable",
      },
      body_str => 
        "<html><pre>$t</pre></html>",
    )
  ],
);

$smtp->mail( $from_email );
$smtp->to( $to_email );
$smtp->data();
$smtp->datasend( $email->as_string );
$smtp->dataend();
$smtp->quit();
