You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ublinux-init/ublinux/rc.post.d/45-disk-quota

313 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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/os-config; [[ -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
#declare -A DISK_QUOTA
#DISK_QUOTA[usrquota:/dev/sda1]=enable
#DISK_QUOTA[usrquota:/dev/sda1]=disable
#DISK_QUOTA[usrquota:/dev/sda4:user-1,user-2]=7M:8M:0:0:86400:86400
#DISK_QUOTA[usrquota:/dev/sda4:user-1]=5M:6M:0:0
#DISK_QUOTA[usrquota:/dev/sda4:user-2]=7M:8M:0:0
#DISK_QUOTA[usrquota:/mnt/MyExt4:user-1,user-2]=5M:6M:0:0
#DISK_QUOTA[usrquota:/dev/sda4]=0:0:0:0:1604800:8604800
#DISK_QUOTA[grpquota:/dev/sda1]=enable
#DISK_QUOTA[grpquota:/dev/sda4:users]=2M:3M:0:0:604800:604800
#DISK_QUOTA[grpquota:/mnt/MyExt4:users]=5M:6M:0:0:604800:604800
#DISK_QUOTA[prjquota:/tmp/5/dir23:3,MyPN-3]=3M:4M:10:20:3600:3600
#DISK_QUOTA[prjquota:/mnt/MyExt4/test1:1,PN-1]=2M:3M:0:0:3600:3600
#DISK_QUOTA[prjquota:/mnt/sda4/test1:AUTO,PN-1]=2M:3M:0:0:3600:3600
#DISK_QUOTA[prjquota:/mnt/MyExt4/test2:2,PN-2]=3M:4M:10:12:3600:3600
#DISK_QUOTA[prjquota:/mnt/sda4/test1]=clean
#DISK_QUOTA[prjquota:/mnt/sda4/test1]=disable
#DISK_QUOTA[quota]=disable
#DISK_QUOTA[quota]=enable
#DISK_QUOTA[quota:/dev/sda4]=clean
## Назначение квот на дисковые ресурсы
## Может принимать входящий параметр:
## exec_disk_quota DISK_QUOTA[usrquota:/dev/sdc1]=user-1,user-2:5M:6M:0:0 DISK_QUOTA[usrquota:/dev/sdc2]=enable
exec_disk_quota(){
## Использовать дисковые квоты на файловые системы
enable_quota(){
# Включить поддержку квоты
## Варианты опций mount для квотирования:
## noquota # Отключить простые квоты на пользователя и группу
## quota # Включить простые квоты на пользователя и группу
## usrquota # Включить простые квоты на пользователя
## grpquota # Включить простые квоты на группу
## prjquota # Включить квоты на проект
## usrjquota=aquota.user # Включить журналируемые квоты на пользователя
## grpjquota=aquota.group # Включить журналируемые квоты на группу
## jqfmt=vfsold # Использовать БД для простых квот V1
## jqfmt=vfsv0 # Выключить журналирование. Использовать БД для журналируемых квот V2
## jqfmt=vfsv1 # Включить журналирование. Использовать БД для журналируемых квот V2
#cat /proc/mounts | grep -q "^${PATH_DEVICE}.,*${ATTR_QUOTA}" && return 0
local MOUNT_DEVICE=$(cat /proc/mounts | grep "^${PATH_DEVICE}" | head -1)
if [[ -n ${MOUNT_DEVICE} ]]; then
if [[ ${ISFS_EXT234_FEATURES} == yes ]]; then
if [[ ${MOUNT_DEVICE} =~ ^${PATH_DEVICE}.*,${ATTR_QUOTA} ]]; then
return 0
elif mount -o remount,${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE}; then
# Перемонтировать со всеми атрибутами квот
[[ ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} =~ usrquota ]] && rm -f ${MOUNT_POINT}/{aquota.user,quota.user}
[[ ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} =~ grpquota ]] && rm -f ${MOUNT_POINT}/{aquota.group,quota.group}
else
echo "ERROR: Device '${PATH_DEVICE}' not remounted with options 'remount,${MOUNT_DISK_ATTR[${PATH_DEVICE}]}'"
return 1
fi
elif [[ ${ISFS_EXT234_FEATURES} == no ]]; then
if [[ ${MOUNT_DEVICE} =~ ^${PATH_DEVICE}.*,${ATTR_QUOTA} && -f "${MOUNT_POINT}/${FILE_QUOTA}" ]]; then
return 0
elif [[ ! ${PATH_DEVICE} =~ ^/dev/loop* ]] && umount --quiet ${PATH_DEVICE} 2>/dev/null; then
${ROOTFS}/usr/bin/tune2fs -Q ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE} && ISFS_EXT234_FEATURES=yes
mount --all
mount -o ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE} ${MOUNT_POINT}
[[ ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} =~ usrquota ]] && rm -f ${MOUNT_POINT}/{aquota.user,quota.user}
[[ ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} =~ grpquota ]] && rm -f ${MOUNT_POINT}/{aquota.group,quota.group}
elif [[ ${ATTR_QUOTA} != prjquota ]]; then
if mount -o remount,${ATTR_QUOTA} ${PATH_DEVICE}; then
#${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} 2>/dev/null
[[ -f "${MOUNT_POINT}/${FILE_QUOTA}" ]] || ${ROOTFS}/usr/bin/quotacheck -${ARG_CMD}cm ${PATH_DEVICE}
${ROOTFS}/usr/bin/quotacheck -${ARG_CMD} ${PATH_DEVICE}
else
echo "ERROR: Device '${PATH_DEVICE}' not remounted with options 'remount,${ATTR_QUOTA}'"
return 1
fi
fi
elif [[ ${ISFS_NFS} == yes ]]; then
if [[ ${MOUNT_DEVICE} =~ ^${PATH_DEVICE}.*,${ATTR_QUOTA} && -f "${MOUNT_POINT}/${FILE_QUOTA}" ]]; then
return 0
fi
true
fi
if [[ -z ${ROOTFS} ]]; then
/usr/bin/ubconfig --quiet --source system get config SERVICESSTART | grep -q systemd-quotacheck 2>/dev/null \
|| /usr/bin/ubconfig --quiet --target system set config SERVICESSTART+=,systemd-quotacheck
else
chroot . /usr/bin/ubconfig --quiet --source system get config SERVICESSTART | grep -q systemd-quotacheck 2>/dev/null \
|| /usr/bin/ubconfig --quiet --noexecute --target system set config SERVICESSTART+=,systemd-quotacheck
fi
else
[[ -n ${ISFS_EXT234} && ${ISFS_EXT234_FEATURES} == no ]] && ${ROOTFS}/usr/bin/tune2fs -Q ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE} #2>/dev/null
echo "ERROR: Device '${PATH_DEVICE}' not mounted."
fi
}
disable_quota(){
# Отключить поддержку квот
cat /proc/mounts | grep -q "${PATH_DEVICE}.*,${ATTR_QUOTA}" || return 0
${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} &>/dev/null
if [[ ${ATTR_QUOTA} == quota ]]; then
if [[ -z ${ROOTFS} ]]; then
/usr/bin/ubconfig --quiet --target system set config SERVICESSTART--=,systemd-quotacheck
else
chroot . /usr/bin/ubconfig --quiet --noexecute --target system set config SERVICESSTART--=,systemd-quotacheck
fi
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" && mount -o remount,noquota ${PATH_DEVICE} &>/dev/null
fi
}
set_quota(){
# Установить квоту
QUOTA_LIMITS=$(cut -d: -f1,2,3,4 <<< ${ALL_VALUE_QUOTA} | tr : ' ')
QUOTA_GRACE=$(cut -d: -f5,6 <<< ${ALL_VALUE_QUOTA} | tr : ' ')
#${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} #2>/dev/null
[[ -n ${QUOTA_GRACE} ]] && setquota -${ARG_CMD}t ${QUOTA_GRACE} ${MOUNT_POINT}
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota) && -n ${UGP_QUOTA} ]]; then
while read SELECT_UG_QUOTA; do
${ROOTFS}/usr/bin/setquota -${ARG_CMD} ${SELECT_UG_QUOTA} ${QUOTA_LIMITS} ${PATH_DEVICE}
done < <(tr ",;[[:space:]]" \\n <<< ${UGP_QUOTA})
elif [[ ${ATTR_QUOTA} == prjquota && -n ${UGP_QUOTA} ]]; then
ID_PROJECT=${UGP_QUOTA%%,*}
NAME_PROJECT=${UGP_QUOTA#*,}
if [[ ${ID_PROJECT,,} == auto ]]; then
FIND_ID_PROJECT=$(lsattr -p -d "${PATH_PRJ}" | cut -d' ' -f1)
[[ -n ${FIND_ID_PROJECT} && ${FIND_ID_PROJECT} != 0 ]] && ID_PROJECT=${FIND_ID_PROJECT} || ID_PROJECT=${RANDOM}
fi
[[ -f ${ROOTFS}/etc/projects ]] && sed "\|^${ID_PROJECT}:.*|d; \|.*:${PATH_PRJ}$|d" -i ${ROOTFS}/etc/projects 2>/dev/null
echo "${ID_PROJECT}:${PATH_PRJ}" >> ${ROOTFS}/etc/projects
[[ -f ${ROOTFS}/etc/projid ]] && sed "/.*:${ID_PROJECT}$/d" -i ${ROOTFS}/etc/projid 2>/dev/null
if [[ -n ${NAME_PROJECT} ]]; then
[[ -f ${ROOTFS}/etc/projid ]] && sed "/^${NAME_PROJECT}:.*/d" -i ${ROOTFS}/etc/projid 2>/dev/null
echo "${NAME_PROJECT}:${ID_PROJECT}" >> ${ROOTFS}/etc/projid
fi
if [[ -n ${ISFS_EXT234} || -n ${ISFS_XFS} || -n ${ISFS_BTRFS} ]]; then
${ROOTFS}/usr/bin/chattr -R -p ${ID_PROJECT} ${PATH_PRJ}
${ROOTFS}/usr/bin/chattr +P ${PATH_PRJ}
fi
${ROOTFS}/usr/bin/setquota -${ARG_CMD} ${ID_PROJECT} ${QUOTA_LIMITS} ${PATH_DEVICE}
fi
}
clean_quota(){
# Очистить данные квот
#disable_quota
local MOUNT_DEVICE=$(cat /proc/mounts | grep "^${PATH_DEVICE}" | head -1)
if [[ -n ${MOUNT_DEVICE} ]]; then
if [[ ${ATTR_QUOTA} == prjquota ]]; then
${ROOTFS}/usr/bin/quotaoff -P ${PATH_DEVICE} 2>/dev/null
if [[ -n ${UGP_QUOTA} ]]; then
ID_PROJECT=${UGP_QUOTA%%,*}
NAME_PROJECT=${UGP_QUOTA#*,}
[[ -f ${ROOTFS}/etc/projects ]] && sed "\|^${ID_PROJECT}:.*|d; \|.*:${PATH_PRJ}$|d" -i ${ROOTFS}/etc/projects 2>/dev/null
[[ -f ${ROOTFS}/etc/projid ]] && sed "/.*:${ID_PROJECT}$/d" -i ${ROOTFS}/etc/projid 2>/dev/null
[[ -f ${ROOTFS}/etc/projid && -n ${NAME_PROJECT} ]] && sed "/^${NAME_PROJECT}:.*/d" -i ${ROOTFS}/etc/projid 2>/dev/null
fi
if [[ -n ${PATH_PRJ} ]] && [[ -n ${ISFS_EXT234} || -n ${ISFS_XFS} || -n ${ISFS_BTRFS} ]]; then
${ROOTFS}/usr/bin/chattr -R -p 0 ${PATH_PRJ}
${ROOTFS}/usr/bin/chattr -P ${PATH_PRJ}
fi
elif [[ ${ATTR_QUOTA} == quota && ${ATTR_QUOTA} == usrquota && ${ATTR_QUOTA} == grpquota ]]; then
${ROOTFS}/usr/bin/quotaoff -ugP ${PATH_DEVICE} 2>/dev/null
if [[ ${ISFS_EXT234_FEATURES} == yes ]]; then
if umount --quiet ${PATH_DEVICE} 2>/dev/null; then
${ROOTFS}/usr/bin/tune2fs -Q ^usrquota,^grpquota,^prjquota ${PATH_DEVICE} 2>/dev/null
#${ROOTFS}/usr/bin/tune2fs -Q quota,project ${PATH_DEVICE} 2>/dev/null
mount --all
mount ${PATH_DEVICE} ${MOUNT_POINT}
else
echo "WARNING: Device '${PATH_DEVICE}' is busy."
fi
else
[[ ${MOUNT_DEVICE} =~ ^${PATH_DEVICE}.*,${ATTR_QUOTA} ]] && mount -o remount,noquota ${PATH_DEVICE} &>/dev/null
rm -f ${MOUNT_POINT}/{aquota.user,aquota.group,quota.user,quota.group}
fi
fi
else
if [[ ${ISFS_EXT234_FEATURES} == yes ]]; then
${ROOTFS}/usr/bin/tune2fs -Q ^quota,^project ${PATH_DEVICE} 2>/dev/null
#${ROOTFS}/usr/bin/tune2fs -Q quota,project ${PATH_DEVICE} 2>/dev/null
fi
fi
}
debug(){
echo "--------------------------"
echo "ATTR_QUOTA=${ATTR_QUOTA}"
echo "UGP_QUOTA=${UGP_QUOTA}"
echo "ALL_VALUE_QUOTA=${ALL_VALUE_QUOTA}"
echo "IDENT_DEVICE=${IDENT_DEVICE}"
echo "PATH_DEVICE_LSBLK=${PATH_DEVICE_LSBLK}"
echo "PATH_DEVICE=${PATH_DEVICE}"
echo "MOUNT_POINT=${MOUNT_POINT}"
echo "PATH_PRJ=${PATH_PRJ}"
echo "ISFS_EXT234=${ISFS_EXT234}"
echo "ISFS_EXT234_FEATURES=${ISFS_EXT234_FEATURES}"
}
# Если заданы входящие параметр имя переменной со значением, то применяются параметры как основной DISK_QUOTA
[[ -n $@ ]] && declare -A DISK_QUOTA && eval $@
if [[ -n ${DISK_QUOTA[@]} ]]; then
local -A MOUNT_DISK_ATTR
KNOW_LSBLK=$("${ROOTFS}"/usr/bin/lsblk --raw --fs --output PATH,FSTYPE,LABEL,PARTLABEL,UUID,PARTUUID,MOUNTPOINT,MOUNTPOINTS --exclude 11,253)
# Построить массив всех из указанных устройств со всеми аттрибутами монтирования для которых существуют квоты
for SELECT_DISK_QUOTA in "${!DISK_QUOTA[@]}"; do
ATTR_QUOTA=${SELECT_DISK_QUOTA%%:*}
IDENT_DEVICE=${SELECT_DISK_QUOTA#*:}; IDENT_DEVICE=${IDENT_DEVICE%:*}
[[ ${IDENT_DEVICE} == quota ]] && continue
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota|quota) && -n ${IDENT_DEVICE} ]]; then
PATH_DEVICE_LSBLK=$(grep "${IDENT_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f1)
[[ -n ${PATH_DEVICE_LSBLK} ]] && PATH_DEVICE=${PATH_DEVICE_LSBLK} || PATH_DEVICE=${IDENT_DEVICE}
elif [[ ${ATTR_QUOTA} == prjquota && -n ${IDENT_DEVICE} ]]; then
PATH_PRJ=${IDENT_DEVICE}
[[ -d ${PATH_PRJ} ]] || continue
PATH_DEVICE=$(${ROOTFS}/usr/bin/findmnt -n -o SOURCE --target ${PATH_PRJ})
[[ -n ${PATH_DEVICE} ]] || PATH_DEVICE=${IDENT_DEVICE}
fi
[[ -z ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ]] && MOUNT_DISK_ATTR[${PATH_DEVICE}]="${ATTR_QUOTA}" || MOUNT_DISK_ATTR[${PATH_DEVICE}]+=",${ATTR_QUOTA}"
done
#echo "#MOUNT_DISK_ATTR[@]=${#MOUNT_DISK_ATTR[@]}"
#echo "!MOUNT_DISK_ATTR[@]=${!MOUNT_DISK_ATTR[@]}"
#echo "MOUNT_DISK_ATTR[@]=${MOUNT_DISK_ATTR[@]}"
# Установить квоты
for SELECT_DISK_QUOTA in "${!DISK_QUOTA[@]}"; do
local ISFS_EXT234= MOUNT_POINT= PATH_PRJ= KNOW_LSBLK= PATH_DEVICE= PATH_DEVICE_LSBLK=
local ISFS_EXT234_FEATURES= # Данные квот храняться в служебных данных файловой системы
ATTR_QUOTA=${SELECT_DISK_QUOTA%%:*}
case ${ATTR_QUOTA} in
quota) ARG_CMD="ugP"; ARG_TUNE2FS=" quota inode:"; FILE_QUOTA="aquota.user" ;;
usrquota) ARG_CMD="u"; ARG_TUNE2FS="User quota inode:"; FILE_QUOTA="aquota.user" ;;
grpquota) ARG_CMD="g"; ARG_TUNE2FS="Group quota inode:"; FILE_QUOTA="aquota.group" ;;
prjquota) ARG_CMD="P"; ARG_TUNE2FS="Project quota inode:"; FILE_QUOTA= ;;
*) exit 1 ;;
esac
ALL_VALUE_QUOTA="${DISK_QUOTA[${SELECT_DISK_QUOTA}]}"
UGP_QUOTA=${SELECT_DISK_QUOTA##*:}
IDENT_DEVICE=${SELECT_DISK_QUOTA#*:}; IDENT_DEVICE=${IDENT_DEVICE%:*}
[[ ${IDENT_DEVICE} == ${UGP_QUOTA} ]] && unset UGP_QUOTA
#[[ ${IDENT_DEVICE} == quota ]] && unset IDENT_DEVICE
if [[ ${ATTR_QUOTA} == quota && ${IDENT_DEVICE} == quota ]]; then
unset IDENT_DEVICE
elif [[ ${ATTR_QUOTA} == @(usrquota|grpquota|quota) && -n ${IDENT_DEVICE} ]]; then
KNOW_LSBLK=$("${ROOTFS}"/usr/bin/lsblk --raw --fs --output PATH,FSTYPE,LABEL,PARTLABEL,UUID,PARTUUID,MOUNTPOINT,MOUNTPOINTS --exclude 11,253)
PATH_DEVICE_LSBLK=$(grep "${IDENT_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f1)
[[ -n ${PATH_DEVICE_LSBLK} ]] && PATH_DEVICE=${PATH_DEVICE_LSBLK} || PATH_DEVICE=${IDENT_DEVICE}
MOUNT_POINT=$(grep "${PATH_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f7)
elif [[ ${ATTR_QUOTA} == prjquota && -n ${IDENT_DEVICE} ]]; then
PATH_PRJ=${SELECT_DISK_QUOTA#*:}; PATH_PRJ=${PATH_PRJ%:*}
[[ -d ${PATH_PRJ} ]] || { echo "ERROR: The specified project directory '${PATH_PRJ}' does not exist." && continue; }
KNOW_LSBLK=$("${ROOTFS}"/usr/bin/findmnt -n -o SOURCE,FSTYPE,TARGET --target ${PATH_PRJ} | xargs)
PATH_DEVICE=$("${ROOTFS}"/usr/bin/findmnt -n -o SOURCE --target ${PATH_PRJ})
[[ -n ${PATH_DEVICE} ]] || PATH_DEVICE=${IDENT_DEVICE}
MOUNT_POINT=$("${ROOTFS}"/usr/bin/findmnt -n -o TARGET --target ${PATH_PRJ})
fi
[[ -n ${KNOW_LSBLK} ]] && ISFS_EXT234=$(grep -oE "${PATH_DEVICE} (ext2|ext3|ext4)" <<< ${KNOW_LSBLK}) #"
[[ -n ${KNOW_LSBLK} && -z ${ISFS_EXT234} ]] && ISFS_XFS=$(grep -oE "${PATH_DEVICE} xfs" <<< ${KNOW_LSBLK})
# Проверить ФС на поддержку SW|HW режимов квот
[[ -n ${ISFS_EXT234} ]] && { ${ROOTFS}/usr/bin/tune2fs -l ${PATH_DEVICE} | grep -q "${ARG_TUNE2FS}" && ISFS_EXT234_FEATURES=yes || ISFS_EXT234_FEATURES=no; }
# TODO: Уточнить получение атрибутов у ФС XFS
[[ -n ${ISFS_XFS} ]] && { ${ROOTFS}/usr/bin/tune2fs -l ${PATH_DEVICE} | grep -q "${ARG_TUNE2FS}" && ISFS_XFS_FEATURES=yes || ISFS_XFS_FEATURES=no; }
#debug
#continue
if [[ ${ALL_VALUE_QUOTA,,} == enable ]]; then
if [[ -n ${PATH_DEVICE} ]]; then
enable_quota
${ROOTFS}/usr/bin/quotaon -${ARG_CMD}vp ${PATH_DEVICE} | grep -qi 'is on (enforced)' || ${ROOTFS}/usr/bin/quotaon -${ARG_CMD} ${PATH_DEVICE}
else
${ROOTFS}/usr/bin/quotaoff -augP 2>/dev/null
${ROOTFS}/usr/bin/quotacheck -aug 2>/dev/null
${ROOTFS}/usr/bin/quotaon -augP 2>/dev/null
#${ROOTFS}/usr/bin/ubconfig --quiet set config SERVICESSTART+=,quotaon.service
fi
elif [[ ${ALL_VALUE_QUOTA,,} == disable ]]; then
if [[ -n ${PATH_DEVICE} ]]; then
disable_quota
else
disable_quota
${ROOTFS}/usr/bin/quotaoff -augP 2>/dev/null
#${ROOTFS}/usr/bin/ubconfig --quiet set config SERVICESSTART--=,quotaon.service
fi
elif [[ ${ALL_VALUE_QUOTA,,} == clean ]]; then
[[ -n ${PATH_DEVICE} ]] && clean_quota
elif [[ ${ALL_VALUE_QUOTA} =~ .*:.*:.*:.* ]]; then
if [[ -n ${PATH_DEVICE} ]]; then
enable_quota
[[ ${ATTR_QUOTA} == prjquota && ${ISFS_EXT234_FEATURES} == no ]] && { echo "ERROR: Project '${UGP_QUOTA}' quota feature not enabled. Cannot enable project quota enforcement." && continue; }
[[ ${ATTR_QUOTA} == prjquota && ${ISFS_XFS_FEATURES} == no ]] && { echo "ERROR: Project '${UGP_QUOTA}' quota feature not enabled. Cannot enable project quota enforcement." && continue; }
if [[ -n ${MOUNT_POINT} ]]; then
set_quota
${ROOTFS}/usr/bin/quotaon -${ARG_CMD}vp ${PATH_DEVICE} | grep -qi 'is on (enforced)' || ${ROOTFS}/usr/bin/quotaon -${ARG_CMD} ${PATH_DEVICE} 2>/dev/null || echo "ERROR: Quota '${ATTR_QUOTA}' not enabled on device '${PATH_DEVICE}'"
fi
fi
fi
done
fi
}
################
##### MAIN #####
################
exec_disk_quota $@
#exec_disk_quota_get $@