#!/bin/sh -e

s6_live() {
  if [ ! -L /run/s6-rc ]; then
    echo >&2 "  Skipped: s6-rc is not running."
    exit 0
  fi
}

svc_help(){
    echo "	==> Start/stop a service:"
    echo "  s6-rc -u/-d change <service>"
    echo "	==> Recompile the service database:"
    echo "  s6 set commit && s6 live install"
}

svc_add_help(){
    echo "	==> Add a service:"
	echo "  s6 set enable <service>"
    svc_help
}

svc_del_help(){
    echo "	==> Remove a service:"
	echo "  s6 set disable <service>"
    svc_help
}

reload_dbus() {
    dbus-send --print-reply --system --type=method_call \
            --dest=org.freedesktop.DBus \
            / org.freedesktop.DBus.ReloadConfig > /dev/null
}

each_conf() {
  while read -r f; do
    "$@" "/$f"
  done
}

repo_sync() {
  s6 repository sync && s6 set commit
  if [ -d /run/s6-rc ]; then
      s6 live install
  elif [ ! -L /etc/s6/repo/compiled/current ]; then
      s6 live install --init
  fi
}

repo_upgrade() {
  if s6 repository list >/dev/null 2>&1; then
    s6 repository init -U
  else
    s6 repository init -f
    if [ -L /run/s6-rc ]; then
      _new_name=$(migrate_adminsv)
      [ -z "$_new_name" ] || s6 set enable --pull-dependencies "$_new_name"
    fi
  fi
}

migrate_adminsv() {
  _old=/etc/s6/adminsv/default
  if [ -d "$_old" ]; then
    _ts="$(date +%s)"
    echo >&2 'Found an older s6-scripts installation. Migrating to s6-frontend format.'
    echo bundle > "$_old/type"
    mv -- "$_old" "$_old-$_ts"
    printf >&2 'Run (as root):\n ==> rm -rf %s && s6 repository sync\nto clean leftover files.\n' "$_old-$_ts"
    echo "default-$_ts"
  fi
}

op="$1"; shift

case $op in
  sysctl)   s6_live; each_conf /usr/bin/sysctl -q -p ;;
  dbus_reload) s6_live; reload_dbus ;;
  repo_upgrade) repo_upgrade ;;
  repo_sync) repo_sync ;;
    # For use by other packages
  add)      svc_add_help ;;
  del)      svc_del_help ;;
  longrun_restart) s6_live; s6 live reload "$1" 2>/dev/null ;;
  *) echo >&2 "  Invalid operation '$op'"; exit 1 ;;
esac

exit 0
