#! /usr/bin/env bash
#
# Delete logs older than ${logexpireminutes} minutes, and remove entries in
# stats.log older than ${statslogexpireinterval} days.

. `dirname $0`/zeekctl-config.sh

expire_statslog()
{
    if [ ${statslogexpireinterval} -eq 0 ]; then
        return 0
    fi

    if [ ! -d "${statsdir}" ]; then
        echo "expire-logs: directory not found: ${statsdir}"
        return 1
    fi

    slfile=${statsdir}/stats.log

    # Make sure the file exists and has nonzero size before continuing.
    if [ ! -s "$slfile" ]; then
        return 0
    fi

    now=`date +%s`

    # Convert to seconds and subtract this from the current time
    exptime=$(( now - 86400*statslogexpireinterval ))

    # Determine how many lines to remove from the beginning of stats.log
    # (no output means all lines are older than the expire time).
    nl=`awk -v expiretime=$exptime '{ if ( $1 > expiretime ) { print NR-1; exit } }' "$slfile"`

    if [ -z "$nl" ]; then
        > "$slfile"
    elif [ $nl -gt 0 ]; then
        sed "1,${nl}d" "$slfile" > "$slfile.new"
        if [ $? -ne 0 ]; then
            return 1
        fi
        mv "$slfile.new" "$slfile"
    fi
}

expire_log()
{
    if [ ${logexpireminutes} -eq 0 ]; then
        return 0
    fi

    find_cmd=find
    if [ "${os}" = "OpenBSD" ]; then
        # OpenBSD find command doesn't have "-regex" or "-delete" options.
        find_cmd=gfind
    fi

    # Note: these patterns assume we're using the default make-archive-name
    # script.  A custom script might use a different naming convention.
    file_pattern='.*/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/.*$'
    dir_pattern='.*/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$'

    exclude=""
    if [ -n "${keeplogs}" ]; then
        for name in ${keeplogs}; do
            exclude="$exclude ! -name $name"
        done
    fi

    if [ ! -d "${logdir}" ]; then
        echo "expire-logs: directory not found: ${logdir}"
        return 1
    fi

    # Remove old files.
    $find_cmd "${logdir}" -type f -regex $file_pattern -mmin +${logexpireminutes} $exclude -delete
    rc=$?

    # Remove now empty directories (this will not remove non-empty dirs, so we
    # ignore errors here).
    $find_cmd "${logdir}" -type d -regex $dir_pattern -exec rmdir '{}' ';' 2>/dev/null

    return $rc
}

if [ -n "${logexpireminutes}" ]; then
    expire_log || exit 1
fi

if [ -n "${statslogexpireinterval}" ]; then
    expire_statslog || exit 1
fi
