# lsb init-functions
#
# based on:
# /lib/lsb/init-functions for Debian -*- shell-script -*-
#
# Copyright (c) 2002-03 Chris Lawrence
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. Neither the name of the author nor the names of other contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

# log_*() functions {{{
TPUT="${TPUT:-"/usr/bin/tput"}"

_have_tput() {
    [ -x "$TPUT" ] && "$TPUT" hpa 60 >/dev/null 2>&1 \
        && return 0 \
        || return 1
}

log_success_msg() {
    printf " * $@\n"
}

log_failure_msg() {
    if _have_tput ; then
        RED="$("$TPUT" setaf 1)"
        #NORMAL="$("$TPUT" op)"
        printf " ${RED}*${NORMAL} $@\n"
    else
        printf " * $@\n"
    fi
}

log_warning_msg() {
    if _have_tput ; then
        YELLOW="$("$TPUT" setaf 3)"
        #NORMAL="$("$TPUT" op")"
        # printf " *${NORMAL} $@\n"
        printf " ${BLUE}*${NORMAL} $@\n"
    else
        printf " * $@\n"
    fi
}

log_warning_msg_nn() {
    if _have_tput ; then
        YELLOW="$("$TPUT" setaf 3)"
        printf " ${BLUE}*${NORMAL} $@"
    else
        printf " * $@"
    fi
}

# int log_begin_message (char *message)
log_begin_msg() {
        if [ "$#" -eq 0 ]; then
                return 1
        fi
        printf " ${GREEN}*${NORMAL} $@\n"
}

log_begin_msg_nn() {
        if [ "$#" -eq 0 ]; then
                return 1
        fi
        printf " ${GREEN}*${NORMAL} $@"
}


SUBMSG="   ${GREEN}-${NORMAL} "

# int log_end_message (int exitstatus)
log_end_msg() {

    # If no arguments were passed, return
    [ "$#" -eq 0 ] && return 1

    # Only do the fancy stuff if we have an appropriate terminal
    # and if /usr is already mounted
    if _have_tput ; then
        COLS="$("$TPUT" cols)"
        if [ -n "$COLS" ]; then
            COL=$(( $COLS - 7 ))
        else
            COL=73
        fi
        UP="$("$TPUT" cuu1)"
        END="$("$TPUT" hpa "$COL")"
        START="$("$TPUT" hpa 0)"
        #RED="$("$TPUT" setaf 1)"
        #NORMAL="$("$TPUT" op)"
        if [ "$1" -eq 0 ]; then
            printf "${UP}${END}${BLUE}[ ${GREEN}ok ${BLUE}]${NORMAL}\n"
        else
            printf "${UP}${START} ${RED}*${NORMAL}${END}[${RED}fail${NORMAL}]\n"
        fi
    else
        if [ "$1" -eq 0 ]; then
            printf "   ...done.\n"
        else
            printf "   ...fail!\n"
        fi
    fi
    return "$1"
}
# }}}

# e*() output functions {{{
# heavily based on gentoo's functions.sh; stripped down and modified
# to match our needs.
#
# defined functions:
#   ebegin()
#   eend()
#   eerror()
#   eindent()
#   einfo()
#   einfon()
#   eoutdent()
#   esetdent()
#   esyslog()
#   ewarn()
#   ewend()
#
# copyright 1999-2005 gentoo foundation
# distributed under the terms of the gnu general public license v2
# $header: /var/cvsroot/gentoo-src/rc-scripts/sbin/functions.sh,v 1.81.2.6 2005/05/15 20:00:31 vapier exp $

# initialisation {{{
# internal variables

# Don't output to stdout?
RC_QUIET_STDOUT="no"

# Default values for e-message indentation and dots
RC_INDENTATION=''
RC_DEFAULT_INDENT=2
#RC_DOT_PATTERN=' .'
RC_DOT_PATTERN=''
# don't output to stdout?
rc_quiet_stdout="no"

# default values for e-message indentation and dots
rc_indentation=''
rc_default_indent=2
#rc_dot_pattern=' .'
rc_dot_pattern=''

# should we use color?
if [ -r /proc/cmdline ] ; then
  grep -q ' nocolor' /proc/cmdline && RC_NOCOLOR='yes'
fi
[ -n "$NOCOLORS" ] && RC_NOCOLOR='yes'
RC_NOCOLOR="${RC_NOCOLOR:-no}"
if [ "$RC_NOCOLOR" = "no" ] ; then
  if [ -r /etc/grml_colors ] ; then
    . /etc/grml_colors
  fi
fi

# Can the terminal handle endcols?
if [ "${RC_NOCOLOR}" = "yes" ]; then
  RC_ENDCOL="no"
else
  RC_ENDCOL="yes"
fi

# Setup COLS and ENDCOL so eend can line up the [ ok ]
# width of [ ok ] == 7
COLS="$(stty size 2>/dev/null | cut -d' ' -f2)"
if [ -z "${COLS}" ] || [ "${COLS}" -le 0 ] ; then
  COLS=80
fi

if [ "${RC_ENDCOL}" = "yes" ]; then
  ENDCOL="[A[$(( ${COLS} - 8 ))G"
else
  ENDCOL=''
fi

# Setup the colors so our messages all look pretty
if [ "${RC_NOCOLOR}" = "yes" ]; then
  unset GOOD WARN BAD NORMAL HILITE BRACKET
else
  GOOD='[32;01m'
  WARN='[33;01m'
  BAD='[31;01m'
  NORMAL='[0m'
  HILITE='[36;01m'
  BRACKET='[34;01m'
fi
#}}}

# void esyslog(char* priority, char* tag, char* message)
#
#    use the system logger to log a message
#
esyslog() {
  local pri
  local tag

  [ "$#" -le 2 ] && return 0
  if [ -x /usr/bin/logger ] ; then
    pri="$1"
    tag="$2"
    shift 2

    /usr/bin/logger -p "${pri}" -t "${tag}" -- "$@"
  fi

  return 0
}

# void eindent(int num)
#
#    increase the indent used for e-commands.
#
eindent() {
  local i="${1:-0}"
  [ "$i" -gt 0 ] || i="${RC_DEFAULT_INDENT}"
  esetdent $(( ${#RC_INDENTATION} + $i ))
}

# void eoutdent(int num)
#
#    decrease the indent used for e-commands.
#
eoutdent() {
  local i="${1:-0}"
  [ "$i" -gt 0 ] || i="${RC_DEFAULT_INDENT}"
  esetdent $(( ${#RC_INDENTATION} - $i ))
}

# void esetdent(int num)
#
#    hard set the indent used for e-commands.
#    num defaults to 0
#
esetdent() {
  local i="${1:-0}"
  [ "$i" -lt 0 ] && i=0
  RC_INDENTATION="$(printf "%${i}s" '')"
}

# void einfo(char* message)
#
#    show an informative message (with a newline)
#
einfo() {
  einfon "$*\n"
  LAST_E_CMD=einfo
  return 0
}

# void einfon(char* message)
#
#    show an informative message (without a newline)
#
einfon() {
  [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
  [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
  printf " ${GOOD}*${NORMAL} ${RC_INDENTATION}$*"
  LAST_E_CMD=einfon
  return 0
}

# void ewarn(char* message)
#
#    show a warning message + log it
#
ewarn() {
  if [ "${RC_QUIET_STDOUT}" = "yes" ]; then
      printf " $*\n"
  else
    [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
    printf " ${WARN}*${NORMAL} ${RC_INDENTATION}$*\n"
  fi

  # Log warnings to system log
  esyslog "daemon.warning" "rc-scripts" "$@"

  LAST_E_CMD=ewarn
  return 0
}

# void eerror(char* message)
#
#    show an error message + log it
#
eerror() {
  if [ "${RC_QUIET_STDOUT}" = "yes" ]; then
    printf " $*\n" >&2
  else
    [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
    printf " ${BAD}*${NORMAL} ${RC_INDENTATION}$*\n"
  fi

  # Log errors to system log
  esyslog "daemon.err" "rc-scripts" "$@"

  LAST_E_CMD=eerror
  return 0
}

# void ebegin(char* message)
#
#    show a message indicating the start of a process
#
ebegin() {
  local msg="$@" dots spaces
  spaces="$(printf '%'"${#RC_DOT_PATTERN}"'s' '')"
  [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0

  if [ -n "${RC_DOT_PATTERN}" ]; then
    dots="$(printf "%$(( $COLS - 3 - ${#RC_INDENTATION} - ${#msg} - 7 ))s" '')"
    while [ "${dots#${spaces}}" != "${dots}" ] ; do
        dots="${dots#${spaces}}${RC_DOT_PATTERN}"
    done
    msg="${msg}${dots}"
  else
    msg="${msg} ..."
  fi
  einfon "${msg}"
  [ "${RC_ENDCOL}" = "yes" ] && echo

  LAST_E_LEN=$(( 3 + ${#RC_INDENTATION} + ${#msg} ))
  LAST_E_CMD=ebegin
  return 0
}

# void _eend(int error, char *efunc, char* errstr)
#
#    indicate the completion of process, called from eend/ewend
#    if error, show errstr via efunc
#
#    This function is private to functions.sh.  Do not call it from a
#    script.
#
_eend() {
  local retval="${1:-0}" efunc="${2:-eerror}" msg
  shift 2

  if [ "${retval}" -eq 0 ]; then
    [ "${RC_QUIET_STDOUT}" = "yes" ] && return 0
    msg="${BRACKET}[ ${GOOD}ok${BRACKET} ]${NORMAL}"
  else
    if [ "$#" -gt 0 ] ; then
        "${efunc}" "$@"
    fi
    msg="${BRACKET}[ ${BAD}!!${BRACKET} ]${NORMAL}"
  fi

  if [ "${RC_ENDCOL}" = "yes" ]; then
    printf "${ENDCOL}  ${msg}\n"
  else
    [ "${LAST_E_CMD}" = "ebegin" ] || LAST_E_LEN=0
    printf "%$(( ${COLS} - ${LAST_E_LEN} - 6 ))s%b\n" '' "${msg}"
  fi

  return "${retval}"
}

# void eend(int error, char* errstr)
#
#    indicate the completion of process
#    if error, show errstr via eerror
#
eend() {
  local retval="${1:-0}"
  shift

  _eend "${retval}" eerror "$@"

  LAST_E_CMD=eend
  return "$retval"
}

# void ewend(int error, char* errstr)
#
#    indicate the completion of process
#    if error, show errstr via ewarn
#
ewend() {
  local retval="${1:-0}"
  shift

  _eend "${retval}" ewarn "$@"

  LAST_E_CMD=ewend
  return "$retval"
}
#}}}

# if we're using systemd then redefine functions
# for output in systemd style
if [ "$(cat /proc/1/comm 2>/dev/null)" = "systemd" ] ; then
  einfo() {
    printf "[  ${GREEN}OK${NORMAL}  ] %s\n" "$*"
  }

  ewarn() {
    printf "[ ${YELLOW}WARN${NORMAL} ] %s\n" "$*"
  }

  eerror() {
    printf "[ ${RED}FAIL${NORMAL} ] %s\n" "$*"
  }

  eend() {
    :
  }
fi

# vim: ft=sh tw=80 ts=4 foldmethod=marker
