#! /bin/sh -e

# enables running as
#  $ DEBUG=yes lr_vendor_cron daily
#
DEBUG=${DEBUG:-no}

# syslog(3) messages priority, logger's -p flag.  ``facility.level''
# running e.g.
#  PRIORITY=local2.info lr_vendor_cron daily
# enables nice lire-specific logfile creation.
#
# daemon.info might be ok as a default too.
PRIORITY=${PRIORITY:-user.info}

# user to su to, and invoke lr_log2mail
LIREUSER=${LIREUSER:-lire}

debug () {
    test "$DEBUG" = "yes" && echo 2>&1 $PROGRAM: "$@"
    return 0
}

PROGRAM=lr_vendor_cron

if test $# -ne 1; then
    echo >&2 "Usage $PROGRAM daily/weekly/monthly"
    exit 1
fi

target=$1

for d in /etc/sysconfig/lire.d /etc/default/lire.d
do
    test -d $d && CONFDIR=$d && break
done

if test -z "$CONFDIR"
then
    debug "Configuration directory CONFDIR not found"
    exit 0
fi

if ls -- $CONFDIR/*.cfg > /dev/null 2>&1
then
    :
else
    debug "No log configuration files in $CONFDIR"
    exit 0
fi

for f in $CONFDIR/*.cfg
do
  name=`basename $f`
  if test ! -r $f
  then
      debug "can't read $f"
      continue
  fi

  # Reset variables
  daemon=
  service=
  logfile=
  filter=
  rotateperiod=
  extraopts=

  . $f

  test -z "$daemon" && debug "daemon isn't set in $f" && continue
  test -z "$service" && debug "service isn't set in $f" && continue
  test -z "$logfile" && debug "logfile isn't set in $f" && continue
  test -z "$rotateperiod" && debug "rotateperiod isn't set in $f" && continue
  test -z "$filter" && filter="cat"

  # Check to see if the daemon is present. No point in generating
  # reports which will be empty because there is no application
  # to generate logs
  if test ! -x $daemon
  then
      debug "Daemon $daemon, as listed in $name, is not present on the system"
      continue
  fi

  if test "$target" != "$rotateperiod"
  then
      debug "Skipping $name since we are not in the $rotateperiod run"
      continue
  fi

  if test ! -r $logfile
  then
      debug "Skipping $name since logfile $logfile doesn't exists."
      continue
  fi

  debug "Sending $rotateperiod $service report from $logfile to root"

  # use "su -": make sure LIREUSER will be in its own HOME, so that it can
  # savely do: o=`pwd`; cd foo; cd $o.  Scripts like lr_xml2pdf need a cwd
  # to which can get cd-ed.

  # better use sudo, if available?
  eval "$filter" < $logfile | \
    su - $LIREUSER -c \
    "lr_log2mail -s '$rotateperiod $service report from $logfile' $extraopts $service root" 2>&1 | logger -p $PRIORITY -t lire
done

exit 0

POD=<<'EOPOD'

=head1 NAME

lr_vendor_cron - generate Lire reports from all known log files on the system

=head1 SYNOPSIS

B<lr_vendor_cron> I<daily>B<|>I<weekly>B<|>I<monthly>

=head1 DESCRIPTION

B<lr_vendor_cron> is designed to be invoked by cron.  On systems supporting
/etc/cron.d/, this script can be invoked by creating /etc/cron.d/lire, which
should read e.g.:

 02 5 * * * root /usr/sbin/lr_vendor_cron daily
 22 5 * * 0 root /usr/sbin/lr_vendor_cron weekly
 42 5 1 * * root /usr/sbin/lr_vendor_cron monthly

B<lr_vendor_cron> reads files /etc/sysconfig/lire.d/*.cfg and
/etc/default/lire.d/*.cfg.  For each log file, such a file should exist.  The
files should set the following shell variables:

=over 4

=item daemon

the name of a binary which generated the specific log.  This is used
to test wether the *.cfg-file is suitable for the current system.
If you'd like to generate a log for which no daemon is present on
the current system, just use a placeholder like "daemon=/bin/true".

=item service

a Lire service, e.g. sendmail,

=item logfile

e.g.  /var/log/mail.log.1.gz,

=item filter

e.g. 'gzip -dc' or 'zcat | grep sendmail', and

=item rotateperiod

one of the supported lr_vendor_cron arguments.

=item extraopts

optional: extra options passed to lr_log2mail(1).  Set this to e.g. '--template
www_local'.

=back

After parsing the configuration files, B<lr_vendor_cron> invokes lr_log2mail(1)
on the `filter'ed log file. Reading and filtering the log is done as root,
lr_log2mail is run as user lire, using su(1).  Output is fed to logger(1).

=head1 SECURITY

B<lr_vendor_cron> is supposed to be run as root.  However, please note that
this script is distributed WITHOUT ANY WARRANTY.  If you don't like to run such
a script as root, make sure your lire user has read access to all log files
you'd like to get processed, and adapt this script.  We supply this script
mainly for people building packages.  On many Unix and GNU/Linux distributions,
it's hard to enforce log file readability by the lire user.  This script is
mainly a way to work around this.

=head1 ENVIRONMENT VARIABLES

B<lr_vendor_cron> honours DEBUG, CONFDIR, PRIORITY (for logger(1) call), and
LIREUSER.  Beware!  PRIORITY as used here is independent of the LR_FACILITY as
set in /etc/lire/defaults.  This script does not use any of the settings in
/etc/lire/defaults.

=head1 VERSION

$Id: lr_vendor_cron.in,v 1.14 2006/07/23 13:16:33 vanbaal Exp $

=head1 COPYRIGHT

Copyright (C) 2002, 2003 Stichting LogReport Foundation LogReport@LogReport.org
Copyright (C) 2005 Joost van Baal

This program is part of Lire.

Lire is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program (see COPYING); if not, check with
http://www.gnu.org/copyleft/gpl.html.


=head1 AUTHORS

Francis J. Lacoste <flacoste@logreport.org>, Joost van Baal
<joostvb@logreport.org>

=cut

EOPOD

