#!/bin/sh -e

if test -z "$1" ; then
  echo "svctl-isenabled: usage: svctl-isenabled service" 1>&2
  exit 100
fi

dbx="s6-rc-db -c /usr/lib/s6-rc/compiled-work"

# The name of the top bundle is needed in BOTH branches below. Until 2026-09-22
# it was determined inside the service branch only, so the bundle branch ran
# "s6-rc-db contents ''" -- every bundle reported "disabled", and "enable => true"
# on a bundle changed on every Puppet run.
policy=$(readlink /usr/lib/s6-rc/policy/current)
if test x"$policy" = x"exclusive" ; then
  top="top"
elif test x"$policy" = x"shared" ; then
  top="runlevel_2"
else
  echo "svctl-isenabled: fatal: /usr/lib/s6-rc/policy/current should be a relative symlink to either shared or exclusive" 1>&2
  exit 100
fi

if $dbx list services | grep -qFx "$1" ; then
  if $dbx contents "$top" | grep -qFx "$1"; then
    echo "service $1 is enabled"
    exit 0
  else
    echo "service $1 is disabled"
    exit 1
  fi
elif $dbx list bundles | grep -qFx "$1" ; then
  # "exit 1" inside a "| while" only leaves the subshell, so the result is
  # carried out explicitly instead of relying on "set -e" seeing the pipeline
  # status.
  enabled=$($dbx contents "$top")
  rc=0
  for service in $($dbx contents "$1") ; do
    # We do not want to check nested bundles, only directly linked services
    if ! printf '%s\n' "$enabled" | grep -qFx "$service" ; then
      echo "service $service in bundle $1 is disabled"
      # We do not differentiate between all disabled or some disabled
      rc=1
    fi
  done
  if test "$rc" -eq 0 ; then
    echo "bundle $1 is enabled"
  fi
  exit "$rc"
else
  echo "svctl-isenabled: unknown atomic service: $1" 1>&2
  exit 3
fi
