#!/bin/sh

DBFILE=/var/log/squid/squidmill.db
CONFFILE=/etc/sysconfig/squidmill
LIMIT=200

[ -s "$CONFFILE" ] && . "$CONFFILE" "$@"

alterator_api_version=1
. alterator-sh-functions
. alterator-service-functions
po_domain="alterator-squidmill"

# Change squidmill service startup and running status.
# args: status
squidmill_control()
{
    if startup_control squidmill "$1"; then
        if service_control squidmill "$1"; then
            [ -n "${ALTERATOR_DEBUG:-}" ] && \
              echo "Squidmill service turned $1 successfully" 1>&2
        else
            write_error "`printf \"\`_ 'Unable to turn squidmill service %s'\`\" $1`"
            [ -n "${ALTERATOR_DEBUG:-}" ] && \
              echo "Unable to turn squidmill service $1" 1>&2
        fi
    else
        write_error "`_ 'Unable to set squidmill service startup status'`"
        [ -n "${ALTERATOR_DEBUG:-}" ] && \
              echo "Unable to set squidmill service startup status" 1>&2
    fi
}

REPORT_STATUS=0

# args: sdate edate user uri min max . other-args
query_report()
{
    [ -f "$DBFILE" ] || return 0
    eval \
    /usr/sbin/squidmill -d "$DBFILE" -r -l $LIMIT \
                        -i `[ -n "$3" ] && echo "'$3'"` \
                        -u `[ -n "$4" ] && echo "'$4'"` \
                        `[ -n "$1" ] && echo "-s '$1'"` \
                        `[ -n "$2" ] && echo "-e '$2'"` \
                        `[ -n "$5" ] && echo "-m '$5'"` \
                        `[ -n "$6" ] && echo "-M '$6'"` \
                        `[ -n "$7" ] && echo $7` \
                        < /dev/null
}

# args: sdate edate user uri min max . other-args
report()
{
    local TMPDIR=`mktemp -d`
    local SQPID=
    local ret=

    mkfifo "$TMPDIR/report"
    query_report "$1" "$2" "$3" "$4" "$5" "$6" "$7" > "$TMPDIR/report" &
    SQPID=$!
    cat "$TMPDIR/report" | \
      while IFS="	" read t s e i u; do
        write_table_item ident $i uri $u size $s timestamp "$t"
      done
    wait $SQPID
    ret=$?
    rm "$TMPDIR/report"
    rm -r "$TMPDIR"
    return $ret
}

# args: sdate edate user uri min max . other-args
write_summary()
{
    query_report "$1" "$2" "$3" "$4" "$5" "$6" "$7 -S" | \
      ( out=0
        while IFS="	" read t s e; do
            write_string_param max_timestamp "$t"
            write_string_param sum_size $s
            write_string_param sum_elapsed $e
            out=1
        done
        if [ $out -eq 0 ]; then
            write_string_param sum_size 0
            write_string_param sum_elapsed 0
        fi
      )
}

# args: sdate edate
list_users()
{
    [ -f "$DBFILE" ] || return 0
    eval \
    /usr/sbin/squidmill -d "$DBFILE" -r -l $LIMIT \
                        -i \
                        `[ -n "$1" ] && echo "-s '$1'"` \
                        `[ -n "$2" ] && echo "-e '$2'"` \
                        < /dev/null | \
        cut -f 4 | sort | \
        while read u; do
          write_enum_item "$u" "$u"
        done
}

# args date time
date_time()
{
    if [ -n "$1" ]; then
        echo "$1 $2"
    else
        echo "$1"
    fi
}

on_message()
{
    set_locale
    case "$in_action" in
    type)
        case "$in__objects" in
            /)
                write_type_item follow boolean
                ;;
        esac
        ;;
    read)
        case "$in__objects" in
            summary)
                write_summary "`date_time \"$in_sdate\" 00:00:00`" \
                              "`date_time \"$in_edate\" 23:59:59`" \
                              "$in_user_pat" "$in_uri_pat" \
                              "$in_min_traf" "$in_max_traf"
                ;;
            report-status)
                write_string_param report_status "$REPORT_STATUS"
                write_string_param limit "$LIMIT"
                ;;
            /)
                if service_test_on squidmill; then
                    write_bool_param follow 'on'
                else
                    write_bool_param follow 'off'
                fi
                ;;
        esac
        ;;
    write)
        case "$in__objects" in
            /)
                if test_bool $in_follow; then
                    squidmill_control on
                else
                    squidmill_control off
                fi
                ;;
        esac
        ;;
    list)
         case "$in__objects" in
            users)
                list_users "`date_time \"$in_sdate\" 00:00:00`" \
                           "`date_time \"$in_edate\" 23:59:59`"
                ;;
            /)
                report "`date_time \"$in_sdate\" 00:00:00`" \
                       "`date_time \"$in_edate\" 23:59:59`" \
                       "$in_user_pat" "$in_uri_pat" \
                       "$in_min_traf" "$in_max_traf"
                REPORT_STATUS=$?
                ;;
        esac
        ;;
    esac
}

message_loop
