diff --git a/VERSION.md b/VERSION.md index b93d025..a55f171 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -VERSION 2.12 +VERSION 2.13 diff --git a/ublinux/rc.halt.pre/20-grub b/ublinux/rc.halt.pre/20-grub index 06aa035..0f69b9e 100755 --- a/ublinux/rc.halt.pre/20-grub +++ b/ublinux/rc.halt.pre/20-grub @@ -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} diff --git a/ublinux/rc.post.d/45-disk-quota b/ublinux/rc.post.d/45-disk-quota index 682f67e..d6b647d 100755 --- a/ublinux/rc.post.d/45-disk-quota +++ b/ublinux/rc.post.d/45-disk-quota @@ -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 $@ + \ No newline at end of file diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index c76bf50..03957f9 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -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[:]= -## DISK_QUOTA[:]=:0:0:0:0:: -## DISK_QUOTA[:]=::::[::] -## DISK_QUOTA[:]=::::[::] -## DISK_QUOTA[prjquota:]=,::::[::] +## Информация: Если квотами просиходит управление через другие программы, то достаточно только включить квоты на требуемый тип квоты. +## DISK_QUOTA[[:]]= +## DISK_QUOTA[:]=0:0:0:0:: +## DISK_QUOTA[::]=:::[::] +## DISK_QUOTA[::]=:::[::] +## DISK_QUOTA[prjquota::[,]]=:::[::] +## DISK_QUOTA[prjquota::[,]]=0:0:0:0:: +## DISK_QUOTA[prjquota::[][,]]=clean ## DISK_QUOTA[quota:]=clean ## DISK_QUOTA[quota]= ## # Тип квоты, может принимать значения: @@ -534,13 +539,13 @@ NSSWITCHWINBIND=yes ## UUID # UUID файловой системы ## PARTUUID # UUID раздела ## MOUNTPOINT # Путь куда примонтировано устройство -## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234 +## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234|XFS. Очистить информацию о проекте квот. ## # Путь до каталога -## # Перечень пользователей разделённых , -## # Перечень групп разделённых , +## # Перечень пользователей разделённых ',' +## # Перечень групп разделённых ',' ## # Номер проекта, цифра, обязательное поле, может принимать значение ## numbers # Произвольный номер состоящий только из цифр -## AUTO # Автоматически генерирует произвольный номер +## AUTO # Автоматически генерирует произвольный номер. Если на путь ранее устанавливался номер, то использует старый номер. ## # Имя буквенно проекта, не обязательное поле ## # Указывает программное ограничение размера block в файловой системе, предупреждение. Применимо: M(egabyte),G(igabyte),T(erabyte) ## # Указывает жесткое ограничение размера block в файловой системе. Применимо: M(egabyte),G(igabyte),T(erabyte) @@ -550,13 +555,13 @@ NSSWITCHWINBIND=yes ## [] # Льготный период секунд в течении которого разрешено превысить 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 diff --git a/ublinux/templates/ublinux-data_ru.ini b/ublinux/templates/ublinux-data_ru.ini index c76bf50..c12128d 100644 --- a/ublinux/templates/ublinux-data_ru.ini +++ b/ublinux/templates/ublinux-data_ru.ini @@ -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[:]= -## DISK_QUOTA[:]=:0:0:0:0:: -## DISK_QUOTA[:]=::::[::] -## DISK_QUOTA[:]=::::[::] -## DISK_QUOTA[prjquota:]=,::::[::] +## Информация: Если квотами просиходит управление через другие программы, то достаточно только включить квоты на требуемый тип квоты. +## DISK_QUOTA[[:]]= +## DISK_QUOTA[:]=0:0:0:0:: +## DISK_QUOTA[::]=:::[::] +## DISK_QUOTA[::]=:::[::] +## DISK_QUOTA[prjquota::[,]]=:::[::] +## DISK_QUOTA[prjquota::[,]]=0:0:0:0:: +## DISK_QUOTA[prjquota::[][,]]=clean ## DISK_QUOTA[quota:]=clean ## DISK_QUOTA[quota]= ## # Тип квоты, может принимать значения: @@ -534,13 +539,13 @@ NSSWITCHWINBIND=yes ## UUID # UUID файловой системы ## PARTUUID # UUID раздела ## MOUNTPOINT # Путь куда примонтировано устройство -## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234 +## clean # Очистить базу данных квот, отключить поддержку ^quota ^project у EXT234|XFS. Очистить информацию о проекте квот. ## # Путь до каталога -## # Перечень пользователей разделённых , -## # Перечень групп разделённых , +## # Перечень пользователей разделённых ',' +## # Перечень групп разделённых ',' ## # Номер проекта, цифра, обязательное поле, может принимать значение ## numbers # Произвольный номер состоящий только из цифр -## AUTO # Автоматически генерирует произвольный номер +## AUTO # Автоматически генерирует произвольный номер. Если на путь ранее устанавливался номер, то использует старый номер. ## # Имя буквенно проекта, не обязательное поле ## # Указывает программное ограничение размера block в файловой системе, предупреждение. Применимо: M(egabyte),G(igabyte),T(erabyte) ## # Указывает жесткое ограничение размера block в файловой системе. Применимо: M(egabyte),G(igabyte),T(erabyte) @@ -550,13 +555,13 @@ NSSWITCHWINBIND=yes ## [] # Льготный период секунд в течении которого разрешено превысить 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