#!/bin/bash

# =============================================================================
# rootless-docker-shell - Подключение к запущенному rootless Docker
#
# Настраивает окружение для взаимодействия с запущенным rootless Docker
# и запускает интерактивную оболочку или указанную команду
# =============================================================================

# Константы
readonly CONFIG_FILE=/etc/rootless-helper-astra.conf
readonly DEFAULT_ROOTLESS_ROOT=/var/lib/rootlessdocker
readonly RUN_DIR_NAME="rootless-run"

# Глобальные переменные
ROOTLESS_DOCKER_ROOT=""
ROOTLESS_HOME=""
XDG_RUNTIME_DIR=""
SERVICE_NAME_ESCAPED=""
SERVICE_NAME_PLAIN=""

# =============================================================================
# Проверка что скрипт запущен не от root
# =============================================================================

check_privileges() {
  if [ "$EUID" -eq 0 ]; then
    printf 'You cannot run this script as root\n' 1>&2
    exit 1
  fi
}

# =============================================================================
# Загрузка конфигурации
# Результат записывается в глобальную переменную ROOTLESS_DOCKER_ROOT
# =============================================================================

load_config() {
  if test -f "$CONFIG_FILE"; then
    source "$CONFIG_FILE"
  fi

  if [ -z "$ROOTLESS_DOCKER_ROOT" ]; then
    ROOTLESS_DOCKER_ROOT=$DEFAULT_ROOTLESS_ROOT
  fi
}

# =============================================================================
# Вычисление путей на основе PDP меток
# Результат записывается в глобальные переменные ROOTLESS_HOME, XDG_RUNTIME_DIR
# =============================================================================

setup_paths() {
  local lev ilev cat user label

  # Получаем текущие PDP метки
  lev=$(pdp-id -l)
  ilev=$(pdp-id -i)
  cat=$(pdp-id -c)

  # Получаем имя пользователя и формируем метку
  user="$(id -un)"
  label="${lev}:${ilev}"

  # Формируем пути
  ROOTLESS_HOME="$ROOTLESS_DOCKER_ROOT/$USER/l${lev}i${ilev}c${cat}t0x0"
  XDG_RUNTIME_DIR="$ROOTLESS_HOME/$RUN_DIR_NAME"

  # Формируем имена сервисов для проверки
  SERVICE_NAME_ESCAPED="rootless-docker@$(systemd-escape "${user}@${label}")"
  SERVICE_NAME_PLAIN="rootless-docker@${user}@${label}"
}

# =============================================================================
# Проверка окружения и статуса сервиса
# =============================================================================

verify_environment() {
  # Проверяем что runtime директория существует
  if [ -z "$XDG_RUNTIME_DIR" ] || [ ! -d "$XDG_RUNTIME_DIR" ]; then
    echo "Error: no files found at path $XDG_RUNTIME_DIR" 1>&2
    echo "This may be because the service $SERVICE_NAME_PLAIN is not running." 1>&2
    exit 1
  fi

  # Проверяем статус сервиса (если доступен systemctl)
  if systemctl list-units --type=service "$SERVICE_NAME_ESCAPED" >/dev/null 2>&1 || \
     systemctl list-units --type=service "$SERVICE_NAME_PLAIN" >/dev/null 2>&1; then

    if ! systemctl list-units --type=service "$SERVICE_NAME_ESCAPED*" 2>/dev/null | grep -q running && \
       ! systemctl list-units --type=service "$SERVICE_NAME_PLAIN*" 2>/dev/null | grep -q running; then
      echo "Warning: The service $SERVICE_NAME_PLAIN is not found or not running." 1>&2
    fi
  fi
}

# =============================================================================
# Настройка переменных окружения для Docker
# =============================================================================

setup_environment() {
  export XDG_RUNTIME_DIR
  export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/docker/docker.sock"
  export ROOTLESS_HELPER=1
  export ROOTLESS_HELPER_VERSION=0.1.19
  export PATH=/sbin:"$PATH"
  export TMPDIR="$ROOTLESS_HOME/tmp"
  export PS1="rootless >> ${debian_chroot:+($debian_chroot)}\u@\h:\w\$ "
}

# =============================================================================
# Запуск интерактивной оболочки или команды
# =============================================================================

start_shell() {
  # Переходим в домашнюю директорию пользователя
  cd "$HOME" || {
    echo "Warning: Failed to change directory to $HOME" 1>&2
  }

  if test -z "$*"; then
    /bin/sh
  else
    "$@"
  fi
}

# =============================================================================
# Главная функция
# =============================================================================

main() {
  # Проверка что скрипт запущен не от root
  check_privileges

  # Загрузка конфигурации
  load_config

  # Вычисление путей на основе PDP меток
  setup_paths

  # Проверка окружения и статуса сервиса
  verify_environment

  # Настройка переменных окружения для Docker
  setup_environment

  # Запуск интерактивной оболочки или команды
  start_shell "$@"
}

# =============================================================================
# Точка входа
# =============================================================================

main "$@"
