Bump version to 2.13

master
Dmitry Razumov 3 years ago
parent 4476187a77
commit e9480bb2b1

@ -1 +1 @@
VERSION 2.12
VERSION 2.13

@ -14,9 +14,9 @@ SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/boot; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null
SELF_NAME="20-grub"
NAME_GRUB_CFG="grub.cfg"
get_path_grub2(){
NAME_GRUB_CFG="grub.cfg"
PATH_GRUB=$(find ${ROOTFS}/memory/data/from/*/boot/grub/ -maxdepth 1 -type f -name "${NAME_GRUB_CFG}" | head -1)
[[ -n ${PATH_GRUB} ]] || PATH_GRUB="$(find ${ROOTFS}/memory/data/from/*/ -maxdepth 3 -type f -name "${NAME_GRUB_CFG}" | head -1)"
[[ -n ${PATH_GRUB} ]] || return 1
@ -165,7 +165,6 @@ exec_grub_cmdline_linux(){
# Возможность подключить как source из любого скрипта и вызов встроенных функций
get_path_grub2 || exit 1
#PATH_GRUB="/mnt/livemedia/ublinux-data/work/rc.halt.pre"
FILE_GRUB_VAR_USER="${PATH_GRUB}/ublinux/grub_var_user.cfg"
[[ -f ${FILE_GRUB_VAR_USER} ]] || touch ${FILE_GRUB_VAR_USER}

@ -14,20 +14,28 @@ 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/sdc1]=enable
#DISK_QUOTA[usrquota:/dev/sdc1]=disable
#DISK_QUOTA[usrquota:/dev/sdc1]=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:/mnt/MyExt4]=user-1,user-2:5M:6M:0:0
#DISK_QUOTA[usrquota:/dev/sdc1]=:0:0:0:0:604800:604800
#DISK_QUOTA[grpquota:/dev/sdc1]=enable
#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[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/MyExt4/test2]=2,PN-2:3M:4M:10:12:3600:3600
#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
## Назначение квот на дисковые ресурсы
## Может принимать входящий параметр:
@ -47,40 +55,68 @@ exec_disk_quota(){
## jqfmt=vfsold # Использовать БД для простых квот V1
## jqfmt=vfsv0 # Выключить журналирование. Использовать БД для журналируемых квот V2
## jqfmt=vfsv1 # Включить журналирование. Использовать БД для журналируемых квот V2
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" && return 0
MOUNT_DISK_ATTR[${PATH_DEVICE}]=${MOUNT_DISK_ATTR[${PATH_DEVICE}]#,*}
if cat /proc/mounts | grep -q "${PATH_DEVICE}"; then
if [[ ${ISFS_EXT234_FEATURES} == no && ! ${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}
rm -f ${MOUNT_POINT}/{aquota.user,aquota.group,quota.user,quota.group}
elif [[ ${ISFS_EXT234_FEATURES} == yes ]]; then
mount -o remount,${ATTR_QUOTA} ${PATH_DEVICE}
[[ ${ATTR_QUOTA} == usrquota ]] && rm -f ${MOUNT_POINT}/{aquota.user,quota.user}
[[ ${ATTR_QUOTA} == grpquota ]] && rm -f ${MOUNT_POINT}/{aquota.group,quota.group}
elif [[ ${ISFS_EXT234_FEATURES} == no && ${ATTR_QUOTA} != prjquota ]]; then
mount -o remount,${ATTR_QUOTA} ${PATH_DEVICE}
#${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} 2>/dev/null
[[ ${ATTR_QUOTA} == @(usrquota|quota) && ! -f ${MOUNT_POINT}/aquota.user ]] && quotacheck -${ARG_CMD}cm ${PATH_DEVICE}
[[ ${ATTR_QUOTA} == grpquota && ! -f ${MOUNT_POINT}/aquota.group ]] && quotacheck -${ARG_CMD}cm ${PATH_DEVICE}
${ROOTFS}/usr/bin/quotacheck -${ARG_CMD} ${PATH_DEVICE}
#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."
[[ -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
[[ -z ${ROOTFS} ]] && ubconfig --target system set config SERVICESSTART+=,systemd-quotacheck \
|| chroot . ubconfig --target system set config SERVICESSTART+=,systemd-quotacheck
}
disable_quota(){
# Отключить поддержку квот
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" || return 0
${ROOTFS}/usr/bin/quotaoff -${ARG_CMD} ${PATH_DEVICE} 2>/dev/null
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
[[ -z ${ROOTFS} ]] && ubconfig --target system set config SERVICESSTART-=,systemd-quotacheck \
|| chroot . ubconfig --target system set config SERVICESSTART-=,systemd-quotacheck
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" && mount -o remount,noquota ${PATH_DEVICE}
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(){
@ -90,22 +126,25 @@ exec_disk_quota(){
#${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
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}
done
done < <(tr ",;[[:space:]]" \\n <<< ${UGP_QUOTA})
elif [[ ${ATTR_QUOTA} == prjquota && -n ${UGP_QUOTA} ]]; then
ID_PROJECT=${UGP_QUOTA%%,*}
NAME_PROJECT=${UGP_QUOTA#*,}
[[ ${ID_PROJECT,,} == auto ]] && ID_PROJECT=${RANDOM}
sed "\|^${ID_PROJECT}:.*|d; \|.*:${PATH_PRJ}$|d" -i /etc/projects
echo "${ID_PROJECT}:${PATH_PRJ}" >> /etc/projects
sed "/.*:${ID_PROJECT}$/d" -i /etc/projid
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
sed "/^${NAME_PROJECT}:.*/d" -i /etc/projid
echo "${NAME_PROJECT}:${ID_PROJECT}" >> /etc/projid
[[ -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 -p ${ID_PROJECT} ${PATH_PRJ}
${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}
@ -114,16 +153,37 @@ exec_disk_quota(){
clean_quota(){
# Очистить данные квот
#disable_quota
if cat /proc/mounts | grep -q ${PATH_DEVICE}; then
${ROOTFS}/usr/bin/quotaoff -ugP ${PATH_DEVICE} 2>/dev/null
cat /proc/mounts | grep -q "${PATH_DEVICE}.*${ATTR_QUOTA}" && mount -o remount,noquota ${PATH_DEVICE}
rm -f ${MOUNT_POINT}/{aquota.user,aquota.group,quota.user,quota.group}
if [[ ${ISFS_EXT234_FEATURES} == yes ]] && 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}
fi
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
@ -149,43 +209,51 @@ exec_disk_quota(){
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=${SELECT_DISK_QUOTA#*:}; IDENT_DEVICE=${IDENT_DEVICE%:*}
[[ ${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)
[[ -n ${PATH_DEVICE_LSBLK} ]] && PATH_DEVICE=${PATH_DEVICE_LSBLK} || PATH_DEVICE=${IDENT_DEVICE}
elif [[ ${ATTR_QUOTA} == prjquota && -n ${IDENT_DEVICE} ]]; then
PATH_PRJ=${SELECT_DISK_QUOTA#*:}
PATH_PRJ=${IDENT_DEVICE}
[[ -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}
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
#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
local ISFS_EXT234_FEATURES # Данные квот храняться в служебных данных файловой системы
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:" ;;
usrquota) ARG_CMD="u"; ARG_TUNE2FS="User quota inode:" ;;
grpquota) ARG_CMD="g"; ARG_TUNE2FS="Group quota inode:" ;;
prjquota) ARG_CMD="P"; ARG_TUNE2FS="Project quota inode:" ;;
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
UGP_QUOTA=${DISK_QUOTA[${SELECT_DISK_QUOTA}]%%:*}
ALL_VALUE_QUOTA="${DISK_QUOTA[${SELECT_DISK_QUOTA}]#*:}"
IDENT_DEVICE=${SELECT_DISK_QUOTA#*:}
[[ ${IDENT_DEVICE} == quota ]] && unset IDENT_DEVICE
if [[ ${ATTR_QUOTA} == @(usrquota|grpquota|quota) && -n ${IDENT_DEVICE} ]]; then
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=${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})
@ -199,7 +267,8 @@ exec_disk_quota(){
# 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
if [[ ${UGP_QUOTA,,} == enable ]]; then
#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}
@ -207,18 +276,18 @@ exec_disk_quota(){
${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 set config SERVICESSTART+=,quotaon.service
#${ROOTFS}/usr/bin/ubconfig --quiet set config SERVICESSTART+=,quotaon.service
fi
elif [[ ${UGP_QUOTA,,} == disable ]]; then
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 set config SERVICESSTART-=,quotaon.service
#${ROOTFS}/usr/bin/ubconfig --quiet set config SERVICESSTART--=,quotaon.service
fi
elif [[ ${UGP_QUOTA,,} == clean ]]; then
elif [[ ${ALL_VALUE_QUOTA,,} == clean ]]; then
[[ -n ${PATH_DEVICE} ]] && clean_quota
elif [[ ${ALL_VALUE_QUOTA} =~ .*:.*:.*:.* ]]; then
if [[ -n ${PATH_DEVICE} ]]; then
@ -240,3 +309,5 @@ exec_disk_quota(){
################
exec_disk_quota $@
#exec_disk_quota_get $@

@ -1,7 +1,9 @@
# Файл ublinux.ini рекомендуется использовать в папке ublinux-data
# Если вы работаете в режиме полной песочницы и у вас отстуствует папка ublinux-data, вы можетеперенести его в папку ublinux
# Now int is recommended to place ublinux.ini file to folder ublinux-data
# If you want to delete this folder (when using in full sandbox mode) you may move it into folder ublinux-data
# Файл ublinux.ini рекомендуется использовать в папке /ublinux-data/
# Если вы работаете в режиме песочницы и у вас отсутствует папка
# /ublinux-data/, вы можете перенести его в папку /ublinux/
# We recommend using the ublinux.ini file in the /ublinux-data/ folder
# If you are working in sandbox mode and you don't have the /ublinux-data/
# folder, you can move it to the /ublinux/ folder
# UBLinux settings
# UBLinux настройка
@ -28,7 +30,7 @@
[/etc/ublinux/config]
## Config verison
## Версия конфигурации
VERSION=2.11
VERSION=2.13
## Additional boot parameters
## Дополнительные параметры загрузки, только для управления модулями
@ -79,7 +81,7 @@ NEEDEDUSERS='superadmin:1000:x:Администратор'
## Автоматически поднимать службы (можно указывать службы xinetd)
## Для работы bluetooth SERVICESSTART+=bluetooth
## Для работы в WINDOWS сетях с DNS NETBIOS, включить NSSWITCHWINBIND=yes и добавить SERVICESSTART=nmb,winbind
## Для VMWareWorkstation: vmware-networks, vmware-usbarbitrator
## Для VMWareWorkstation: vmware-networks,vmware-usbarbitrator
## SERVICESSTART=tor,polipo,cups-lpd,pcscd
SERVICESSTART=dbus-broker,NetworkManager,sshd,systemd-swap,systemd-timesyncd,cups,cockpit.socket,avahi-daemon,avahi-dnsconfd,veyon,smb,nmb,winbind,bluetooth
@ -514,11 +516,14 @@ NSSWITCHWINBIND=yes
## Использовать дисковые квоты на файловые системы ext2,ext3,ext4,jfs,xfs,vfs,nfs,...
## Внимание: для квот на группу, необходимо что-бы указанная группа была основной у пользователей.
## Альтернатива для проектов, через дополнительную группу projgrp: groupadd projgrp; mkdir /home/projects; chgrp projgrp /home/projects; chmod g+s /home/projects
## DISK_QUOTA[<quota_type>:<device_ident>]=<enable/disable>
## DISK_QUOTA[<quota_type>:<device_ident>]=:0:0:0:0:<bgrace>:<igrace>
## DISK_QUOTA[<quota_type>:<device_ident>]=<user1,user2,user_n>:<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[<quota_type>:<device_ident>]=<group_1,group_2,group_n>:<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[prjquota:<path_dir>]=<project_id>,<project_name>:<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## Информация: Если квотами просиходит управление через другие программы, то достаточно только включить квоты на требуемый тип квоты.
## DISK_QUOTA[<quota_type>[:<device_ident>]]=<enable/disable>
## DISK_QUOTA[<quota_type>:<device_ident>]=0:0:0:0:<bgrace>:<igrace>
## DISK_QUOTA[<quota_type>:<device_ident>:<user1,user2,user_n>]=<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[<quota_type>:<device_ident>:<group_1,group_2,group_n>]=<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[prjquota:<path_dir>:<project_id>[,<project_name>]]=<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[prjquota:<path_dir>:<project_id>[,<project_name>]]=0:0:0:0:<bgrace>:<igrace>
## DISK_QUOTA[prjquota:<path_dir>:[<project_id>][,<project_name>]]=clean
## DISK_QUOTA[quota:<device_ident>]=clean
## DISK_QUOTA[quota]=<enable/disable>
## <quota_type> # Тип квоты, может принимать значения:
@ -534,13 +539,13 @@ NSSWITCHWINBIND=yes
## UUID # UUID файловой системы
## PARTUUID # UUID раздела
## MOUNTPOINT # Путь куда примонтировано устройство
## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234
## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234|XFS. Очистить информацию о проекте квот.
## <path_dir> # Путь до каталога
## <user_1,user_2,user_n> # Перечень пользователей разделённых ,
## <group_1,group_2,group_n> # Перечень групп разделённых ,
## <user_1,user_2,user_n> # Перечень пользователей разделённых ','
## <group_1,group_2,group_n> # Перечень групп разделённых ','
## <project_id> # Номер проекта, цифра, обязательное поле, может принимать значение
## numbers # Произвольный номер состоящий только из цифр
## AUTO # Автоматически генерирует произвольный номер
## AUTO # Автоматически генерирует произвольный номер. Если на путь ранее устанавливался номер, то использует старый номер.
## <project_name> # Имя буквенно проекта, не обязательное поле
## <bsoft> # Указывает программное ограничение размера block в файловой системе, предупреждение. Применимо: M(egabyte),G(igabyte),T(erabyte)
## <bhard> # Указывает жесткое ограничение размера block в файловой системе. Применимо: M(egabyte),G(igabyte),T(erabyte)
@ -550,13 +555,13 @@ NSSWITCHWINBIND=yes
## [<igrace>] # Льготный период секунд в течении которого разрешено превысить isoft ограничение, не более ihard. Не обязательный
## DISK_QUOTA[usrquota:/dev/sda3]=enable
## DISK_QUOTA[usrquota:/dev/sda3]=disable
## DISK_QUOTA[usrquota:/dev/sdc1]=user-1,user-2:100M:150M:100:150
## DISK_QUOTA[usrquota:/dev/sdc1]=:0:0:0:0:86400:86400
## DISK_QUOTA[usrquota:/dev/sdc1]=user-1,user-2:100M:150M:100:150:86400:86400
## DISK_QUOTA[grpquota:/dev/sdc1]=users,users@domain.com:1G:1500M:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project1]=AUTO:5G:6G:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project2]=1,MyProjectName:500M:600M:0:0:604800:604800
## DISK_QUOTA[quota]=enable
## DISK_QUOTA[usrquota:/dev/sdc1:user-1,user-2]=100M:150M:100:150
## DISK_QUOTA[usrquota:/dev/sdc1]=0:0:0:0:86400:86400
## DISK_QUOTA[usrquota:/dev/sdc1:user-1,user-2]=100M:150M:100:150:86400:86400
## DISK_QUOTA[grpquota:/dev/sdc1:users,users@domain.com]=1G:1500M:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project2:1,MyProjectName]=500M:600M:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project1:AUTO]=5G:6G:0:0:604800:604800
## Квоты на ресурсы, через cgroup2. Механизм systemd или напрямую cgroup. man 5 systemd.resource-control
## CGROUP_QUOTA[unit|user]=property_1=value,property_2=value,property_n=value

@ -1,7 +1,9 @@
# Файл ublinux.ini рекомендуется использовать в папке ublinux-data
# Если вы работаете в режиме полной песочницы и у вас отстуствует папка ublinux-data, вы можетеперенести его в папку ublinux
# Now int is recommended to place ublinux.ini file to folder ublinux-data
# If you want to delete this folder (when using in full sandbox mode) you may move it into folder ublinux-data
# Файл ublinux.ini рекомендуется использовать в папке /ublinux-data/
# Если вы работаете в режиме песочницы и у вас отсутствует папка
# /ublinux-data/, вы можете перенести его в папку /ublinux/
# We recommend using the ublinux.ini file in the /ublinux-data/ folder
# If you are working in sandbox mode and you don't have the /ublinux-data/
# folder, you can move it to the /ublinux/ folder
# UBLinux settings
# UBLinux настройка
@ -79,7 +81,7 @@ NEEDEDUSERS='superadmin:1000:x:Администратор'
## Автоматически поднимать службы (можно указывать службы xinetd)
## Для работы bluetooth SERVICESSTART+=bluetooth
## Для работы в WINDOWS сетях с DNS NETBIOS, включить NSSWITCHWINBIND=yes и добавить SERVICESSTART=nmb,winbind
## Для VMWareWorkstation: vmware-networks, vmware-usbarbitrator
## Для VMWareWorkstation: vmware-networks,vmware-usbarbitrator
## SERVICESSTART=tor,polipo,cups-lpd,pcscd
SERVICESSTART=dbus-broker,NetworkManager,sshd,systemd-swap,systemd-timesyncd,cups,cockpit.socket,avahi-daemon,avahi-dnsconfd,veyon,smb,nmb,winbind,bluetooth
@ -514,11 +516,14 @@ NSSWITCHWINBIND=yes
## Использовать дисковые квоты на файловые системы ext2,ext3,ext4,jfs,xfs,vfs,nfs,...
## Внимание: для квот на группу, необходимо что-бы указанная группа была основной у пользователей.
## Альтернатива для проектов, через дополнительную группу projgrp: groupadd projgrp; mkdir /home/projects; chgrp projgrp /home/projects; chmod g+s /home/projects
## DISK_QUOTA[<quota_type>:<device_ident>]=<enable/disable>
## DISK_QUOTA[<quota_type>:<device_ident>]=:0:0:0:0:<bgrace>:<igrace>
## DISK_QUOTA[<quota_type>:<device_ident>]=<user1,user2,user_n>:<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[<quota_type>:<device_ident>]=<group_1,group_2,group_n>:<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[prjquota:<path_dir>]=<project_id>,<project_name>:<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## Информация: Если квотами просиходит управление через другие программы, то достаточно только включить квоты на требуемый тип квоты.
## DISK_QUOTA[<quota_type>[:<device_ident>]]=<enable/disable>
## DISK_QUOTA[<quota_type>:<device_ident>]=0:0:0:0:<bgrace>:<igrace>
## DISK_QUOTA[<quota_type>:<device_ident>:<user1,user2,user_n>]=<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[<quota_type>:<device_ident>:<group_1,group_2,group_n>]=<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[prjquota:<path_dir>:<project_id>[,<project_name>]]=<bsoft>:<bhard>:<isoft>:<ihard>[:<bgrace>:<igrace>]
## DISK_QUOTA[prjquota:<path_dir>:<project_id>[,<project_name>]]=0:0:0:0:<bgrace>:<igrace>
## DISK_QUOTA[prjquota:<path_dir>:[<project_id>][,<project_name>]]=clean
## DISK_QUOTA[quota:<device_ident>]=clean
## DISK_QUOTA[quota]=<enable/disable>
## <quota_type> # Тип квоты, может принимать значения:
@ -534,13 +539,13 @@ NSSWITCHWINBIND=yes
## UUID # UUID файловой системы
## PARTUUID # UUID раздела
## MOUNTPOINT # Путь куда примонтировано устройство
## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234
## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234|XFS. Очистить информацию о проекте квот.
## <path_dir> # Путь до каталога
## <user_1,user_2,user_n> # Перечень пользователей разделённых ,
## <group_1,group_2,group_n> # Перечень групп разделённых ,
## <user_1,user_2,user_n> # Перечень пользователей разделённых ','
## <group_1,group_2,group_n> # Перечень групп разделённых ','
## <project_id> # Номер проекта, цифра, обязательное поле, может принимать значение
## numbers # Произвольный номер состоящий только из цифр
## AUTO # Автоматически генерирует произвольный номер
## AUTO # Автоматически генерирует произвольный номер. Если на путь ранее устанавливался номер, то использует старый номер.
## <project_name> # Имя буквенно проекта, не обязательное поле
## <bsoft> # Указывает программное ограничение размера block в файловой системе, предупреждение. Применимо: M(egabyte),G(igabyte),T(erabyte)
## <bhard> # Указывает жесткое ограничение размера block в файловой системе. Применимо: M(egabyte),G(igabyte),T(erabyte)
@ -550,13 +555,13 @@ NSSWITCHWINBIND=yes
## [<igrace>] # Льготный период секунд в течении которого разрешено превысить isoft ограничение, не более ihard. Не обязательный
## DISK_QUOTA[usrquota:/dev/sda3]=enable
## DISK_QUOTA[usrquota:/dev/sda3]=disable
## DISK_QUOTA[usrquota:/dev/sdc1]=user-1,user-2:100M:150M:100:150
## DISK_QUOTA[usrquota:/dev/sdc1]=:0:0:0:0:86400:86400
## DISK_QUOTA[usrquota:/dev/sdc1]=user-1,user-2:100M:150M:100:150:86400:86400
## DISK_QUOTA[grpquota:/dev/sdc1]=users,users@domain.com:1G:1500M:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project1]=AUTO:5G:6G:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project2]=1,MyProjectName:500M:600M:0:0:604800:604800
## DISK_QUOTA[quota]=enable
## DISK_QUOTA[usrquota:/dev/sdc1:user-1,user-2]=100M:150M:100:150
## DISK_QUOTA[usrquota:/dev/sdc1]=0:0:0:0:86400:86400
## DISK_QUOTA[usrquota:/dev/sdc1:user-1,user-2]=100M:150M:100:150:86400:86400
## DISK_QUOTA[grpquota:/dev/sdc1:users,users@domain.com]=1G:1500M:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project2:1,MyProjectName]=500M:600M:0:0:604800:604800
## DISK_QUOTA[prjquota:/mnt/data/project1:AUTO]=5G:6G:0:0:604800:604800
## Квоты на ресурсы, через cgroup2. Механизм systemd или напрямую cgroup. man 5 systemd.resource-control
## CGROUP_QUOTA[unit|user]=property_1=value,property_2=value,property_n=value

Loading…
Cancel
Save