#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
# Initial script for Linux UBLinux
# This script are launching before starting init from initrd script
# Current dir allways must be set to root (/)
# All system path must be relative, except initrd dirs

ENABLED=yes
[[ ${ENABLED} == "yes" ]] || exit 0
DEBUGMODE=no

PATH=.:/:/usr/bin:/usr/local/bin:/usr/local/sbin

[[ -d /usr/lib/ublinux ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -d /sysroot ]] && ROOTFS="/sysroot" || ROOTFS="."; CMD_CHROOT="chroot ${ROOTFS}"; }
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
debug_mode "$0" "$@"

SYSCONF="${ROOTFS}${SYSCONF}"
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/system; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/server; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null

exec_storage_containers_path(){
    STORAGE_CONTAINERS_NAME="storage.containers"
    STORAGE_CONTAINERS_PATH_DEFAULT="/memory/layer-base/1/${STORAGE_CONTAINERS_NAME}"
    #STORAGE_CONTAINERS_PATH_SYSTEM="/var/lib/containers/storage"
    FILE_STORAGE_CONTAINERS_CONF="/etc/containers/storage.conf"

    if [[ -n ${STORAGE_CONTAINERS_PATH} ]]; then
	if [[ ${STORAGE_CONTAINERS_PATH,,} == @(y|yes|enable) ]]; then
	    [[ -d ${STORAGE_CONTAINERS_PATH_DEFAULT} ]] || install -dm0755 ${STORAGE_CONTAINERS_PATH_DEFAULT}
	    STORAGE_CONTAINERS_PATH=${STORAGE_CONTAINERS_PATH_DEFAULT}
	elif [[ ${STORAGE_CONTAINERS_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/|^/media/|^/run/media/ ]]; then
	    [[ -d ${STORAGE_CONTAINERS_PATH} ]] || install -dm0755 ${STORAGE_CONTAINERS_PATH}
	fi
	if ! grep -qi "^\s*graphroot = \"${STORAGE_CONTAINERS_PATH}\"" ${ROOTFS}/${FILE_STORAGE_CONTAINERS_CONF}; then
	    if grep -qi "^\s*graphroot" ${ROOTFS}/${FILE_STORAGE_CONTAINERS_CONF}; then
		sed -r "s|^(\s*graphroot).*|\1\ = \"${STORAGE_CONTAINERS_PATH}\"|g" -i ${ROOTFS}/${FILE_STORAGE_CONTAINERS_CONF}
	    elif grep -qi "^\s*#graphroot" ${ROOTFS}/${FILE_STORAGE_CONTAINERS_CONF}; then
		sed "/^\s*#graphroot\s*/agraphroot = \"${STORAGE_CONTAINERS_PATH}\"" -i ${ROOTFS}/${FILE_STORAGE_CONTAINERS_CONF}
	    else
		sed "/^\s*\[storage\]\s*/agraphroot = \"${STORAGE_CONTAINERS_PATH}\"" -i ${ROOTFS}/${FILE_STORAGE_CONTAINERS_CONF}
	    fi
	fi
    fi
}

exec_storage_docker_path(){
    STORAGE_DOCKER_NAME="storage.docker"
    STORAGE_DOCKER_PATH_DEFAULT="/memory/layer-base/1/${STORAGE_DOCKER_NAME}"
    #STORAGE_DOCKER_PATH_SYSTEM="/var/lib/docker"
    FILE_DOCKER_CONF="/etc/docker/daemon.json"
    FILE_DOCKER_MODPROBE="/etc/modprobe.d/ubconfig-docker.conf"

    if [[ -n ${STORAGE_DOCKER_PATH} ]]; then
        if [[ ${STORAGE_DOCKER_PATH,,} == @(y|yes|enable) ]]; then
            [[ -d ${STORAGE_DOCKER_PATH_DEFAULT} ]] || install -dm0755 ${STORAGE_DOCKER_PATH_DEFAULT}
            STORAGE_DOCKER_PATH=${STORAGE_DOCKER_PATH_DEFAULT}
        elif [[ ${STORAGE_DOCKER_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/|^/media/|^/run/media/ ]]; then
            [[ -d ${STORAGE_DOCKER_PATH} ]] || install -dm0755 ${STORAGE_DOCKER_PATH}
        fi
        [[ -d ${FILE_DOCKER_CONF%/*} ]] || install -dm0755 ${FILE_DOCKER_CONF%/*}
        if [[ -f ${FILE_DOCKER_CONF} ]]; then
            # Изменить содержимое переменной data-root
            if ! grep -qi "^\s*\"data-root\": \"${STORAGE_DOCKER_PATH}\"" ${ROOTFS}/${FILE_DOCKER_CONF}; then
                if grep -qi "^\s*\"data-root\":" ${ROOTFS}/${FILE_DOCKER_CONF}; then
                    sed -r "s|^(\s*\"data-root\":).*|\1\ \"${STORAGE_DOCKER_PATH}\"|" -i ${ROOTFS}/${FILE_DOCKER_CONF}
                elif grep -qi "^\s*#\s*\"data-root\":" ${ROOTFS}/${FILE_DOCKER_CONF}; then
                    sed "/^\s*#\s*\"data-root\":/a\  \"data-root\": \"${STORAGE_DOCKER_PATH}\"" -i ${ROOTFS}/${FILE_DOCKER_CONF}
                else
                    sed "/^\s*{\s*/a\  \"data-root\": \"${STORAGE_DOCKER_PATH}\"," -i ${ROOTFS}/${FILE_DOCKER_CONF}
                fi
            fi
        else
            cat << EOF > ${FILE_DOCKER_CONF}
{
  "data-root": "${STORAGE_DOCKER_PATH}"
}
EOF
        fi
        cat << EOF > ${FILE_DOCKER_MODPROBE}
# For Docker overlay2
options overlay
# Disable overlay redirect dir and metacopy
# options overlay metacopy=off redirect_dir=off
EOF
    else
	[[ -f ${FILE_DOCKER_MODPROBE} ]] && rm -f ${FILE_DOCKER_MODPROBE} &>/dev/null
    fi
}

exec_storage_libvirt_path(){
    STORAGE_LIBVIRT_POOL_NAME="storage.libvirt"
    STORAGE_LIBVIRT_PATH_DEFAULT="/memory/layer-base/1/${STORAGE_LIBVIRT_POOL_NAME}"
    if [[ -n ${STORAGE_LIBVIRT_PATH} ]]; then
	if [[ ${STORAGE_LIBVIRT_PATH,,} == @(y|yes|enable) ]]; then
	    STORAGE_LIBVIRT_PATH=${STORAGE_LIBVIRT_PATH_DEFAULT}
	    [[ -d ${STORAGE_LIBVIRT_PATH} ]] || install -dm0755 ${STORAGE_LIBVIRT_PATH}
	elif [[ ${STORAGE_LIBVIRT_PATH} =~ ^/memory/|^/mnt/(livemedia|livedata)/ ]]; then
	    [[ -d ${STORAGE_LIBVIRT_PATH} ]] || install -dm0755 ${STORAGE_LIBVIRT_PATH}
	fi
	cat <<EOF > "${ROOTFS}/etc/libvirt/storage/${STORAGE_LIBVIRT_POOL_NAME}.xml"
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh pool-edit ${STORAGE_LIBVIRT_POOL_NAME}
or other application using the libvirt API.
-->

<pool type='dir'>
  <name>${STORAGE_LIBVIRT_POOL_NAME}</name>
  <uuid>22e1f043-1fcb-4017-8afd-d44ebea9c8e4</uuid>
  <capacity unit='bytes'>0</capacity>
  <allocation unit='bytes'>0</allocation>
  <available unit='bytes'>0</available>
  <source>
  </source>
  <target>
    <path>${STORAGE_LIBVIRT_PATH}</path>
  </target>
</pool>
EOF
    fi
    [[ -d ${ROOTFS}/etc/libvirt/storage/autostart ]] || install -dm0755 ${ROOTFS}/etc/libvirt/storage/autostart
    ln -sf /etc/libvirt/storage/${STORAGE_LIBVIRT_POOL_NAME}.xml ${ROOTFS}/etc/libvirt/storage/autostart/${STORAGE_LIBVIRT_POOL_NAME}.xml
}

################
##### MAIN #####
################

    # Если файл подключен как ресурс с функциями, то выйти
    return 0 2>/dev/null && return 0
    if [[ -z $@ ]]; then
        while read -r FUNCTION; do
            $"${FUNCTION##* }"
        done < <(declare -F | grep "declare -f exec_")
    else
	FUNCTION=
	while [[ $# -gt 0 ]]; do
	    [[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1//\'/}'"; }
	    shift
	done
	eval ${FUNCTION#*; }
    fi
