diff --git a/ublinux/functions b/ublinux/functions index 4daa056..4777942 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -63,9 +63,12 @@ return_hash_password(){ local ARG_PASSWORD="$1" local HASH_PASSWORD=${ARG_PASSWORD} [[ -n ${ARG_PASSWORD} ]] || return 0 - if [[ ! ${ARG_PASSWORD} =~ ^('!*'|'!'|'*')*'$'(_|1|2|2a|2b|2x|2y|3|4|5|6|7|md5|sha1|gy|y|argon2d|argon2i|argon2ds|argon2id)'$' ]]; then - [[ ${ARG_PASSWORD} =~ ^'%%' ]] && ARG_PASSWORD=${ARG_PASSWORD:2} && HASH_PASSWORD=${ARG_PASSWORD} || ARG_MODE='hash' - if [[ ${ARG_MODE} == 'hash' ]]; then + if [[ ! ${ARG_PASSWORD} =~ ^('!*'|'!'|'!!'|'*')*'$'(_|1|2|2a|2b|2x|2y|3|4|5|6|7|md5|sha1|gy|y|argon2d|argon2i|argon2ds|argon2id)'$' ]]; then + [[ ${ARG_PASSWORD} =~ ^'%%'(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD} || ARG_MODE='hash' + [[ ${ARG_PASSWORD} =~ ^'!*'(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD} && BLOCK_PASSWORD="!*" + [[ ${ARG_PASSWORD} =~ ^[!]+(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD} && BLOCK_PASSWORD="!" + [[ ${ARG_PASSWORD} =~ ^[*]+(.*) ]] && ARG_PASSWORD=${BASH_REMATCH[1]} && HASH_PASSWORD=${ARG_PASSWORD} && BLOCK_PASSWORD="*" + if [[ ${ARG_PASSWORD} != @("*"|"") && ${ARG_MODE} == 'hash' ]]; then if [[ ${ARG_HASH} =~ (yescrypt|gost-yescrypt|scrypt|bcrypt|bcrypt-a|sha512crypt|sha256crypt|md5crypt|descrypt) ]]; then HASH_PASSWORD=$(echo "${ARG_PASSWORD}" | ${ROOTFS}/usr/bin/mkpasswd2 -sm ${ARG_HASH}) elif [[ ${ARG_HASH} =~ (sunmd5|bsdicrypt|nt) ]]; then @@ -79,7 +82,7 @@ return_hash_password(){ fi fi fi - echo "${HASH_PASSWORD}" + echo "${BLOCK_PASSWORD}${HASH_PASSWORD}" } # Если параметр $1 известный хеш, то вернуть true, иначе false @@ -87,7 +90,7 @@ return_hash_password(){ is_hash_password(){ local HASH_PASSWORD="$1" [[ -n ${HASH_PASSWORD} ]] || return 0 - [[ ${HASH_PASSWORD} =~ ^('!*'|'!'|'*')*'$'(_|1|2|2a|2b|2x|2y|3|4|5|6|7|md5|sha1|gy|y|argon2d|argon2i|argon2ds|argon2id)'$' ]] || return 1 + [[ ${HASH_PASSWORD} =~ ^('!*'|'!'|'!!'|'*')*'$'(_|1|2|2a|2b|2x|2y|3|4|5|6|7|md5|sha1|gy|y|argon2d|argon2i|argon2ds|argon2id)'$' ]] || return 1 } # Remove user home directories. Used ubl-settings-usergroup diff --git a/ublinux/rc.local.d/98-ubpile b/ublinux/rc.local.d/98-ubpile index 390352a..494c779 100755 --- a/ublinux/rc.local.d/98-ubpile +++ b/ublinux/rc.local.d/98-ubpile @@ -12,7 +12,9 @@ SOURCE=${SYSCONF}/server; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null debug_mode "$0" "$@" PATH_UBPILE="/opt/ubpile" -UBPILE_CONF_JSON="${PATH_UBPILE}/conf/config.json" +UBPILE_DATA="${PATH_UBPILE}/data" +UBPILE_CONF="${PATH_UBPILE}/conf" +UBPILE_CONF_JSON="${UBPILE_CONF}/config.json" UBPILE_CONF_JSON_TEMPLATE="${PATH_UBPILE}/sample_conf/config.json" PATH_HAPROXY_UBPILE_CONF="/etc/haproxy/haproxy-ubpile.cfg" @@ -76,14 +78,14 @@ exec_01_ubpile(){ ubconfig set [server] UBPILE=disable clean_db elif [[ ${UBPILE[0]} == "primary" ]]; then - chmod o-rwx ${PATH_UBPILE} #systemctl --quiet is-active ubpile.service &>/dev/null || ${PATH_UBPILE}/bin/control.sh setup + chmod go-rwx ${UBPILE_DATA} ${UBPILE_CONF} systemctl --quiet enable ubpile.service &>/dev/null systemctl --quiet restart ubpile.service &>/dev/null elif [[ ${UBPILE[0]} == "worker" ]]; then - chmod o-rwx ${PATH_UBPILE} clean_db + chmod go-rwx ${UBPILE_DATA} ${UBPILE_CONF} systemctl --quiet enable ubpile.service &>/dev/null systemctl --quiet restart ubpile.service &>/dev/null elif [[ ${UBPILE[0]} == "disable" ]]; then @@ -173,6 +175,8 @@ message_motd(){ ##### MAIN ##### ################ + [[ -d ${PATH_UBPILE} ]] || exit 0 + # Если файл подключен как ресурс с функциями, то выйти return 0 2>/dev/null && return 0 if [[ -z $@ ]]; then diff --git a/ublinux/rc.post.d/23-publicdir b/ublinux/rc.post.d/23-publicdir index 08c4bdd..69e83cc 100755 --- a/ublinux/rc.post.d/23-publicdir +++ b/ublinux/rc.post.d/23-publicdir @@ -1,24 +1,16 @@ -#!/bin/bash +#!/usr/bin/env bash ENABLED=yes -[[ ${ENABLED} == "yes" ]] || exit 0 - +[[ ${ENABLED} != "yes" ]] && exit 0 DEBUGMODE=no -. /usr/lib/ublinux/functions -. /usr/lib/ublinux/default +SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 +SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 debug_mode "$0" "$@" SOURCE=${SYSCONF}/config; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/mount; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null # Дирректория доступная всем локальным пользователям и при разрешении сетевым -#[ ! -z ${PUBLICDIR} ] && mkdir -p ${PUBLICDIR#/*} && chmod -R 2777 ${PUBLICDIR#/*} && chgrp -R 985 ${PUBLICDIR#/*} -[ ! -z ${PUBLICDIR} ] && mkdir -p ${PUBLICDIR} && chmod -R 2777 ${PUBLICDIR} && chgrp -R users ${PUBLICDIR} - -USERSHARES="/var/lib/samba/usershares" -[ ! -d ${USERSHARES} ] && mkdir -p ${USERSHARES} && chmod -R 1770 ${USERSHARES} && chown -R root:sambashare ${USERSHARES} +[[ -n ${PUBLICDIR} ]] && { [[ -d ${PUBLICDIR} ]] && chmod -R 3777 ${PUBLICDIR} && chgrp -R users ${PUBLICDIR} || install -dm3777 -o root -g users ${PUBLICDIR}; } -USERSHARESPUB="/home/usershares" -[ ! -d ${USERSHARESPUB} ] && mkdir -p ${USERSHARESPUB} && chmod -R 2770 ${USERSHARESPUB} && chown -R root:sambashare ${USERSHARESPUB} -usermod -a -G sambashare nobody \ No newline at end of file diff --git a/ublinux/rc.post.d/24-samba-usershares b/ublinux/rc.post.d/24-samba-usershares new file mode 100755 index 0000000..c46724c --- /dev/null +++ b/ublinux/rc.post.d/24-samba-usershares @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +ENABLED=yes +[[ ${ENABLED} != "yes" ]] && exit 0 +DEBUGMODE=no + +SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 +SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 +debug_mode "$0" "$@" + +SOURCE=${SYSCONF}/config; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null +SOURCE=${SYSCONF}/server; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null + +## Включить SAMBA usershares лёгкая публикация каталога пользователя в сети +## SAMBA_USERSHARE=enable|yes|disable|no +## enable|yes # Включить настройку usershares +## disable|no # Выключить настройку usershares +## +## SAMBA_USERSHARE[]= +## usershare max shares # Разрешённое максимальное кол-во сетевых каталогов. Возмжные значения от 0 до 65535. По умолчанию: 100 +## usershare allow guests # Разрешить гость вход. Возможные значения 'yes' | 'no'. По умолчанию: yes +## usershare owner only # Разрешить только владельцу. Возможные значения 'yes' | 'no'. По умолчанию: yes + +PATH_SAMBA="/etc/samba" +FILE_SAMBA_CONF="${PATH_SAMBA}/smb.conf" +FILE_USERSSHARES_CONF="${PATH_SAMBA}/usershares.conf" +USERSHARES_CONF=$(cat < "${FILE_USERSSHARES_CONF}" + [[ $(cat "${FILE_SAMBA_CONF}" 2>/dev/null) =~ "include = ${FILE_USERSSHARES_CONF}" ]] || sed "/^\s*\[global\]/a\ \ include = ${FILE_USERSSHARES_CONF}" -i ${FILE_SAMBA_CONF} + elif [[ ${SAMBA_USERSHARE} == @(disable|no) ]]; then + rm -f "${FILE_USERSSHARES_CONF}" + sed "\|include = ${FILE_USERSSHARES_CONF}|d" -i "${FILE_SAMBA_CONF}" + fi + + ## TODO + ## Изменение параметров и вставка новых в файле конфигурации ${FILE_USERSSHARES_CONF} + + + \ No newline at end of file diff --git a/ublinux/rc.preinit/10-accounts b/ublinux/rc.preinit/10-accounts index a80bb73..3c7e932 100755 --- a/ublinux/rc.preinit/10-accounts +++ b/ublinux/rc.preinit/10-accounts @@ -341,21 +341,17 @@ exec_03_useradd(){ fi [[ -f "${SYSCONF}/users" ]] && sed -E "s/(USERADD\[${SELECT_USERNAME}\]=[\'\"]?)([^:]*:[^:]*:[^:]*:[^:]*:[^:]*:)[^\'\"]*([\'\"]?)/\1\2\3/g" -i "${SYSCONF}/users" fi - if [[ ${USERADD_SYNC} =~ 'boot' || ${USERADD_SYNC[${SELECT_USERNAME}]} =~ 'boot' ]]; then - # Если указана обязательная синхронизация при каждом запуске, то пользователя удалить и создать нового - if [[ -x ${ROOTFS}/usr/bin/userdel ]]; then - ${CMD_CHROOT} /usr/bin/userdel -f "${SELECT_USERNAME}" 2>/dev/null - elif [[ -x ${ROOTFS}/usr/bin/busybox ]]; then - # busybox deluser - ${CMD_CHROOT} /usr/bin/busybox deluser ${SELECT_USERNAME} 2>/dev/null - fi - fi IFS=: read -r SELECT_GECOS SELECT_UID SELECT_GROUP SELECT_EXTRAGROUPS SELECT_OPTIONAL SELECT_PASSWORD NULL <<< "${USERADD[${SELECT_USERNAME}]}" [[ ${SELECT_GECOS,,} == "x" ]] && unset SELECT_GECOS + [[ ${SELECT_OPTIONAL,,} == "x" ]] && unset SELECT_OPTIONAL + [[ ${SELECT_OPTIONAL} =~ ("--home-dir "|"-d ")([^' ']*)(' '|$) ]] && HOME_DIR_SELECT_USERNAME="${BASH_REMATCH[2]}" || HOME_DIR_SELECT_USERNAME="${PATH_HOME}/${SELECT_USERNAME}" [[ ${SELECT_UID,,} == "x" || ${SELECT_UID} =~ ^[^0-9]+$ ]] && unset SELECT_UID + # Если существует домашний каталог пользователя, то UID берём от каталога + [[ -z ${SELECT_UID} && -d "${ROOTFS}${HOME_DIR_SELECT_USERNAME}" ]] && SELECT_UID=$(stat -c %u "${ROOTFS}${HOME_DIR_SELECT_USERNAME}") [[ ${SELECT_GROUP,,} == "x" ]] && unset SELECT_GROUP + # Если существует домашний каталог пользователя, то GID берём от каталога + [[ -z ${SELECT_GROUP} && -d "${ROOTFS}${HOME_DIR_SELECT_USERNAME}" ]] && SELECT_GROUP=$(stat -c %g "${ROOTFS}${HOME_DIR_SELECT_USERNAME}") [[ ${SELECT_EXTRAGROUPS,,} == "x" ]] && unset SELECT_EXTRAGROUPS - [[ ${SELECT_OPTIONAL,,} == "x" ]] && unset SELECT_OPTIONAL [[ ${SELECT_PASSWORD} == @(""|"x") ]] && SELECT_PASSWORD="${DEFAULTPASSWD}" [[ ${SELECT_PASSWORD} != @(""|'!*'|'!'|'*') ]] && SELECT_PASSWORD="$(return_hash_password hash ${HASHPASSWD} ${SELECT_PASSWORD})" # Если в дополнительных группа присутствует группа по имени пользователя, то удалить её из списка @@ -363,9 +359,10 @@ exec_03_useradd(){ # Создадать группы из параметра SELECT_EXTRAGROUPS local SELECT_EXTRAGROUPS_TO_EXEC_01= [[ -n ${SELECT_EXTRAGROUPS} ]] && while IFS= read -u4 ITEM_SELECT_EXTRAGROUP; do + [[ ${ITEM_SELECT_EXTRAGROUP} != "" ]] || continue if [[ -n ${GROUPADD[${ITEM_SELECT_EXTRAGROUP}]} ]]; then exec_05_groupadd "GROUPADD[${ITEM_SELECT_EXTRAGROUP}]=${GROUPADD[${ITEM_SELECT_EXTRAGROUP}]}" - elif [[ ${ITEM_SELECT_EXTRAGROUP} != "" ]]; then + else SELECT_EXTRAGROUPS_TO_EXEC_01+="${ITEM_SELECT_EXTRAGROUP}," fi done 4<<< "${SELECT_EXTRAGROUPS//,/$'\n'}" @@ -377,9 +374,11 @@ exec_03_useradd(){ #echo "===> ${SELECT_USERNAME}=${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:${SELECT_PASSWORD}" #echo "===> ${SELECT_USERNAME}=${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}" - ARG_SELECT_UID=; ARG_SELECT_GROUP=; ARG_SELECT_GECOS=; ARG_SELECT_PASSWORD=; ARG_SELECT_OPTIONAL=; STATUS= - if [[ ! $(cat ${FILE_PASSWD} 2>/dev/null) =~ ($'\n'|^)+"${SELECT_USERNAME}": ]]; then - # Проверяем наличие пользователя в системе + ARG_SELECT_UID=; ARG_SELECT_GROUP=; ARG_SELECT_GECOS=; ARG_SELECT_PASSWORD=; ARG_SELECT_OPTIONAL=; STATUS=; IS_USERNAME_PASSWD= + # Проверяем существует ли пользователь в системе + [[ $(cat ${FILE_PASSWD} 2>/dev/null) =~ ($'\n'|^)+"${SELECT_USERNAME}": ]] && IS_USERNAME_PASSWD=yes + if [[ ${IS_USERNAME_PASSWD} == "" || ${USERADD_SYNC} =~ 'boot' || ${USERADD_SYNC[${SELECT_USERNAME}]} =~ 'boot' ]]; then + # Проверяем отсутствие пользователя в системе или параметр принудительного обновления [[ -n ${SELECT_UID} && ${SELECT_UID} != 0 ]] && ARG_SELECT_UID="--uid ${SELECT_UID}" || unset ARG_SELECT_UID # Если указана основная группа, но она не создана, то создать unset ARG_GROUPADD_GID ARG_GROUPADD_GROUPNAME @@ -390,12 +389,10 @@ exec_03_useradd(){ # Если группа указана и не найдена в файле shadow # Группа имет цифровой GID и номер GID=UID if [[ ${SELECT_GROUP} =~ ^[[:digit:]]+$ && ${SELECT_GROUP} == ${SELECT_UID} ]]; then - #ARG_GROUPADD_GID=" --gid ${SELECT_GROUP}" ARG_GROUPADD_GID="${SELECT_GROUP}" ARG_GROUPADD_GROUPNAME=${SELECT_USERNAME} elif [[ ${SELECT_GROUP} =~ ^[[:digit:]]+$ && ${SELECT_GROUP} != ${SELECT_UID} ]]; then # Группа имет цифровой GID и номер GID!=UID - #ARG_GROUPADD_GID=" --gid ${SELECT_GROUP}" ARG_GROUPADD_GID="${SELECT_GROUP}" ARG_GROUPADD_GROUPNAME=${SELECT_USERNAME} elif [[ ${SELECT_GROUP} =~ [[:alpha:]]+ ]]; then @@ -407,42 +404,54 @@ exec_03_useradd(){ fi [[ -n ${ARG_GROUPADD_GROUPNAME} ]] && exec_05_groupadd "GROUPADD[${ARG_GROUPADD_GROUPNAME}]=x:${ARG_GROUPADD_GID}" fi + if [[ ${IS_USERNAME_PASSWD} == "" ]]; then # Создаём пользователя - if [[ -x ${ROOTFS}/usr/bin/useradd ]]; then - [[ -n ${SELECT_GECOS} ]] && ARG_SELECT_GECOS="--comment '${SELECT_GECOS}'" || unset ARG_SELECT_GECOS - [[ -n ${SELECT_GROUP} ]] && ARG_SELECT_GROUP="--gid ${SELECT_GROUP}" || unset ARG_SELECT_GROUP - [[ -n ${SELECT_PASSWORD} ]] && ARG_SELECT_PASSWORD="--password '${SELECT_PASSWORD}'" || unset ARG_SELECT_PASSWORD - ARG_SELECT_OPTIONAL="${SELECT_OPTIONAL}" - [[ ${SELECT_OPTIONAL} =~ ("-o"|"--non-unique") ]] && [[ -n ${ARG_SELECT_UID} ]] || { ARG_SELECT_OPTIONAL=${ARG_SELECT_OPTIONAL//-o/}; ARG_SELECT_OPTIONAL=${ARG_SELECT_OPTIONAL//--non-unique/}; } - [[ ${SELECT_OPTIONAL} =~ ("-M"|"--no-create-home") ]] || { [[ -d "${ROOTFS}${PATH_HOME}/${SELECT_USERNAME}" ]] || ARG_SELECT_OPTIONAL+=" --create-home"; } - [[ ${SELECT_OPTIONAL} =~ ("-N"|"--no-user-group") ]] || { [[ -z ${SELECT_GROUP} ]] && ARG_SELECT_OPTIONAL+=" --user-group"; } - - eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$? #>/dev/null 2>&1 - - [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 1 to use 'useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${SELECT_USERNAME}' failed, try attempt 2"; \ - eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } - - [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 2 to use 'useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${SELECT_USERNAME}' failed, try attempt 3"; \ - eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } - - [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 3 to use 'useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${SELECT_USERNAME}' failed, try attempt 4"; \ - eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } - - [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 4 to use 'useradd ${ARG_SELECT_UID} ${SELECT_USERNAME}' failed, try attempt 5"; \ - eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } - - [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 5 to use 'useradd ${SELECT_USERNAME}' failed, try attempt 6"; \ - eval ${CMD_CHROOT} /usr/bin/useradd ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } - - [[ ${STATUS} -eq 0 ]] || { echo "ERROR: Attempt 6 to use 'useradd ${SELECT_USERNAME}' failed, exit"; return 1; } - elif [[ -x ${ROOTFS}/usr/bin/busybox ]]; then - # busybox adduser - [[ -n ${SELECT_GECOS} ]] && ARG_SELECT_GECOS="-g '${SELECT_GECOS}'" || unset ARG_SELECT_GECOS - [[ -n ${SELECT_GROUP} ]] && ARG_SELECT_GROUP="-G ${SELECT_GROUP}" || ARG_SELECT_GROUP="-G ${SELECT_USERNAME}" - [[ ${SELECT_OPTIONAL} =~ ("-M"|"--no-create-home") ]] && ARG_SELECT_OPTIONAL+=" -H" - eval ${CMD_CHROOT} /usr/bin/busybox adduser -D ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${SELECT_USERNAME} #>/dev/null 2>&1 - # Задаём пароль пользователю - set_passwd "${SELECT_USERNAME}" "${SELECT_PASSWORD}" + if [[ -x ${ROOTFS}/usr/bin/useradd ]]; then + [[ -n ${SELECT_GECOS} ]] && ARG_SELECT_GECOS="--comment '${SELECT_GECOS}'" || unset ARG_SELECT_GECOS + [[ -n ${SELECT_GROUP} ]] && ARG_SELECT_GROUP="--gid ${SELECT_GROUP}" || unset ARG_SELECT_GROUP + [[ -n ${SELECT_PASSWORD} ]] && ARG_SELECT_PASSWORD="--password '${SELECT_PASSWORD}'" || unset ARG_SELECT_PASSWORD + ARG_SELECT_OPTIONAL="${SELECT_OPTIONAL}" + [[ ${SELECT_OPTIONAL} =~ ("-o"|"--non-unique") ]] && [[ -n ${ARG_SELECT_UID} ]] || { ARG_SELECT_OPTIONAL=${ARG_SELECT_OPTIONAL//-o/}; ARG_SELECT_OPTIONAL=${ARG_SELECT_OPTIONAL//--non-unique/}; } + [[ ${SELECT_OPTIONAL} =~ ("-M"|"--no-create-home") ]] || { [[ -d "${ROOTFS}${HOME_DIR_SELECT_USERNAME}" ]] || ARG_SELECT_OPTIONAL+=" --create-home"; } + [[ ${SELECT_OPTIONAL} =~ ("-N"|"--no-user-group") ]] || { [[ -z ${SELECT_GROUP} ]] && ARG_SELECT_OPTIONAL+=" --user-group"; } + eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$? + [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 1 to use 'useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${SELECT_USERNAME}' failed, try attempt 2"; \ + eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } + [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 2 to use 'useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${SELECT_USERNAME}' failed, try attempt 3"; \ + eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } + [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 3 to use 'useradd ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${SELECT_USERNAME}' failed, try attempt 4"; \ + eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_UID} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } + [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 4 to use 'useradd ${ARG_SELECT_UID} ${SELECT_USERNAME}' failed, try attempt 5"; \ + eval ${CMD_CHROOT} /usr/bin/useradd ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } + [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 5 to use 'useradd ${SELECT_USERNAME}' failed, try attempt 6"; \ + eval ${CMD_CHROOT} /usr/bin/useradd ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } + [[ ${STATUS} -eq 0 ]] || { echo "ERROR: Attempt 6 to use 'useradd ${SELECT_USERNAME}' failed, exit"; return 1; } + elif [[ -x ${ROOTFS}/usr/bin/busybox ]]; then + # busybox adduser + [[ -n ${SELECT_GECOS} ]] && ARG_SELECT_GECOS="-g '${SELECT_GECOS}'" || unset ARG_SELECT_GECOS + [[ -n ${SELECT_GROUP} ]] && ARG_SELECT_GROUP="-G ${SELECT_GROUP}" || ARG_SELECT_GROUP="-G ${SELECT_USERNAME}" + [[ ${SELECT_OPTIONAL} =~ ("-M"|"--no-create-home") ]] && ARG_SELECT_OPTIONAL+=" -H" + eval ${CMD_CHROOT} /usr/bin/busybox adduser -D ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${SELECT_USERNAME} #>/dev/null 2>&1 + # Задаём пароль пользователю + set_passwd "${SELECT_USERNAME}" "${SELECT_PASSWORD}" + fi + else + # Изменяем пользователя + if [[ -x ${ROOTFS}/usr/bin/usermod ]]; then + [[ -n ${SELECT_GECOS} ]] && ARG_SELECT_GECOS="--comment '${SELECT_GECOS}'" || unset ARG_SELECT_GECOS + [[ -n ${SELECT_GROUP} ]] && ARG_SELECT_GROUP="--gid ${SELECT_GROUP}" || unset ARG_SELECT_GROUP + [[ -n ${SELECT_PASSWORD} ]] && ARG_SELECT_PASSWORD="--password '${SELECT_PASSWORD}'" || unset ARG_SELECT_PASSWORD + ARG_SELECT_OPTIONAL= + [[ ${SELECT_OPTIONAL} =~ ("-o"|"--non-unique") ]] && [[ -n ${ARG_SELECT_UID} ]] && ARG_SELECT_OPTIONAL+=" --non-unique" + [[ ${SELECT_OPTIONAL} =~ ("--shell "|"-s ")([^' ']*)(' '|$) ]] && ARG_SELECT_OPTIONAL+=" --shell ${BASH_REMATCH[2]}" + [[ ${SELECT_OPTIONAL} =~ ("--home-dir "|"-d ")([^' ']*)(' '|$) ]] && ARG_SELECT_OPTIONAL+=" --home ${BASH_REMATCH[2]} --move-home" + eval ${CMD_CHROOT} /usr/bin/usermod ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$? + [[ ${STATUS} -eq 0 ]] || { echo "WARNING: Attempt 1 to use 'usermod ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_OPTIONAL} ${SELECT_USERNAME}' failed, try attempt 2"; \ + eval ${CMD_CHROOT} /usr/bin/usermod ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME} &>/dev/null; STATUS=$?; } + [[ ${STATUS} -eq 0 ]] || { echo "ERROR: Attempt 2 to use 'usermod ${ARG_SELECT_UID} ${ARG_SELECT_GROUP} ${ARG_SELECT_GECOS} ${ARG_SELECT_PASSWORD} ${SELECT_USERNAME}' failed, exit"; return 1; } + elif [[ -x ${ROOTFS}/usr/bin/busybox ]]; then + true + fi fi if [[ -x ${ROOTFS}/usr/bin/usermod ]]; then # Добавляем пользователя в основную группу @@ -455,11 +464,19 @@ exec_03_useradd(){ # Задаём параметры пароля пользователю /etc/shadow из USERSHADOW[user]. Только если запущено отдельно с параметром. [[ -n ${PARAM} && -n ${USERSHADOW[${SELECT_USERNAME}]} ]] && exec_04_usershadow "USERSHADOW[${SELECT_USERNAME}]=${USERSHADOW[${SELECT_USERNAME}]}" # Проверим права на домашний каталог пользователя совпадают с указанным польователем, если нет, то переназначим - if [[ -d ${ROOTFS}${PATH_HOME}/${SELECT_USERNAME} && $(${CMD_CHROOT} /usr/bin/stat -c "%U:%G" ${PATH_HOME}/${SELECT_USERNAME}) != "${SELECT_USERNAME}:${SELECT_GROUP:-${SELECT_USERNAME}}" ]]; then - [[ -n ${ROOTFS} ]] && ARG_RECURSIVE="-R" || unset ARG_RECURSIVE - ${CMD_CHROOT} /usr/bin/chown -f ${ARG_RECURSIVE} "${SELECT_USERNAME}" ${PATH_HOME}/"${SELECT_USERNAME}" - ${CMD_CHROOT} /usr/bin/chown -f ${ARG_RECURSIVE} :"${SELECT_GROUP:-${SELECT_USERNAME}}" ${PATH_HOME}/"${SELECT_USERNAME}" + GET_UID_GID_HOME=$(${CMD_CHROOT} /usr/bin/stat -c "%U:%G" ${HOME_DIR_SELECT_USERNAME}) + GET_UID_GID_SELECT="$(${CMD_CHROOT} /usr/bin/id -u ${SELECT_USERNAME}):$(${CMD_CHROOT} /usr/bin/id -g ${SELECT_GROUP:-${SELECT_USERNAME}})" + if [[ -d ${ROOTFS}${HOME_DIR_SELECT_USERNAME} && ${GET_UID_GID_HOME} != ${GET_UID_GID_SELECT} ]]; then + eval ${CMD_CHROOT} /usr/bin/chown -f -h "${SELECT_USERNAME}:" \ + $(${CMD_CHROOT} find ${HOME_DIR_SELECT_USERNAME} -maxdepth 1 -printf '"%p"\n') \ + $(cat ${ROOTFS}/etc/xdg/user-dirs.defaults 2>/dev/null | grep -v "^\s*#" | sed -E "s|.*=(.*)|${HOME_DIR_SELECT_USERNAME}/\1|") \ + $(cat ${ROOTFS}${HOME_DIR_SELECT_USERNAME}/.config/user-dirs.dirs 2>/dev/null | grep -v "^\s*#"| sed -E "s|.*HOME/(.*)|${HOME_DIR_SELECT_USERNAME}/\"\1|") + ARG_RECURSIVE="-hRP" + eval ${CMD_CHROOT} /usr/bin/chown -f ${ARG_RECURSIVE} "${SELECT_USERNAME}:" \ + $(${CMD_CHROOT} find ${HOME_DIR_SELECT_USERNAME} -maxdepth 1 -name ".*" -printf '"%p"\n') fi + else + echo "INFO: The user '${SELECT_USERNAME}' exists in the system, the settings are not applied. To force the settings, enable the '[users] USERADD_SYNC[${SELECT_USERNAME}]=boot' option" fi # Создаём домашний каталог принудительно и копируем /etc/skel if [[ ${UPDATEHOME,,} == @(yes|y|enable) \ @@ -547,12 +564,20 @@ exec_04_usershadow(){ [[ ${SELECT_MINDAY} =~ ^[0-9]*$ ]] || unset SELECT_MINDAY [[ ${SELECT_MAXDAY} =~ ^[0-9]*$ ]] || unset SELECT_MAXDAY [[ ${SELECT_WARN} =~ ^[0-9]*$ ]] || unset SELECT_WARN - [[ ${SELECT_INACTIVE} =~ ^[0-9]*$ ]] || unset SELECT_INACTIVE + [[ ${SELECT_INACTIVE} =~ (-1|^[0-9]*$) ]] || unset SELECT_INACTIVE #[[ ${SELECT_EXPIRE} =~ ^[0-9]{4,4}'-'[0-9]{1,2}'-'[0-9]{1,2}$ ]] && SELECT_EXPIRE_EPOH=$(date --date=${SELECT_EXPIRE} +"%s") #[[ -z ${SELECT_EXPIRE_EPOH} && -x /bin/busybox && ${SELECT_EXPIRE} =~ ^[0-9]{4,4}'.'[0-9]{1,2}'.'[0-9]{1,2}$ ]] && SELECT_EXPIRE_EPOH=$(busybox date --date="${SELECT_EXPIRE//./}0000" +"%s") #[[ -z ${SELECT_EXPIRE_EPOH} && -x ${ROOTFS}/usr/bin/date && ${SELECT_EXPIRE} =~ ^[0-9]{4,4}'.'[0-9]{1,2}'.'[0-9]{1,2}$ ]] && SELECT_EXPIRE_EPOH=$(${ROOTFS}/usr/bin/date --date="${SELECT_EXPIRE//./} 0000" +"%s") #[[ -n ${SELECT_EXPIRE_EPOH} ]] && SELECT_EXPIRE=$(( ${SELECT_EXPIRE_EPOH}/(60*60*24) )) - [[ ${SELECT_EXPIRE} =~ (^[0-9]*$|^[0-9]{4,4}'-'[0-9]{1,2}'-'[0-9]{1,2}$) ]] || unset SELECT_EXPIRE + [[ ${SELECT_EXPIRE} =~ (-1|^[0-9]*$|^[0-9]{4,4}'-'[0-9]{1,2}'-'[0-9]{1,2}$) ]] || unset SELECT_EXPIRE + if [[ -z ${SELECT_LASTCHANGED} && -z ${SELECT_MINDAY} && -z ${SELECT_MAXDAY} && -z ${SELECT_WARN} && -z ${SELECT_INACTIVE} && -z ${SELECT_EXPIRE} ]]; then + unset SELECT_LASTCHANGED + SELECT_MINDAY="0" + SELECT_MAXDAY="99999" + SELECT_WARN="7" + SELECT_INACTIVE="-1" + SELECT_EXPIRE="-1" + fi [[ -n ${SELECT_LASTCHANGED} ]] && ARG_SELECT_LASTCHANGED="--lastday ${SELECT_LASTCHANGED}" || unset ARG_SELECT_LASTCHANGED [[ -n ${SELECT_MINDAY} ]] && ARG_SELECT_MINDAY="--mindays ${SELECT_MINDAY}" || unset ARG_SELECT_MINDAY [[ -n ${SELECT_MAXDAY} ]] && ARG_SELECT_MAXDAY="--maxdays ${SELECT_MAXDAY}" || unset ARG_SELECT_MAXDAY diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index 862f9d5..e20d42c 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -189,14 +189,16 @@ SERVICES_ENABLE=dbus-broker,NetworkManager,sshd,systemd-swap,cups,cockpit.socket ## Добавить пользователя системы в /etc/passwd. Если пользователь существует, то без изменений ## USERADD=no|none|disable # Отключить управление пользователями конфигурации -## USERADD[user_name]='gecos:uid:user_group:extra_groups:optional:password|x' -## user_name # Имя пользователя, обязательное поле -## gecos # Поле GECOS, с подробным описанием пользователя, можно локализованное, не обязательное -## uid # UID пользователя, если необходимо автоматически рассчитывать, то оставить пустым или 'x' -## user_group # Основная группа пользователя, номер или имя, если выбрано пусто или 'x', то 'user_group=user_name' -## extra_groups # Дополнительные группы пользователя. Дополнительные к USERGROUPS +## USERADD[]=':::::' +## # Имя пользователя, обязательное поле +## # Поле GECOS, с подробным описанием пользователя, можно локализованное, не обязательное +## # UID пользователя, если необходимо автоматически рассчитывать, то оставить пустым или 'x' +## # Если не указан и существует каталог /home/ , то будет взят у этого каталога +## # Основная группа пользователя, номер или имя, если выбрано пусто или 'x', то 'user_group=user_name' +## # Если не указан и существует каталог /home/ , то будет взят у этого каталога +## # Дополнительные группы пользователя. Дополнительные к USERGROUPS ## # Если группа отсутствует или 'x', то 'extra_groups=users'. Если группа не существует, то будет создана. Перечисление через запятую. -## optional # Дополнительные параметры, например: '--shell /usr/bin/bash --create-home --no-create-home --no-user-group --non-unique' +## # Дополнительные параметры, например: '--shell /usr/bin/bash --create-home --no-create-home --no-user-group --non-unique' ## --home-dir <ДОМ_КАТ> # Домашний каталог новой учётной записи ## -s, --shell /usr/bin/bash # Регистрационная оболочка новой учётной записи ## -r, --system # Создать системную группу @@ -204,25 +206,28 @@ SERVICES_ENABLE=dbus-broker,NetworkManager,sshd,systemd-swap,cups,cockpit.socket ## -N, --no-user-group # Не создавать группу с тем же именем что и у пользователя ## -o, --non-unique # Разрешить создание пользователей с повторяющимися (не уникальными) UID, использовать только совместно с параметром ## --badnames # Не проверять имя на несоответствие правилам использования символов -## password|x # Хеш пароля пользователя, если пусто или 'x', то 'password=${DEFAULTPASSWD}', -## # Если первые символы (%%), то пароль хранится в нешифрованном виде -## # Если первые символы (!*), то аутентификация запрещена -## # Если первый символ (*) или (!), то аутентификация по паролю заблокирована. Но другие методы входа, -## # такие как аутентификация на основе ключей или переключение на пользователя, по-прежнему разрешены +## # Хеш пароля пользователя, если пусто или 'x', то 'password=${DEFAULTPASSWD}', +## # Если пароль состоит из символов '!*' или '!' или '*' , то аутентификация запрещена +## # Если первый символ '!' , то аутентификация по паролю заблокирована. Но другие методы входа, +## # но другие методы входа, такие как аутентификация на основе ключей или переключение на пользователя, по-прежнему разрешены. +## # Если для команды ubconfig хеш пароля содержит первые символы '%%', то пароль хранится в нешифрованном виде. +## # Первые символы '%%' работают как команда для ubconfig, что-бы не шифровать пароль, и не сохраняются в конфигурацию. ## USERADD[superadmin]='Администратор:1000:x:x:x:$6$E7stRhRS8fCKk7UU$Qoqw62AUaUa5uLIc2KC7WV3MUThhrR8kjXtCODmnKCzKe2zHu1/wmsiWBHZEIk/IQnk/aELQYbUK93OUtrwg60' ## USERADD[user-1]=x ## USERADD[user-1]='Пользователь-1:x:x:vboxusers,libvirt:-s /usr/bin/bash -o:$6$E7stRhRS8fCKk7UU$Qoqw62AUaUa5uLIc2KC7WV3MUThhrR8kjXtCODmnKCzKe2zHu1/wmsiWBHZEIk/IQnk/aELQYbUK93OUtrwg60' ## Параметры пользователя системы /etc/shadow. Если пользователь существует, то без изменений -## USERSHADOW[user_name]='lastchanged:minday:maxday:warn:inactive:expire' -## user_name # Имя пользователя, обязательное поле -## lastchanged # Дата последнего изменения пароля. Указывается количество дней, исчисляется с 1 января 1970 года (дата эпохи). Возможно указать дату формата: YYYY-MM-DD +## USERSHADOW[]=':::::' +## # Имя пользователя, обязательное поле +## # Дата последнего изменения пароля. Указывается количество дней, исчисляется с 1 января 1970 года (дата эпохи). Возможно указать дату формата: YYYY-MM-DD ## # Если указать 0, то при логине будет затребована принудительная смена пароля. -## minday # Минимальное количество дней действия пароля, прежде чем пароль пользователя может быть изменен. По умолчанию 0 означает отсутствие минимального срока действия пароля -## maxday # Максимальное количество дней действия пароля после смены пароля пользователя. По умолчанию этот номер установлен на 99999 -## warn # Количество дней предупреждения, в течение которого пользователь получает предупреждение о необходимости изменения пароля. По умолчанию 7 -## inactive # Количество дней не активности пароля до отключения учетной записи пользователя. По умолчанию пустое -## expire # Дата, когда учетная запись была отключена. Указывается количество дней, исчисляется с 1 января 1970 года (дата эпохи). Возможно указать дату формата: YYYY-MM-DD +## # Минимальное количество дней действия пароля, прежде чем пароль пользователя может быть изменен. По умолчанию 0 означает отсутствие минимального срока действия пароля +## # Максимальное количество дней действия пароля после смены пароля пользователя. По умолчанию этот номер установлен на 99999 +## # Количество дней предупреждения, в течение которого пользователь получает предупреждение о необходимости изменения пароля. По умолчанию 7 +## # Количество дней не активности пароля до отключения учетной записи пользователя. По умолчанию пустое +## # Если указать -1, то очистить дни не активности пароля +## # Дата устаревания учётной записи. Дата когда учетная запись будет отключена. Указывается количество дней, исчисляется с 1 января 1970 года (дата эпохи). +## # Возможно указать дату формата: YYYY-MM-DD. Если указать -1, то убрать дату устаревания. ## # Если один из параметров не задан, содержит пустое значение, то исходное значение не изменяется ## # Конвертировать кол-во дней от эпохи в понятную дату: date --date=@$(( DDDDD*(60*60*24) )); date --date=@EPOCH ## USERSHADOW[superadmin]=2024-01-01:0:99999:7:: @@ -616,13 +621,24 @@ GRUB_BOOT_SILENT="splash" #SERVER_DOMAIN[type]=samba #SERVER_DOMAIN[admin]=administrator:0J3QvtCy0YvQuV/QlNC10L3RjCEK +## Включить SAMBA usershares лёгкая публикация каталога пользователя в сети +## SAMBA_USERSHARE=enable|yes|disable|no +## enable|yes # Включить настройку usershares +## disable|no # Выключить настройку usershares +## +## SAMBA_USERSHARE[]= +## usershare max shares # Разрешённое максимальное кол-во сетевых каталогов. Возмжные значения от 0 до 65535. По умолчанию: 100 +## usershare allow guests # Разрешить гость вход. Возможные значения 'yes' | 'no'. По умолчанию: yes +## usershare owner only # Разрешить только владельцу. Возможные значения 'yes' | 'no'. По умолчанию: yes + ## Использовать приложение UBPile ## UBPILE=primary|worker|disable|clean ## primary # Выступать в роли главного сервера управляющего всеми 'Worker' ## worker # Исполнитель заданий приходящих от сервера 'Primary' ## disable # Отключить ## clean # Очистить БД и вернуть настройки по умолчанию. После процедуры очистки установится UBPILE=disable -## UBPILE[secret_key|base_app_url|...]= +## +## UBPILE[secretkey|base_app_url|...]= ## secretkey # При настройке нескольких серверов все ваши серверы должны иметь один и тот же секретный ключ. Любая случайно сгенерированная строка подойдет ## base_app_url # Полный URL-адрес, включая http порт, если он нестандартный. Это используется в электронных письмах для создания URL-адресов с самостоятельными ссылками ## email_from # Адрес электронной почты, который будет использоваться в качестве адреса "От" при отправке уведомлений @@ -657,6 +673,7 @@ GRUB_BOOT_SILENT="splash" ## Адрес сети по умолчанию #NETWORKIP=192.168.1. + [/etc/ublinux/save] ## Настройка сохранений ################################################################################