#!/bin/sh
############################################################ IDENT(1)
#
# $Title: Script to list program suite log files from service  $
# $Copyright: 2022 Devin Teske. All rights reserved. $
# $FrauBSD$
#
############################################################ PROGRAM

pgm="${0##*/}" # Program basename
_pgm="${pgm%-*}" # Program suite

############################################################ CONFIGURATION

LOGFILE="/var/log/$_pgm/$_pgm.log"

############################################################ GLOBALS

#
# Global exit status
#
SUCCESS=0
FAILURE=1

#
# OS Glue
#
: "${UNAME_s:=$( uname -s )}"

#
# Output format
#
modified=$( date +%s ) || exit
case "$UNAME_s" in
Linux) modified=$( date -d@$modified ) ;;
    *) modified=$( date -r$modified )
esac || exit
OFMT="%-${#modified}s %8s %5s %s\n"

############################################################ FUNCTIONS

usage()
{
	local fmt="$1"
	local optfmt="\t%-5s %s\n"
	exec >&2
	if [ "$fmt" ]; then
		shift 1 # fmt
		printf "%s: $fmt\n" "$pgm" "$@"
	fi
	printf "Usage: %s [-h]\n" "$pgm"
	printf "Options:\n"
	printf "$optfmt" "-h" "Print usage statement and exit."
	exit $FAILURE
}

############################################################ MAIN

#
# Process command-line options
#
while getopts h flag; do
	case "$flag" in
	*) usage # NOTREACHED
	esac
done
shift $(( $OPTIND - 1 ))

#
# Check command-line arguments
#
[ $# -eq 0 ] || usage "Too many arguments" # NOTREACHED

#
# Print header
#
printf "$OFMT" DATE LINES SIZE FILE

#
# List files
#
for file in $( ls -rt "$LOGFILE"* 2> /dev/null ); do
	size=$( du -Ah "$file" | awk '{print $1}' )
	case "$UNAME_s" in
	Linux) modified=$( stat -c%Y "$file" 2> /dev/null ) &&
		modified=$( date -d@$modified 2> /dev/null ) ;;
	*) modified=$( stat -f%m "$file" 2> /dev/null ) &&
		modified=$( date -r$modified 2> /dev/null )
	esac || continue
	case "$file" in
	*.gz) lines=$( zcat "$file" | awk 'END{print NR}' ) ;;
	*.bz|*.bz2) lines=$( bzcat "$file" | awk 'END{print NR}' ) ;;
	*.xz) lines=$( xzcat "$file" | awk 'END{print NR}' ) ;;
	*) lines=$( awk 'END{print NR}' "$file" )
	esac
	printf "$OFMT" "$modified" "$lines" "$size" "$file"
done

exit $SUCCESS

################################################################################
# END
################################################################################
