#!/bin/bash
#
# Configures the rsyslog daemon.
# Source functions library
. /etc/init.d/functions
. /usr/libexec/ovirt-functions

trap '__st=$?; stop_log; exit $__st' 0
trap 'exit $?' 1 2 13 15

if ! is_local_storage_configured; then
    printf "Local storage must be configured prior to configuring the logging system.\n"
    exit 99
fi

RSYSLOG_FILE="/etc/rsyslog.conf"

# Creates the rsyslog file based on the following inputs
# $1 ipaddress of remote syslog server
# $2 port of remote syslog server
# $3 protocol (tcp or udp)
# TODO implement and use Augeas lens
function ovirt_rsyslog {

if [ "$3" = "tcp" ]; then
    DELIM="@@"
else DELIM="@"
fi

cat > $RSYSLOG_FILE << EOF
#ovirt rsyslog config file

#### MODULES ####
\$ModLoad imuxsock.so    # provides support for local system logging (e.g. via logger command)
\$ModLoad imklog.so      # provides kernel logging support (previously done by rklogd)

#### GLOBAL DIRECTIVES ####
# Use default timestamp format
\$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#### RULES ####
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

\$WorkDirectory /var/spool/rsyslog
\$ActionQueueFileName ovirtNode
\$ActionQueueMaxDiskSpace 10m
\$ActionQueueSaveOnShutdown on
\$ActionQueueType LinkedList
\$ActionResumeRetryCount -1
*.* $DELIM$1:$2
EOF

start_log
/sbin/service rsyslog restart
stop_log
}

function is_numeric {
    printf "$1" | grep -q -E '^[0-9]+$'
}

function prompt_user {
    while true ; do
        max_log_size="1024"
        syslog_server_ip=""
        syslog_server_port=""

        while true; do
	        printf "\n"
            read -p "What is the max size, in kilobytes, for local log files (def. ${max_log_size}k)? "

            if [ -n "$REPLY" ]; then
                r=$REPLY
                if [[ $r =~ ^[0-9]+$ ]] && [[ $r -gt 0 ]]; then
                    max_log_size=$r
                    printf "\nMaximum logging size will be ${max_log_size}k.\n"
                    break
                else
                    printf "\nInvalid input.\n"
                fi
            else
                printf "\nLeaving log size as ${max_log_size}k.\n"
                break
            fi
        done

        printf "\n"
        read -p "What is the IP address for the syslog server, hit Enter to skip? "
        if [ -n "$REPLY" ]; then
            syslog_server_ip=$REPLY
            while true; do
                read -p "Please enter the remote logging port used:  "
                r=$REPLY
                if [ -n "$r" ]; then
                    if [[ $r =~ ^[0-9]+$ ]] && [[ $r -gt 0 ]]; then
	                    syslog_server_port=$REPLY
	                    break
                    else
                        printf "Invalid port.\n"
                    fi
                fi
            done

            printf "\n"
            while true; do
                read -p "Remote logging uses [t]cp or [u]dp? "
                r=$(echo $REPLY|tr '[[:lower:]]' '[[:upper:]]')
                if [ "$r" == "T" ]; then syslog_server_protocol="tcp"; break; fi
                if [ "$r" == "U" ]; then syslog_server_protocol="udp"; break; fi
                # else
		        printf "Invalid input.\n"
            done
        else
            printf "\nDisabling remote logging.\n"
        fi

        printf "\n"
        printf "\nLogging will be configured as follows:"
        printf "\n======================================"
        printf "\n Max Logfile Size: $max_log_size"
        if [ -n "$syslog_server_ip" ]; then
            printf "\n    Remote Server: $syslog_server_ip"
            printf "\n      Remote Port: $syslog_server_port"
            printf "\n Logging Protocol: $syslog_server_protocol"
        fi
        printf "\n"
        printf "\n"
        while true; do
            ask_yes_or_no "Is this correct ([Y]es/[N]o/[A]bort)?" true true
            case $? in
                0)
                    printf "\nSaving configuration.\n"
                    if [[ -n "$syslog_server_ip" ]] &&
                        [[ -n "$syslog_server_port" ]] &&
                        [[ -n "$syslog_server_protocol" ]]; then
                        ovirt_rsyslog $syslog_server_ip \
                            $syslog_server_port \
                            $syslog_server_protocol
                    fi
                    sed -c -i -e "s/size.*/size ${max_log_size}k/" \
                        /etc/logrotate.d/ovirt-node
                    return
                    ;;
                1)
                    printf "\nRestarting logging configuration.\n"
                    break
                    ;;
                2)
                    printf "\nAborting logging configuration.\n"
                    return
                    ;;
            esac
        done
    done
}

function ovirt_netconsole {
    augtool <<EOF
set /files/etc/sysconfig/netconsole/SYSLOGADDR $OVIRT_NETCONSOLE_SERVER
set /files/etc/sysconfig/netconsole/SYSLOGPORT $OVIRT_NETCONSOLE_PORT
EOF
    ovirt_store_config /etc/sysconfig/netconsole
}
# AUTO for auto-install
if [ "$1" = "AUTO" ]; then
    if [ -z "$OVIRT_SYSLOG_SERVER" -o -z "$OVIRT_SYSLOG_PORT" ]; then
        printf "\nAttempting to locate remote syslog server..."
        find_srv syslog udp
        if [ -n "$SRV_HOST" -a -n "$SRV_PORT" ]; then
            printf "found! Using syslog server '$SRV_HOST:$SRV_PORT'.\n"
            ovirt_rsyslog $SRV_HOST $SRV_PORT udp
        else
            printf "not found!\n"
        fi
    else
        printf "\nUsing default syslog server '$OVIRT_SYSLOG_SERVER:$OVIRT_SYSLOG_PORT'.\n"
        ovirt_rsyslog $OVIRT_SYSLOG_SERVER $OVIRT_SYSLOG_PORT udp
    fi
    if [ -n "$OVIRT_NETCONSOLE_SERVER" -a -n "$OVIRT_NETCONSOLE_PORT" ]; then
        printf "\nConfiguring netconsole server..."
        ovirt_netconsole
    fi
else
    printf "\n\n Logging Configuration\n\n"
    prompt_user
fi
