#!/bin/sh

trap "exit 1" USR1

USAGE="usage: ${0} [-dm] [-l #]"

usage() {
	printf "%s\n" "$USAGE" >&2; exit 2
}

err() {
        printf "error: server not detected, needs to be set manually\n" >&2
        printf "set \$SERVER or modify the script itself\n" >&2
	kill -USR1 "$$"
}

CUTCMD="-d: -f2,3"
TAILN=30

while getopts "dl:m" flag; do
	case "$flag" in
	d) CUTCMD="-d/ -f1,2" ;;
	m) CUTCMD="-d: -f2,3" ;;
	l)
		if [ "$OPTARG" -eq "$OPTARG" ]; then
			TAILN="$OPTARG"
		else
			usage
		fi ;;
	*) usage ;;
	esac
done

# ... && ... || is not an if-then-else, but this works because
# there's no way for only one printf to fail
[ -z "$SERVER" ] && SERVER=$(which > /dev/null 2>&1 apache2 && printf "apache2" || which > /dev/null 2>&1 nginx && printf "nginx" || err)

CURDAY=$(tail -n1 /var/log/"$SERVER"/access.log | grep -oE "[0-9]{2}/.*/[0-9]{4}:")

{ cat /var/log/"$SERVER"/access.log /var/log/"$SERVER"/access.log.1; gzip -cd $(ls /var/log/"$SERVER"/access.log.*.gz | sed 's/.*\.\([0-9]*\)\.gz/\1 &/' | sort -n | cut -d' ' -f2-); } | awk -v curday="$CURDAY" '$0 ~ curday { if (match($0, /[0-9]{2}\/.*\/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}/)) { print substr($0, RSTART, RLENGTH) } next } { exit }' | cut $CUTCMD | uniq -c | tail -n"$TAILN"
