#!/bin/sh
#
# messagebus-config, Copyright 2009 Yaakov Selkowitz
#
# This file is part of the Cygwin port of dbus.

# ======================================================================
# Initialization
# ======================================================================
PROGNAME=$(basename $0)
_tdir=$(dirname $0)
PROGDIR=$(cd $_tdir && pwd)

CSIH_SCRIPT=/usr/share/csih/cygwin-service-installation-helper.sh

# Subdirectory where the new package is being installed
PREFIX=@prefix@

# Directory where the config files are stored
SYSCONFDIR=@sysconfdir@/dbus-1
DEVDIR=/dev
LOGDIR=/var/log
RUNDIR=$(dirname @DBUS_SYSTEM_PID_FILE@)
SOCKDIR=$(dirname @DBUS_SYSTEM_SOCKET@)

source ${CSIH_SCRIPT}

# ======================================================================
# Routine: install_service
#   Install messagebus as a service
# ======================================================================
install_service() {

  if csih_is_nt
  then

    # Check if messagebus is installed and remove on user request.
    if cygrunsrv -Q messagebus > /dev/null 2>&1
    then
      csih_warning "The messagebus service is already installed."
      echo
      if csih_request "Do you want to reinstall it with different args?"
      then
        cygrunsrv -E messagebus
        cygrunsrv -R messagebus
      fi
    fi

    # Install messagebus service if it is not already installed
    if ! cygrunsrv -Q messagebus > /dev/null 2>&1
    then
      echo
      csih_warning "The following function requires administrator privileges!"
      if csih_request "Do you want to install messagebus as service?"
      then
        if cygrunsrv -I messagebus -d "CYGWIN D-Bus system service" -p @EXPANDED_BINDIR@/dbus-daemon -a "--nofork --system"
        then
	  echo
	  csih_inform "The messagebus service has been installed under the LocalSystem"
	  csih_inform "account (also known as SYSTEM). To start the service now, call"
          csih_inform "\`net start messagebus' or \`cygrunsrv -S messagebus'. Otherwise, it"
          csih_inform "will start automatically after the next reboot."
	  echo
	  csih_inform "Check ${SYSCONFDIR}/system.conf first, if it suits your needs."
        fi
      fi # user allowed us to install messagebus
    fi # messagebus already installed
  fi # csih_is_nt
} # --- End of install_service --- #


# ======================================================================
# Main Entry Point
# ======================================================================


# Check how the script has been started.  If
#   (1) it has been started by giving the full path and
#       that path is /etc/postinstall, OR
#   (2) Otherwise, if the environment variable
#       CONFIG_AUTO_ANSWER_NO is set
# then set auto_answer to "no".  This allows automatic
# creation of the config files in /etc w/o overwriting
# them if they already exist.  In both cases, color
# escape sequences are suppressed, so as to prevent
# cluttering setup's logfiles.
if [ "$PROGDIR" = "/etc/postinstall" ]
then
  csih_auto_answer="no"
  csih_disable_color
fi
if [ -n "${CONFIG_AUTO_ANSWER_NO}" ]
then
  csih_auto_answer="no"
  csih_disable_color
fi


# ======================================================================
# Parse options
# ======================================================================
while :
do
  case $# in
  0)
    break
    ;;
  esac

  option=$1
  shift

  case "$option" in
  -d | --debug )
    set -x
    csih_trace_on
    ;;

  -y | --yes )
    csih_auto_answer=yes
    ;;

  -n | --no )
    csih_auto_answer=no
    ;;

  *)
    echo "usage: ${PROGNAME} [OPTION]..."
    echo
    echo "This script creates a basic messagebus configuration."
    echo
    echo "Options:"
    echo "    --debug  -d     Enable shell's debug output."
    echo "    --yes    -y     Answer all questions with \"yes\" automatically."
    echo "    --no     -n     Answer all questions with \"no\" automatically."
    echo
    exit 1
    ;;

  esac
done

# ======================================================================
# Action!
# ======================================================================

# Check for ${SYSCONFDIR} directory
csih_make_dir "${SYSCONFDIR}" "Cannot create global configuration files."
chmod 775 "${SYSCONFDIR}"
setfacl -m u:system:rwx "${SYSCONFDIR}"

# Check for ${DEVDIR} directory
csih_make_dir "${DEVDIR}" "Syslogging using messagebus will not work."
chmod 775 "${DEVDIR}"
setfacl -m u:system:rwx "${DEVDIR}"

# Check for ${LOGDIR} directory
csih_make_dir "${LOGDIR}" "Syslogging using messagebus will not work."
chmod 775 "${LOGDIR}"
setfacl -m u:system:rwx "${LOGDIR}"

# Check for ${RUNDIR} directory
csih_make_dir "${RUNDIR}" "PID files of running processes will not be created."
chmod 775 "${RUNDIR}"
setfacl -m u:system:rwx "${RUNDIR}"

# Check for ${SOCKDIR} directory
csih_make_dir "${SOCKDIR}" "SOCKET files of running processes will not be created."
chmod 775 "${SOCKDIR}"
setfacl -m u:system:rwx "${SOCKDIR}"

# maybe: csih_auto_answer=no will skip,
# interactive user will get a chance to override
install_service


echo
echo "Configuration finished. Have fun!"
