|
|
|
@ -14,20 +14,28 @@ SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
|
SOURCE=${SYSCONF}/security; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null
|
|
|
|
SOURCE=${SYSCONF}/security; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null
|
|
|
|
|
|
|
|
|
|
|
|
#declare -A DISK_QUOTA
|
|
|
|
#declare -A DISK_QUOTA
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sdc1]=enable
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sda1]=enable
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sdc1]=disable
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sda1]=disable
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sdc1]=user-1,user-2:7M:8M:0:0:86400:86400
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sda4:user-1,user-2]=7M:8M:0:0:86400:86400
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sdc1]=user-1,user-2:5M:6M:0:0
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sda4:user-1]=5M:6M:0:0
|
|
|
|
#DISK_QUOTA[usrquota:/mnt/MyExt4]=user-1,user-2:5M:6M:0:0
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sda4:user-2]=7M:8M:0:0
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sdc1]=:0:0:0:0:604800:604800
|
|
|
|
#DISK_QUOTA[usrquota:/mnt/MyExt4:user-1,user-2]=5M:6M:0:0
|
|
|
|
#DISK_QUOTA[grpquota:/dev/sdc1]=enable
|
|
|
|
#DISK_QUOTA[usrquota:/dev/sda4]=0:0:0:0:1604800:8604800
|
|
|
|
#DISK_QUOTA[grpquota:/dev/sdc1]=users:5M:6M:0:0:604800:604800
|
|
|
|
|
|
|
|
#DISK_QUOTA[grpquota:/mnt/MyExt4]=users:5M:6M:0:0:604800:604800
|
|
|
|
#DISK_QUOTA[grpquota:/dev/sda1]=enable
|
|
|
|
#DISK_QUOTA[prjquota:/tmp/5/dir23]=3,MyPN-3:3M:4M:10:20:3600:3600
|
|
|
|
#DISK_QUOTA[grpquota:/dev/sda4:users]=2M:3M:0:0:604800:604800
|
|
|
|
#DISK_QUOTA[prjquota:/mnt/MyExt4/test1]=1,PN-1:2M:3M:0:0:3600:3600
|
|
|
|
#DISK_QUOTA[grpquota:/mnt/MyExt4:users]=5M:6M:0:0:604800:604800
|
|
|
|
#DISK_QUOTA[prjquota:/mnt/MyExt4/test2]=2,PN-2:3M:4M:10:12:3600:3600
|
|
|
|
|
|
|
|
|
|
|
|
#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]=disable
|
|
|
|
#DISK_QUOTA[quota]=enable
|
|
|
|
#DISK_QUOTA[quota]=enable
|
|
|
|
|
|
|
|
#DISK_QUOTA[quota:/dev/sda4]=clean
|
|
|
|
|
|
|
|
|
|
|
|
## Назначение квот на дисковые ресурсы
|
|
|
|
## Назначение квот на дисковые ресурсы
|
|
|
|
## Может принимать входящий параметр:
|
|
|
|
## Может принимать входящий параметр:
|
|
|
|
@ -47,40 +55,68 @@ exec_disk_quota(){
|
|
|
|
## jqfmt=vfsold # Использовать БД для простых квот V1
|
|
|
|
## jqfmt=vfsold # Использовать БД для простых квот V1
|
|
|
|
## jqfmt=vfsv0 # Выключить журналирование. Использовать БД для журналируемых квот V2
|
|
|
|
## jqfmt=vfsv0 # Выключить журналирование. Использовать БД для журналируемых квот V2
|
|
|
|
## jqfmt=vfsv1 # Включить журналирование. Использовать БД для журналируемых квот V2
|
|
|
|
## jqfmt=vfsv1 # Включить журналирование. Использовать БД для журналируемых квот V2
|
|
|
|
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" && return 0
|
|
|
|
#cat /proc/mounts | grep -q "^${PATH_DEVICE}.,*${ATTR_QUOTA}" && return 0
|
|
|
|
MOUNT_DISK_ATTR[${PATH_DEVICE}]=${MOUNT_DISK_ATTR[${PATH_DEVICE}]#,*}
|
|
|
|
local MOUNT_DEVICE=$(cat /proc/mounts | grep "^${PATH_DEVICE}" | head -1)
|
|
|
|
if cat /proc/mounts | grep -q "${PATH_DEVICE}"; then
|
|
|
|
if [[ -n ${MOUNT_DEVICE} ]]; then
|
|
|
|
if [[ ${ISFS_EXT234_FEATURES} == no && ! ${PATH_DEVICE} =~ ^/dev/loop* ]] && umount --quiet ${PATH_DEVICE} 2>/dev/null; then
|
|
|
|
if [[ ${ISFS_EXT234_FEATURES} == yes ]]; then
|
|
|
|
${ROOTFS}/usr/bin/tune2fs -Q ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE} && ISFS_EXT234_FEATURES=yes
|
|
|
|
if [[ ${MOUNT_DEVICE} =~ ^${PATH_DEVICE}.*,${ATTR_QUOTA} ]]; then
|
|
|
|
mount --all
|
|
|
|
return 0
|
|
|
|
mount -o ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE} ${MOUNT_POINT}
|
|
|
|
elif mount -o remount,${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE}; then
|
|
|
|
rm -f ${MOUNT_POINT}/{aquota.user,aquota.group,quota.user,quota.group}
|
|
|
|
# Перемонтировать со всеми атрибутами квот
|
|
|
|
elif [[ ${ISFS_EXT234_FEATURES} == yes ]]; then
|
|
|
|
[[ ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} =~ usrquota ]] && rm -f ${MOUNT_POINT}/{aquota.user,quota.user}
|
|
|
|
mount -o remount,${ATTR_QUOTA} ${PATH_DEVICE}
|
|
|
|
[[ ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} =~ grpquota ]] && rm -f ${MOUNT_POINT}/{aquota.group,quota.group}
|
|
|
|
[[ ${ATTR_QUOTA} == usrquota ]] && rm -f ${MOUNT_POINT}/{aquota.user,quota.user}
|
|
|
|
else
|
|
|
|
[[ ${ATTR_QUOTA} == grpquota ]] && rm -f ${MOUNT_POINT}/{aquota.group,quota.group}
|
|
|
|
echo "ERROR: Device '${PATH_DEVICE}' not remounted with options 'remount,${MOUNT_DISK_ATTR[${PATH_DEVICE}]}'"
|
|
|
|
elif [[ ${ISFS_EXT234_FEATURES} == no && ${ATTR_QUOTA} != prjquota ]]; then
|
|
|
|
return 1
|
|
|
|
mount -o remount,${ATTR_QUOTA} ${PATH_DEVICE}
|
|
|
|
fi
|
|
|
|
#${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} 2>/dev/null
|
|
|
|
elif [[ ${ISFS_EXT234_FEATURES} == no ]]; then
|
|
|
|
[[ ${ATTR_QUOTA} == @(usrquota|quota) && ! -f ${MOUNT_POINT}/aquota.user ]] && quotacheck -${ARG_CMD}cm ${PATH_DEVICE}
|
|
|
|
if [[ ${MOUNT_DEVICE} =~ ^${PATH_DEVICE}.*,${ATTR_QUOTA} && -f "${MOUNT_POINT}/${FILE_QUOTA}" ]]; then
|
|
|
|
[[ ${ATTR_QUOTA} == grpquota && ! -f ${MOUNT_POINT}/aquota.group ]] && quotacheck -${ARG_CMD}cm ${PATH_DEVICE}
|
|
|
|
return 0
|
|
|
|
${ROOTFS}/usr/bin/quotacheck -${ARG_CMD} ${PATH_DEVICE}
|
|
|
|
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
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
else
|
|
|
|
[[ -n ${ISFS_EXT234} && ${ISFS_EXT234_FEATURES} == no ]] && ${ROOTFS}/usr/bin/tune2fs -Q ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ${PATH_DEVICE} #2>/dev/null
|
|
|
|
[[ -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."
|
|
|
|
echo "ERROR: Device '${PATH_DEVICE}' not mounted."
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
[[ -z ${ROOTFS} ]] && ubconfig --target system set config SERVICESSTART+=,systemd-quotacheck \
|
|
|
|
|
|
|
|
|| chroot . ubconfig --target system set config SERVICESSTART+=,systemd-quotacheck
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
disable_quota(){
|
|
|
|
disable_quota(){
|
|
|
|
# Отключить поддержку квот
|
|
|
|
# Отключить поддержку квот
|
|
|
|
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" || return 0
|
|
|
|
cat /proc/mounts | grep -q "${PATH_DEVICE}.*,${ATTR_QUOTA}" || return 0
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} 2>/dev/null
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} &>/dev/null
|
|
|
|
if [[ ${ATTR_QUOTA} == quota ]]; then
|
|
|
|
if [[ ${ATTR_QUOTA} == quota ]]; then
|
|
|
|
[[ -z ${ROOTFS} ]] && ubconfig --target system set config SERVICESSTART-=,systemd-quotacheck \
|
|
|
|
if [[ -z ${ROOTFS} ]]; then
|
|
|
|
|| chroot . ubconfig --target system set config SERVICESSTART-=,systemd-quotacheck
|
|
|
|
/usr/bin/ubconfig --quiet --target system set config SERVICESSTART--=,systemd-quotacheck
|
|
|
|
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" && mount -o remount,noquota ${PATH_DEVICE}
|
|
|
|
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
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
}
|
|
|
|
set_quota(){
|
|
|
|
set_quota(){
|
|
|
|
@ -90,22 +126,25 @@ exec_disk_quota(){
|
|
|
|
#${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} #2>/dev/null
|
|
|
|
#${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} #2>/dev/null
|
|
|
|
[[ -n ${QUOTA_GRACE} ]] && setquota -${ARG_CMD}t ${QUOTA_GRACE} ${MOUNT_POINT}
|
|
|
|
[[ -n ${QUOTA_GRACE} ]] && setquota -${ARG_CMD}t ${QUOTA_GRACE} ${MOUNT_POINT}
|
|
|
|
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota) && -n ${UGP_QUOTA} ]]; then
|
|
|
|
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota) && -n ${UGP_QUOTA} ]]; then
|
|
|
|
tr , '\n' <<< ${UGP_QUOTA} | while read SELECT_UG_QUOTA; do
|
|
|
|
while read SELECT_UG_QUOTA; do
|
|
|
|
${ROOTFS}/usr/bin/setquota -${ARG_CMD} ${SELECT_UG_QUOTA} ${QUOTA_LIMITS} ${PATH_DEVICE}
|
|
|
|
${ROOTFS}/usr/bin/setquota -${ARG_CMD} ${SELECT_UG_QUOTA} ${QUOTA_LIMITS} ${PATH_DEVICE}
|
|
|
|
done
|
|
|
|
done < <(tr ",;[[:space:]]" \\n <<< ${UGP_QUOTA})
|
|
|
|
elif [[ ${ATTR_QUOTA} == prjquota && -n ${UGP_QUOTA} ]]; then
|
|
|
|
elif [[ ${ATTR_QUOTA} == prjquota && -n ${UGP_QUOTA} ]]; then
|
|
|
|
ID_PROJECT=${UGP_QUOTA%%,*}
|
|
|
|
ID_PROJECT=${UGP_QUOTA%%,*}
|
|
|
|
NAME_PROJECT=${UGP_QUOTA#*,}
|
|
|
|
NAME_PROJECT=${UGP_QUOTA#*,}
|
|
|
|
[[ ${ID_PROJECT,,} == auto ]] && ID_PROJECT=${RANDOM}
|
|
|
|
if [[ ${ID_PROJECT,,} == auto ]]; then
|
|
|
|
sed "\|^${ID_PROJECT}:.*|d; \|.*:${PATH_PRJ}$|d" -i /etc/projects
|
|
|
|
FIND_ID_PROJECT=$(lsattr -p -d "${PATH_PRJ}" | cut -d' ' -f1)
|
|
|
|
echo "${ID_PROJECT}:${PATH_PRJ}" >> /etc/projects
|
|
|
|
[[ -n ${FIND_ID_PROJECT} && ${FIND_ID_PROJECT} != 0 ]] && ID_PROJECT=${FIND_ID_PROJECT} || ID_PROJECT=${RANDOM}
|
|
|
|
sed "/.*:${ID_PROJECT}$/d" -i /etc/projid
|
|
|
|
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
|
|
|
|
if [[ -n ${NAME_PROJECT} ]]; then
|
|
|
|
sed "/^${NAME_PROJECT}:.*/d" -i /etc/projid
|
|
|
|
[[ -f ${ROOTFS}/etc/projid ]] && sed "/^${NAME_PROJECT}:.*/d" -i ${ROOTFS}/etc/projid 2>/dev/null
|
|
|
|
echo "${NAME_PROJECT}:${ID_PROJECT}" >> /etc/projid
|
|
|
|
echo "${NAME_PROJECT}:${ID_PROJECT}" >> ${ROOTFS}/etc/projid
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
if [[ -n ${ISFS_EXT234} || -n ${ISFS_XFS} || -n ${ISFS_BTRFS} ]]; then
|
|
|
|
if [[ -n ${ISFS_EXT234} || -n ${ISFS_XFS} || -n ${ISFS_BTRFS} ]]; then
|
|
|
|
${ROOTFS}/usr/bin/chattr -p ${ID_PROJECT} ${PATH_PRJ}
|
|
|
|
${ROOTFS}/usr/bin/chattr -R -p ${ID_PROJECT} ${PATH_PRJ}
|
|
|
|
${ROOTFS}/usr/bin/chattr +P ${PATH_PRJ}
|
|
|
|
${ROOTFS}/usr/bin/chattr +P ${PATH_PRJ}
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
${ROOTFS}/usr/bin/setquota -${ARG_CMD} ${ID_PROJECT} ${QUOTA_LIMITS} ${PATH_DEVICE}
|
|
|
|
${ROOTFS}/usr/bin/setquota -${ARG_CMD} ${ID_PROJECT} ${QUOTA_LIMITS} ${PATH_DEVICE}
|
|
|
|
@ -114,16 +153,37 @@ exec_disk_quota(){
|
|
|
|
clean_quota(){
|
|
|
|
clean_quota(){
|
|
|
|
# Очистить данные квот
|
|
|
|
# Очистить данные квот
|
|
|
|
#disable_quota
|
|
|
|
#disable_quota
|
|
|
|
if cat /proc/mounts | grep -q ${PATH_DEVICE}; then
|
|
|
|
local MOUNT_DEVICE=$(cat /proc/mounts | grep "^${PATH_DEVICE}" | head -1)
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -ugP ${PATH_DEVICE} 2>/dev/null
|
|
|
|
if [[ -n ${MOUNT_DEVICE} ]]; then
|
|
|
|
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" && mount -o remount,noquota ${PATH_DEVICE}
|
|
|
|
if [[ ${ATTR_QUOTA} == prjquota ]]; then
|
|
|
|
rm -f ${MOUNT_POINT}/{aquota.user,aquota.group,quota.user,quota.group}
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -P ${PATH_DEVICE} 2>/dev/null
|
|
|
|
if [[ ${ISFS_EXT234_FEATURES} == yes ]] && umount --quiet ${PATH_DEVICE} 2>/dev/null; then
|
|
|
|
if [[ -n ${UGP_QUOTA} ]]; then
|
|
|
|
${ROOTFS}/usr/bin/tune2fs -Q ^usrquota,^grpquota,^prjquota ${PATH_DEVICE} 2>/dev/null
|
|
|
|
ID_PROJECT=${UGP_QUOTA%%,*}
|
|
|
|
#${ROOTFS}/usr/bin/tune2fs -Q quota,project ${PATH_DEVICE} 2>/dev/null
|
|
|
|
NAME_PROJECT=${UGP_QUOTA#*,}
|
|
|
|
mount --all
|
|
|
|
[[ -f ${ROOTFS}/etc/projects ]] && sed "\|^${ID_PROJECT}:.*|d; \|.*:${PATH_PRJ}$|d" -i ${ROOTFS}/etc/projects 2>/dev/null
|
|
|
|
mount ${PATH_DEVICE} ${MOUNT_POINT}
|
|
|
|
[[ -f ${ROOTFS}/etc/projid ]] && sed "/.*:${ID_PROJECT}$/d" -i ${ROOTFS}/etc/projid 2>/dev/null
|
|
|
|
fi
|
|
|
|
[[ -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
|
|
|
|
else
|
|
|
|
if [[ ${ISFS_EXT234_FEATURES} == yes ]]; then
|
|
|
|
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
|
|
|
|
@ -149,43 +209,51 @@ exec_disk_quota(){
|
|
|
|
if [[ -n ${DISK_QUOTA[@]} ]]; then
|
|
|
|
if [[ -n ${DISK_QUOTA[@]} ]]; then
|
|
|
|
local -A MOUNT_DISK_ATTR
|
|
|
|
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)
|
|
|
|
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
|
|
|
|
for SELECT_DISK_QUOTA in "${!DISK_QUOTA[@]}"; do
|
|
|
|
ATTR_QUOTA=${SELECT_DISK_QUOTA%%:*}
|
|
|
|
ATTR_QUOTA=${SELECT_DISK_QUOTA%%:*}
|
|
|
|
IDENT_DEVICE=${SELECT_DISK_QUOTA#*:}
|
|
|
|
IDENT_DEVICE=${SELECT_DISK_QUOTA#*:}; IDENT_DEVICE=${IDENT_DEVICE%:*}
|
|
|
|
[[ ${IDENT_DEVICE} == quota ]] && continue
|
|
|
|
[[ ${IDENT_DEVICE} == quota ]] && continue
|
|
|
|
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota|quota) && -n ${IDENT_DEVICE} ]]; then
|
|
|
|
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota|quota) && -n ${IDENT_DEVICE} ]]; then
|
|
|
|
PATH_DEVICE_LSBLK=$(grep "${IDENT_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f1)
|
|
|
|
PATH_DEVICE_LSBLK=$(grep "${IDENT_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f1)
|
|
|
|
[[ -n ${PATH_DEVICE_LSBLK} ]] && PATH_DEVICE=${PATH_DEVICE_LSBLK} || PATH_DEVICE=${IDENT_DEVICE}
|
|
|
|
[[ -n ${PATH_DEVICE_LSBLK} ]] && PATH_DEVICE=${PATH_DEVICE_LSBLK} || PATH_DEVICE=${IDENT_DEVICE}
|
|
|
|
elif [[ ${ATTR_QUOTA} == prjquota && -n ${IDENT_DEVICE} ]]; then
|
|
|
|
elif [[ ${ATTR_QUOTA} == prjquota && -n ${IDENT_DEVICE} ]]; then
|
|
|
|
PATH_PRJ=${SELECT_DISK_QUOTA#*:}
|
|
|
|
PATH_PRJ=${IDENT_DEVICE}
|
|
|
|
[[ -d ${PATH_PRJ} ]] || continue
|
|
|
|
[[ -d ${PATH_PRJ} ]] || continue
|
|
|
|
PATH_DEVICE=$("${ROOTFS}"/usr/bin/findmnt -n -o SOURCE --target ${PATH_PRJ})
|
|
|
|
PATH_DEVICE=$(${ROOTFS}/usr/bin/findmnt -n -o SOURCE --target ${PATH_PRJ})
|
|
|
|
[[ -n ${PATH_DEVICE} ]] || PATH_DEVICE=${IDENT_DEVICE}
|
|
|
|
[[ -n ${PATH_DEVICE} ]] || PATH_DEVICE=${IDENT_DEVICE}
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
MOUNT_DISK_ATTR[${PATH_DEVICE}]+=",${ATTR_QUOTA}"
|
|
|
|
[[ -z ${MOUNT_DISK_ATTR[${PATH_DEVICE}]} ]] && MOUNT_DISK_ATTR[${PATH_DEVICE}]="${ATTR_QUOTA}" || MOUNT_DISK_ATTR[${PATH_DEVICE}]+=",${ATTR_QUOTA}"
|
|
|
|
done
|
|
|
|
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
|
|
|
|
for SELECT_DISK_QUOTA in "${!DISK_QUOTA[@]}"; do
|
|
|
|
local ISFS_EXT234 MOUNT_POINT PATH_PRJ
|
|
|
|
local ISFS_EXT234= MOUNT_POINT= PATH_PRJ= KNOW_LSBLK= PATH_DEVICE= PATH_DEVICE_LSBLK=
|
|
|
|
local ISFS_EXT234_FEATURES # Данные квот храняться в служебных данных файловой системы
|
|
|
|
local ISFS_EXT234_FEATURES= # Данные квот храняться в служебных данных файловой системы
|
|
|
|
ATTR_QUOTA=${SELECT_DISK_QUOTA%%:*}
|
|
|
|
ATTR_QUOTA=${SELECT_DISK_QUOTA%%:*}
|
|
|
|
case ${ATTR_QUOTA} in
|
|
|
|
case ${ATTR_QUOTA} in
|
|
|
|
quota) ARG_CMD="ugP"; ARG_TUNE2FS=" quota inode:" ;;
|
|
|
|
quota) ARG_CMD="ugP"; ARG_TUNE2FS=" quota inode:"; FILE_QUOTA="aquota.user" ;;
|
|
|
|
usrquota) ARG_CMD="u"; ARG_TUNE2FS="User quota inode:" ;;
|
|
|
|
usrquota) ARG_CMD="u"; ARG_TUNE2FS="User quota inode:"; FILE_QUOTA="aquota.user" ;;
|
|
|
|
grpquota) ARG_CMD="g"; ARG_TUNE2FS="Group quota inode:" ;;
|
|
|
|
grpquota) ARG_CMD="g"; ARG_TUNE2FS="Group quota inode:"; FILE_QUOTA="aquota.group" ;;
|
|
|
|
prjquota) ARG_CMD="P"; ARG_TUNE2FS="Project quota inode:" ;;
|
|
|
|
prjquota) ARG_CMD="P"; ARG_TUNE2FS="Project quota inode:"; FILE_QUOTA= ;;
|
|
|
|
*) exit 1 ;;
|
|
|
|
*) exit 1 ;;
|
|
|
|
esac
|
|
|
|
esac
|
|
|
|
UGP_QUOTA=${DISK_QUOTA[${SELECT_DISK_QUOTA}]%%:*}
|
|
|
|
ALL_VALUE_QUOTA="${DISK_QUOTA[${SELECT_DISK_QUOTA}]}"
|
|
|
|
ALL_VALUE_QUOTA="${DISK_QUOTA[${SELECT_DISK_QUOTA}]#*:}"
|
|
|
|
UGP_QUOTA=${SELECT_DISK_QUOTA##*:}
|
|
|
|
IDENT_DEVICE=${SELECT_DISK_QUOTA#*:}
|
|
|
|
IDENT_DEVICE=${SELECT_DISK_QUOTA#*:}; IDENT_DEVICE=${IDENT_DEVICE%:*}
|
|
|
|
[[ ${IDENT_DEVICE} == quota ]] && unset IDENT_DEVICE
|
|
|
|
[[ ${IDENT_DEVICE} == ${UGP_QUOTA} ]] && unset UGP_QUOTA
|
|
|
|
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota|quota) && -n ${IDENT_DEVICE} ]]; then
|
|
|
|
#[[ ${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)
|
|
|
|
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)
|
|
|
|
PATH_DEVICE_LSBLK=$(grep "${IDENT_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f1)
|
|
|
|
[[ -n ${PATH_DEVICE_LSBLK} ]] && PATH_DEVICE=${PATH_DEVICE_LSBLK} || PATH_DEVICE=${IDENT_DEVICE}
|
|
|
|
[[ -n ${PATH_DEVICE_LSBLK} ]] && PATH_DEVICE=${PATH_DEVICE_LSBLK} || PATH_DEVICE=${IDENT_DEVICE}
|
|
|
|
MOUNT_POINT=$(grep "${PATH_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f7)
|
|
|
|
MOUNT_POINT=$(grep "${PATH_DEVICE}" <<< ${KNOW_LSBLK} | cut -d' ' -f7)
|
|
|
|
elif [[ ${ATTR_QUOTA} == prjquota && -n ${IDENT_DEVICE} ]]; then
|
|
|
|
elif [[ ${ATTR_QUOTA} == prjquota && -n ${IDENT_DEVICE} ]]; then
|
|
|
|
PATH_PRJ=${SELECT_DISK_QUOTA#*:}
|
|
|
|
PATH_PRJ=${SELECT_DISK_QUOTA#*:}; PATH_PRJ=${PATH_PRJ%:*}
|
|
|
|
[[ -d ${PATH_PRJ} ]] || { echo "ERROR: The specified project directory '${PATH_PRJ}' does not exist." && continue; }
|
|
|
|
[[ -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)
|
|
|
|
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})
|
|
|
|
PATH_DEVICE=$("${ROOTFS}"/usr/bin/findmnt -n -o SOURCE --target ${PATH_PRJ})
|
|
|
|
@ -199,7 +267,8 @@ exec_disk_quota(){
|
|
|
|
# TODO: Уточнить получение атрибутов у ФС XFS
|
|
|
|
# TODO: Уточнить получение атрибутов у ФС XFS
|
|
|
|
[[ -n ${ISFS_XFS} ]] && { ${ROOTFS}/usr/bin/tune2fs -l ${PATH_DEVICE} | grep -q "${ARG_TUNE2FS}" && ISFS_XFS_FEATURES=yes || ISFS_XFS_FEATURES=no; }
|
|
|
|
[[ -n ${ISFS_XFS} ]] && { ${ROOTFS}/usr/bin/tune2fs -l ${PATH_DEVICE} | grep -q "${ARG_TUNE2FS}" && ISFS_XFS_FEATURES=yes || ISFS_XFS_FEATURES=no; }
|
|
|
|
#debug
|
|
|
|
#debug
|
|
|
|
if [[ ${UGP_QUOTA,,} == enable ]]; then
|
|
|
|
#continue
|
|
|
|
|
|
|
|
if [[ ${ALL_VALUE_QUOTA,,} == enable ]]; then
|
|
|
|
if [[ -n ${PATH_DEVICE} ]]; then
|
|
|
|
if [[ -n ${PATH_DEVICE} ]]; then
|
|
|
|
enable_quota
|
|
|
|
enable_quota
|
|
|
|
${ROOTFS}/usr/bin/quotaon -${ARG_CMD}vp ${PATH_DEVICE} | grep -qi 'is on (enforced)' || ${ROOTFS}/usr/bin/quotaon -${ARG_CMD} ${PATH_DEVICE}
|
|
|
|
${ROOTFS}/usr/bin/quotaon -${ARG_CMD}vp ${PATH_DEVICE} | grep -qi 'is on (enforced)' || ${ROOTFS}/usr/bin/quotaon -${ARG_CMD} ${PATH_DEVICE}
|
|
|
|
@ -207,18 +276,18 @@ exec_disk_quota(){
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -augP 2>/dev/null
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -augP 2>/dev/null
|
|
|
|
${ROOTFS}/usr/bin/quotacheck -aug 2>/dev/null
|
|
|
|
${ROOTFS}/usr/bin/quotacheck -aug 2>/dev/null
|
|
|
|
${ROOTFS}/usr/bin/quotaon -augP 2>/dev/null
|
|
|
|
${ROOTFS}/usr/bin/quotaon -augP 2>/dev/null
|
|
|
|
#${ROOTFS}/usr/bin/ubconfig set config SERVICESSTART+=,quotaon.service
|
|
|
|
#${ROOTFS}/usr/bin/ubconfig --quiet set config SERVICESSTART+=,quotaon.service
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
elif [[ ${UGP_QUOTA,,} == disable ]]; then
|
|
|
|
elif [[ ${ALL_VALUE_QUOTA,,} == disable ]]; then
|
|
|
|
if [[ -n ${PATH_DEVICE} ]]; then
|
|
|
|
if [[ -n ${PATH_DEVICE} ]]; then
|
|
|
|
disable_quota
|
|
|
|
disable_quota
|
|
|
|
else
|
|
|
|
else
|
|
|
|
disable_quota
|
|
|
|
disable_quota
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -augP 2>/dev/null
|
|
|
|
${ROOTFS}/usr/bin/quotaoff -augP 2>/dev/null
|
|
|
|
#${ROOTFS}/usr/bin/ubconfig set config SERVICESSTART-=,quotaon.service
|
|
|
|
#${ROOTFS}/usr/bin/ubconfig --quiet set config SERVICESSTART--=,quotaon.service
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
elif [[ ${UGP_QUOTA,,} == clean ]]; then
|
|
|
|
elif [[ ${ALL_VALUE_QUOTA,,} == clean ]]; then
|
|
|
|
[[ -n ${PATH_DEVICE} ]] && clean_quota
|
|
|
|
[[ -n ${PATH_DEVICE} ]] && clean_quota
|
|
|
|
elif [[ ${ALL_VALUE_QUOTA} =~ .*:.*:.*:.* ]]; then
|
|
|
|
elif [[ ${ALL_VALUE_QUOTA} =~ .*:.*:.*:.* ]]; then
|
|
|
|
if [[ -n ${PATH_DEVICE} ]]; then
|
|
|
|
if [[ -n ${PATH_DEVICE} ]]; then
|
|
|
|
@ -240,3 +309,5 @@ exec_disk_quota(){
|
|
|
|
################
|
|
|
|
################
|
|
|
|
|
|
|
|
|
|
|
|
exec_disk_quota $@
|
|
|
|
exec_disk_quota $@
|
|
|
|
|
|
|
|
#exec_disk_quota_get $@
|
|
|
|
|
|
|
|
|