#!/bin/bash

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

unset ROOTFS; [[ -d /usr/lib/ublinux ]] || 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}/security; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null

get_compat_unit(){
    if [[ ! ${ITEM_UNIT} =~ ".service"$|".slice"$|".scope"$ ]]; then
 	USER_ID=$(id -u ${ITEM_UNIT} 2>/dev/null)
 	[[ -n ${USER_ID} ]] && USER_SLICE="user-${USER_ID}.slice" || return 1
	COMPAT_UNIT=${USER_SLICE}
    else
	COMPAT_UNIT=${ITEM_UNIT}
    fi
}
# ARG1: CGROUP_QUOTA[superadmin]=MemoryHigh=500M,MemorySwapMax=100M,CPUQuota=400%
exec_cgroup_quota_set(){
## Квоты на ресурсы, через cgroup2. Механизм systemd или напрямую cgroup
    local PARAM="$@"
    if [[ -n ${PARAM} ]]; then
        local CGROUP_QUOTA=
        declare -A CGROUP_QUOTA=()
        [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}"
    fi
    if [[ -n ${CGROUP_QUOTA[@]} ]]; then
 	for ITEM_UNIT in "${!CGROUP_QUOTA[@]}"; do
 	    get_compat_unit
	    CGROUP_QUOTA[${ITEM_UNIT}]="${CGROUP_QUOTA[${ITEM_UNIT}]//,/\' }'"
	    CGROUP_QUOTA[${ITEM_UNIT}]="${CGROUP_QUOTA[${ITEM_UNIT}]//=/=\'}"
	    if readlink -fq ${ROOTFS}/usr/bin/init | grep -q "lib/systemd/systemd$"; then
		eval /usr/bin/systemctl set-property --runtime ${COMPAT_UNIT} ${CGROUP_QUOTA[${ITEM_UNIT}]}
		/usr/bin/systemctl daemon-reload
	    else
		true
	    fi
	done
    fi
}
# ARG1: CGROUP_QUOTA[superadmin]=
exec_cgroup_quota_remove(){
## Очистить квоты на ресурсы, через cgroup2. Механизм systemd или напрямую cgroup
    local PARAM="$@"
    [[ -n ${PARAM} ]] && ITEM_UNIT=${PARAM#*[} && ITEM_UNIT=${ITEM_UNIT%%]*} || return 0
    [[ -n ${ITEM_UNIT} ]] || return 0
    get_compat_unit
    if readlink -fq ${ROOTFS}/usr/bin/init | grep -q "lib/systemd/systemd$"; then
        /usr/bin/systemctl set-property --runtime ${COMPAT_UNIT} $(cat /run/systemd/system.control/${COMPAT_UNIT}.d/* | grep -v "^[#\[]" | sed "s/=.*$/= /g" | tr -d \\n)
        #systemctl revert ${COMPAT_UNIT}
        /usr/bin/systemctl daemon-reload
    else
    # Напрямую cgroup
        true
    fi
}

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

    if [[ -z $@ || $1 == @("set="|"set+="|"set++=") ]]; then
	shift
	exec_cgroup_quota_set "$@"
    elif [[ $1 == @("set-="|"set--="|"remove") ]]; then
	shift
	exec_cgroup_quota_remove "$@"
    fi
