|
|
#!/usr/bin/env bash
|
|
|
|
|
|
[[ -d /usr/lib/ublinux ]] && { unset ROOTFS; unset CMD_CHROOT; } || { ROOTFS="/sysroot"; CMD_CHROOT="chroot ${ROOTFS}"; }
|
|
|
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
|
|
|
SYSCONF="${ROOTFS}/${SYSCONF}"
|
|
|
|
|
|
export TEXTDOMAINDIR=/usr/share/locale
|
|
|
export TEXTDOMAIN=ublinux_functions
|
|
|
|
|
|
# https://en.wikipedia.org/wiki/Crypt_(C)
|
|
|
# https://man.archlinux.org/man/core/libxcrypt/crypt.5.en # /etc/shadow file format
|
|
|
# user:$6$.n.:17736:0:99999:7:::
|
|
|
# [--] [----] [---] - [---] ----
|
|
|
# | | | | | |||+-----------> 9. Неиспользованный
|
|
|
# | | | | | ||+------------> 8. Срок годности
|
|
|
# | | | | | |+-------------> 7. Период бездействия
|
|
|
# | | | | | +--------------> 6. Период предупреждения
|
|
|
# | | | | +------------------> 5. Максимальный возраст пароля
|
|
|
# | | | +----------------------> 4. Минимальный возраст пароля
|
|
|
# | | +--------------------------> 3. Последнее изменение пароля
|
|
|
# | +---------------------------------> 2. Зашифрованный пароль
|
|
|
# +----------------------------------------> 1. Имя пользователя
|
|
|
# Если поле пароля содержит первый символ звездочку (*), то пользователь не сможет войти по паролю, но сможет другим способом (например по ключу через ssh)
|
|
|
# Если поле пароля содержит первый символ восклицательный знак (!), то пользователь вообще не сможет войти, даже по ключу
|
|
|
# Алгоритмы хеширования пароля:
|
|
|
# (empty) # DES
|
|
|
# $_$ # BSDi
|
|
|
# $1$ # MD5
|
|
|
# $2$ # bcrypt based on Blowfish
|
|
|
# $2a$ # Blowfish
|
|
|
# $2b$ # OpenBSD blowfish
|
|
|
# $2x$ # blowfish
|
|
|
# $2y$ # Eksblowfish
|
|
|
# $3$ # NTHASH
|
|
|
# $5$ # SHA-256
|
|
|
# $6$ # SHA-512
|
|
|
# $7$ # scrypt
|
|
|
# $md5$ # Solaris MD5
|
|
|
# $sha1$ # PBKDF1 with SHA1
|
|
|
# $gy$ # gost-yescrypt
|
|
|
# $y$ # yescrypt
|
|
|
# $argon2d$ # Argon2d
|
|
|
# $argon2i$ # Argon2i
|
|
|
# $argon2ds$ # Argon2ds
|
|
|
# $argon2id$ # Argon2id
|
|
|
# Получить хеш пароля, тип хеша
|
|
|
# $1 # Режим получения хеша, значения: hash, phash
|
|
|
# hash # Вернуть хеш, если первые символы %%, то удалить их и вернуть хеш
|
|
|
# phash # Если первые символы %%, то убрать %% и вернуть не шифрованный пароль, в остальных случаях вернуть хеш
|
|
|
# $2 # Тип хеша, поддерживаются yescrypt|gost-yescrypt|scrypt|bcrypt|bcrypt-a|sha512crypt|sha256crypt|sunmd5|md5crypt|bsdicrypt|descrypt|nt
|
|
|
# # В разработке argon2d|argon2i|argon2ds|argon2id
|
|
|
# $3 # Пароль пользователя шифрованный или не шифрованный. Если шифрованный, то вернётся как есть
|
|
|
# Применяется в ubconfig
|
|
|
return_hash_password(){
|
|
|
SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
DEFAULT_HASHPASSWD="yescrypt"
|
|
|
[[ $1 == @(hash|phash) ]] && local ARG_MODE=$1 && shift
|
|
|
[[ -n ${ARG_MODE} ]] || ARG_MODE='hash'
|
|
|
[[ $1 == @(yescrypt|gost-yescrypt|scrypt|bcrypt|bcrypt-a|sha512crypt|sha256crypt|sunmd5|md5crypt|bsdicrypt|descrypt|nt|argon2d|argon2i|argon2ds|argon2id) ]] && local ARG_HASH=$1 && shift
|
|
|
[[ -n ${ARG_HASH} ]] || ARG_HASH=${HASHPASSWD}
|
|
|
[[ -n ${ARG_HASH} ]] || ARG_HASH=$(${ROOTFS}/usr/bin/ubconfig --raw --default get users HASHPASSWD)
|
|
|
[[ -n ${ARG_HASH} && ${ARG_HASH} != "(null)" ]] || ARG_HASH="${DEFAULT_HASHPASSWD}"
|
|
|
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=${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
|
|
|
# Алгоритм отключен, использует алгоритм по умолчанию ${DEFAULT_HASHPASSWD}
|
|
|
HASH_PASSWORD=$(echo "${ARG_PASSWORD}" | ${ROOTFS}/usr/bin/mkpasswd2 -sm ${DEFAULT_HASHPASSWD})
|
|
|
elif [[ ${ARG_HASH} =~ (argon2d|argon2i|argon2ds|argon2id) ]]; then
|
|
|
# Алгоритм отключен, использует алгоритм по умолчанию ${DEFAULT_HASHPASSWD}
|
|
|
HASH_PASSWORD=$(echo "${ARG_PASSWORD}" | ${ROOTFS}/usr/bin/mkpasswd2 -sm ${DEFAULT_HASHPASSWD})
|
|
|
else
|
|
|
HASH_PASSWORD=$(echo "${ARG_PASSWORD}" | ${ROOTFS}/usr/bin/mkpasswd2 -sm ${DEFAULT_HASHPASSWD})
|
|
|
fi
|
|
|
fi
|
|
|
fi
|
|
|
echo "${BLOCK_PASSWORD}${HASH_PASSWORD}"
|
|
|
}
|
|
|
|
|
|
# Если параметр $1 известный хеш, то вернуть true, иначе false
|
|
|
# Применяется ubl-settings-usergroup
|
|
|
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
|
|
|
}
|
|
|
|
|
|
# Remove user home directories. Used ubl-settings-usergroup
|
|
|
# $1 # Users name a comma separated list
|
|
|
# TODO: Запросить хомяк по умолчанию из /etc/default/useradd HOME=
|
|
|
remove_userhome(){
|
|
|
local LIST_USERNAME="$@"
|
|
|
[[ ${LIST_USERNAME} != "" ]] || return 1
|
|
|
while IFS= read -r SELECT_USERNAME; do
|
|
|
rm -rdf ${ROOTFS}/home/"${SELECT_USERNAME}"
|
|
|
done < <(tr ',;' '\n' <<< ${LIST_USERNAME})
|
|
|
}
|
|
|
|
|
|
# Convert plain passwords to a hash in the global configuration
|
|
|
# Конвертировать не шифрованные пароли в шифрованные для глобальных переменных USERADD GROUPADD DEFAULTPASSWD DEFAULTROOTPASSWD
|
|
|
# $1 # Параметр конфигурации, где содержится пароль который нужно конвертировать, если первые символы %%, то пароль останется не шифрованным
|
|
|
# Если запущенно без параметра, то все пароли зашифровать в переменных USERADD GROUPADD DEFAULTPASSWD DEFAULTROOTPASSWD
|
|
|
globalconf_convert_pass_plain_to_hash(){
|
|
|
[[ -z ${ROOTFS} ]] || return 0
|
|
|
SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
SOURCE=${SYSCONF}/.users_credential; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
local PARAM="$@"
|
|
|
local -A USERADD
|
|
|
local -A GROUPADD
|
|
|
local DEFAULTPASSWD
|
|
|
local DEFAULTROOTPASSWD
|
|
|
[[ -n ${HASHPASSWD} ]] || HASHPASSWD=$(/usr/bin/ubconfig --raw --default get users HASHPASSWD)
|
|
|
[[ -n ${HASHPASSWD} && ${HASHPASSWD} != "(null)" ]] || HASHPASSWD='yescrypt'
|
|
|
if [[ -n ${PARAM} ]]; then
|
|
|
[[ ${PARAM%%=*} =~ [!\$%\&()*+,/\;\<\=\>?\^\{|\}~] ]] || eval "${PARAM%%=*}=\${PARAM#*=}"
|
|
|
fi
|
|
|
# Проверим DEFAULTPASSWD, если не указан в $1, то подгрузить из глобальной конфигурации
|
|
|
[[ -n ${PARAM} ]] || DEFAULTPASSWD=$(ubconfig --raw --source global get [users] DEFAULTPASSWD)
|
|
|
if [[ -n ${DEFAULTPASSWD} && ${DEFAULTPASSWD} != "(null)" ]]; then
|
|
|
if [[ -n ${PARAM} && $(is_hash_password ${DEFAULTPASSWD}) ]]; then
|
|
|
ubconfig --noexecute --target global set [users] DEFAULTPASSWD="${DEFAULTPASSWD}"
|
|
|
else
|
|
|
#return_hash_password "${DEFAULTPASSWD}"
|
|
|
#[[ -n ${HASH_PASSWORD_NEW} ]] && ubconfig --noexecute --target global set [users] DEFAULTPASSWD="${HASH_PASSWORD_NEW}"
|
|
|
ubconfig --noexecute --target global set [users] DEFAULTPASSWD="$(return_hash_password hash ${HASHPASSWD} ${DEFAULTPASSWD})"
|
|
|
fi
|
|
|
fi
|
|
|
# Проверим DEFAULTROOTPASSWD, если не указан в $1, то подгрузить из глобальной конфигурации
|
|
|
[[ -n ${PARAM} ]] || DEFAULTROOTPASSWD=$(ubconfig --raw --source global get [users] DEFAULTROOTPASSWD)
|
|
|
if [[ -n ${DEFAULTROOTPASSWD} && ${DEFAULTROOTPASSWD} != "(null)" ]]; then
|
|
|
if [[ -n ${PARAM} && $(is_hash_password ${DEFAULTROOTPASSWD}) ]]; then
|
|
|
ubconfig --noexecute --target global set [users] DEFAULTROOTPASSWD="${DEFAULTROOTPASSWD}"
|
|
|
else
|
|
|
#return_hash_password "${DEFAULTROOTPASSWD}"
|
|
|
#[[ -n ${HASH_PASSWORD_NEW} ]] && ubconfig --noexecute --target global set [users] DEFAULTROOTPASSWD="${HASH_PASSWORD_NEW}"
|
|
|
ubconfig --noexecute --target global set [users] DEFAULTROOTPASSWD="$(return_hash_password hash ${HASHPASSWD} ${DEFAULTROOTPASSWD})"
|
|
|
fi
|
|
|
fi
|
|
|
# Проверим USERADD, если не указан в $1, то подгрузить из глобальной конфигурации
|
|
|
[[ -n ${PARAM} ]] || while IFS= read -r SELECT_USERADD; do
|
|
|
if [[ ! ${SELECT_USERADD%%=*} =~ [!\$%\&()*+,/\;\<\=\>?\^\{|\}~] ]]; then
|
|
|
VAR_NAME=${SELECT_USERADD%%=*}
|
|
|
VAR_VALUE=${SELECT_USERADD#*=}; VAR_VALUE=${VAR_VALUE//\'/}
|
|
|
eval "${VAR_NAME}=\${VAR_VALUE}"
|
|
|
fi
|
|
|
done < <(ubconfig --source global get [users] USERADD[*])
|
|
|
if [[ ${#USERADD[@]} != 0 ]]; then
|
|
|
while IFS= read -u3 SELECT_USERNAME; do
|
|
|
IFS=: read -r SELECT_GECOS SELECT_UID SELECT_GROUP SELECT_EXTRAGROUPS SELECT_OPTIONAL SELECT_PASSWORD NULL <<< "${USERADD[${SELECT_USERNAME}]}"
|
|
|
if [[ ${SELECT_PASSWORD} != "" ]]; then
|
|
|
if [[ -n ${PARAM} && $(is_hash_password ${SELECT_PASSWORD}) ]]; then
|
|
|
ubconfig --noexecute --target global set [users] USERADD[${SELECT_USERNAME}]="${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:${SELECT_PASSWORD}"
|
|
|
else
|
|
|
#return_hash_password "${SELECT_PASSWORD}"
|
|
|
#[[ -n ${HASH_PASSWORD_NEW} ]] && ubconfig --noexecute --target global set [users] USERADD[${SELECT_USERNAME}]="${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:${HASH_PASSWORD_NEW}"
|
|
|
ubconfig --noexecute --target global set [users] USERADD[${SELECT_USERNAME}]="${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:$(return_hash_password hash ${HASHPASSWD} ${SELECT_PASSWORD})"
|
|
|
fi
|
|
|
fi
|
|
|
done 3< <(printf "%s\n" "${!USERADD[@]}")
|
|
|
fi
|
|
|
# Проверим GROUPADD, если не указан в $1, то подгрузить из глобальной конфигурации
|
|
|
[[ -n ${PARAM} ]] || while IFS= read -r SELECT_GROUPADD; do
|
|
|
if [[ ! ${SELECT_GROUPADD%%=*} =~ [!\$%\&()*+,/\;\<\=\>?\^\{|\}~] ]]; then
|
|
|
VAR_NAME=${SELECT_GROUPADD%%=*}
|
|
|
VAR_VALUE=${SELECT_GROUPADD#*=}; VAR_VALUE=${VAR_VALUE//\'/}
|
|
|
eval "${VAR_NAME}=\${VAR_VALUE}"
|
|
|
fi
|
|
|
done < <(ubconfig --source global get [users] GROUPADD[*])
|
|
|
if [[ ${#GROUPADD[@]} != 0 ]]; then
|
|
|
while IFS= read -u3 SELECT_GROUP; do
|
|
|
IFS=: read -r SELECT_USERS SELECT_GID SELECT_OPTIONAL SELECT_ADMINISTRATORS SELECT_PASSWORD NULL <<< "${GROUPADD[${SELECT_GROUP}]}"
|
|
|
if [[ ${SELECT_PASSWORD} != "" ]]; then
|
|
|
if [[ -n ${PARAM} && $(is_hash_password ${SELECT_PASSWORD}) ]]; then
|
|
|
ubconfig --noexecute --target global set [users] GROUPADD[${SELECT_GROUP}]="${SELECT_USERS}:${SELECT_GID}:${SELECT_OPTIONAL}:${SELECT_ADMINISTRATORS}:${SELECT_PASSWORD}"
|
|
|
else
|
|
|
#return_hash_password "${SELECT_PASSWORD}"
|
|
|
#[[ -n ${HASH_PASSWORD_NEW} ]] && ubconfig --noexecute --target global set [users] GROUPADD[${SELECT_GROUP}]="${SELECT_USERS}:${SELECT_GID}:${SELECT_OPTIONAL}:${SELECT_ADMINISTRATORS}:${HASH_PASSWORD_NEW}"
|
|
|
ubconfig --noexecute --target global set [users] GROUPADD[${SELECT_GROUP}]="${SELECT_USERS}:${SELECT_GID}:${SELECT_OPTIONAL}:${SELECT_ADMINISTRATORS}:$(return_hash_password hash ${HASHPASSWD} ${SELECT_PASSWORD})"
|
|
|
fi
|
|
|
fi
|
|
|
done 3< <(printf "%s\n" "${!GROUPADD[@]}")
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
#####################################################################################
|
|
|
###
|
|
|
### Функции получения от системы текущих настроек вида параметров от конфигурации ###
|
|
|
###
|
|
|
#####################################################################################
|
|
|
|
|
|
# Получить запись вида конфигурации USERADD из системного пользователя
|
|
|
# $1 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody
|
|
|
# <пуcто> # Эквивалентно '@users @systems'
|
|
|
# @users # Все пользователи кроме системных, MIN_UID и MAX_UID взять из /etc/login.defs
|
|
|
# @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs
|
|
|
# @all # Все с UID от 0 до 65535
|
|
|
# <digital>-<digital> # Все пользователи диапазона
|
|
|
# <username> # Имя пользователя
|
|
|
get_conf_useradd_from_system(){
|
|
|
SOURCE=${SYSCONF}/users; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
FILE_PASSWD="${ROOTFS}/etc/passwd"
|
|
|
FILE_SHADOW="${ROOTFS}/etc/shadow"
|
|
|
FILE_LOGINDEFS="${ROOTFS}/etc/login.defs"
|
|
|
DATA_FILE_PASSWD=$(cat ${FILE_PASSWD})
|
|
|
DATA_FILE_SHADOW=$(cat ${FILE_SHADOW})
|
|
|
# Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/
|
|
|
DATA_SYSUSERS=$(cat \
|
|
|
$(comm --nocheck-order -12 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/share/ublinux-sysusers/|;s|$|.sysusers|') \
|
|
|
$(comm --nocheck-order -23 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/lib/sysusers.d/|;s|$|.conf|') \
|
|
|
)
|
|
|
DEFAULT_HOME="/home"
|
|
|
DEFAULT_SHELL="/bin/bash"
|
|
|
show_user(){
|
|
|
local SELECT_USER="$1"
|
|
|
local SELECT_PLAINPASSWORD SELECT_UID SELECT_GROUP SELECT_GECOS SELECT_HOME SELECT_SHELL
|
|
|
local SELECT_OPTIONAL=
|
|
|
local SELECT_EXTRAGROUPS=
|
|
|
[[ ${DATA_FILE_PASSWD} =~ ($'\n'|^)+${SELECT_USER}:([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
|
|
|
&& SELECT_PLAINPASSWORD=${BASH_REMATCH[2]} \
|
|
|
&& SELECT_UID=${BASH_REMATCH[3]} \
|
|
|
&& SELECT_GROUP=${BASH_REMATCH[4]} \
|
|
|
&& SELECT_GECOS=${BASH_REMATCH[5]} \
|
|
|
&& SELECT_HOME=${BASH_REMATCH[6]} \
|
|
|
&& SELECT_SHELL=${BASH_REMATCH[7]}
|
|
|
|
|
|
[[ ${DATA_FILE_SHADOW} =~ ($'\n'|^)+${SELECT_USER}:([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
|
|
|
&& SELECT_PASSWORD=${BASH_REMATCH[2]}
|
|
|
[[ ${SELECT_PASSWORD} == "!*" && ${SELECT_PLAINPASSWORD} != "x" ]] && SELECT_PASSWORD="${SELECT_PLAINPASSWORD}"
|
|
|
|
|
|
#SELECT_EXTRAGROUPS=$(printf "%s\n" $(${CHROOT} id -nrG ${SELECT_USER}) | sort -u | xargs | tr " " ",")
|
|
|
#SELECT_EXTRAGROUPS=${SELECT_EXTRAGROUPS//,nobody/}; SELECT_EXTRAGROUPS=${SELECT_EXTRAGROUPS//nobody/}
|
|
|
SELECT_EXTRAGROUPS=$(comm --nocheck-order -13 <(printf "%s\n" ${USERGROUPS//,/ } | sort -u) <(printf "%s\n" $(${CHROOT} id -nrG ${SELECT_USER}) | sort -u) | xargs | tr " " ",")
|
|
|
[[ -n ${SELECT_HOME} && ${SELECT_HOME} != "${DEFAULT_HOME}/${SELECT_USER}" ]] && SELECT_OPTIONAL+=" --home-dir ${SELECT_HOME}"
|
|
|
[[ -n ${SELECT_SHELL} && ${SELECT_SHELL} != ${DEFAULT_SHELL} ]] && SELECT_OPTIONAL+=" --shell ${SELECT_SHELL}"
|
|
|
if [[ ${SELECT_PASSWORD} == "!*" ]]; then
|
|
|
local DATA_SYSUSERS_GROUP DATA_SYSUSERS_GECOS DATA_SYSUSERS_HOME DATA_SYSUSERS_SHELL
|
|
|
# Выриант1: u vault 319 "Vault daemon" /var/lib/vault
|
|
|
# Выриант2: u varnishlog 318:varnish "Varnish Cache Proxy"
|
|
|
[[ ${DATA_SYSUSERS} =~ ($'\n'|^)+'u'[[:blank:]]+${SELECT_USER}[[:blank:]]+(${SELECT_UID}|${SELECT_UID}:([^$'\n' ]*))[[:blank:]]*(\"([^$'\n']*)\"|\-)[[:blank:]]*([^$'\n' ]*)[[:blank:]]*([^$'\n' ]*)($'\n'|$)+ ]] \
|
|
|
&& DATA_SYSUSERS_GROUP=${BASH_REMATCH[3]} \
|
|
|
&& DATA_SYSUSERS_GECOS=${BASH_REMATCH[5]} \
|
|
|
&& DATA_SYSUSERS_HOME=${BASH_REMATCH[6]} \
|
|
|
&& DATA_SYSUSERS_SHELL=${BASH_REMATCH[7]}
|
|
|
[[ ${DATA_SYSUSERS_GECOS} == "-" ]] && unset DATA_SYSUSERS_GECOS
|
|
|
[[ ${DATA_SYSUSERS_HOME} == @(""|"-") ]] && DATA_SYSUSERS_HOME="/"
|
|
|
[[ ${DATA_SYSUSERS_SHELL} == @(""|"-") ]] && DATA_SYSUSERS_SHELL="/usr/bin/nologin"
|
|
|
# Поиск группы, если группа найдена, то номер как в системе, если не найдена, то номер должен быть по UID пользователя
|
|
|
[[ ${DATA_SYSUSERS_GROUP} != "" ]] && FIND_GROUP=${DATA_SYSUSERS_GROUP} || FIND_GROUP=${SELECT_USER}
|
|
|
[[ ${DATA_SYSUSERS} =~ ($'\n'|^)+'g'[[:blank:]]+${FIND_GROUP}[[:blank:]]+${SELECT_GROUP}[[:blank:]]*([^$'\n' ]*)[[:blank:]]*([^$'\n' ]*)($'\n'|$)+ ]] \
|
|
|
&& DATA_SYSUSERS_GROUP=${SELECT_GROUP} || DATA_SYSUSERS_GROUP=${SELECT_UID}
|
|
|
#
|
|
|
DATA_SYSUSERS_EXTRAGROUPS=$(sed -Enr "s/^m ${SELECT_USER} (.*)/\1/p" <<< ${DATA_SYSUSERS}) #"
|
|
|
#[[ -n ${DATA_SYSUSERS_EXTRAGROUPS} ]] && DATA_SYSUSERS_EXTRAGROUPS="${SELECT_USER},${DATA_SYSUSERS_EXTRAGROUPS//$'\n'/,}" || DATA_SYSUSERS_EXTRAGROUPS="${SELECT_USER}"
|
|
|
[[ -n ${DATA_SYSUSERS_EXTRAGROUPS} ]] && DATA_SYSUSERS_EXTRAGROUPS=$(printf "%s\n" ${SELECT_USER} ${DATA_SYSUSERS_EXTRAGROUPS} | sort -u | xargs | tr " " ",") \
|
|
|
|| DATA_SYSUSERS_EXTRAGROUPS="${FIND_GROUP}"
|
|
|
#
|
|
|
[[ ${SELECT_GROUP} == ${DATA_SYSUSERS_GROUP} && ${SELECT_EXTRAGROUPS} == ${DATA_SYSUSERS_EXTRAGROUPS} && ${SELECT_GECOS} == ${DATA_SYSUSERS_GECOS} && ${SELECT_HOME} == ${DATA_SYSUSERS_HOME} && ${SELECT_SHELL} == ${DATA_SYSUSERS_SHELL} ]] \
|
|
|
&& return 0
|
|
|
fi
|
|
|
echo "USERADD[${SELECT_USER}]='${SELECT_GECOS}:${SELECT_UID}:${SELECT_GROUP}:${SELECT_EXTRAGROUPS}:${SELECT_OPTIONAL}:${SELECT_PASSWORD}'"
|
|
|
}
|
|
|
# is_systemd_user(){
|
|
|
# # Пользователь присутстует в systemd sysusers.d
|
|
|
# local SELECT_USER=$1
|
|
|
# [[ $(cat ${ROOTFS}/usr/share/ublinux-sysusers/*.sysusers) =~ ($'\n'|^)+'u'[[:blank:]]+"${SELECT_USER}" ]] && return 1 || return 0
|
|
|
# [[ -d ${ROOTFS}/run/sysusers.d && $(cat ${ROOTFS}/run/sysusers.d/*.conf) =~ ($'\n'|^)+'u'[[:blank:]]+"${SELECT_USER}" ]] && return 1 || return 0
|
|
|
# }
|
|
|
local PARAM_ALL="$@"
|
|
|
[[ -n ${PARAM_ALL} ]] || PARAM_ALL="@users @systems"
|
|
|
while IFS= read -r SELECT_PARAM; do
|
|
|
if [[ ${SELECT_PARAM} == "@users" ]]; then
|
|
|
# Все пользователи кроме системных
|
|
|
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
while IFS= read -r SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif [[ ${SELECT_PARAM} == "@systems" ]]; then
|
|
|
# Пользователи системные
|
|
|
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
while IFS= read -r SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done < <(awk -F':' -v USER_MIN=${UID_MIN:=500} -v USER_MAX=${UID_MAX:=999} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif [[ ${SELECT_PARAM} == "@all" ]]; then
|
|
|
# Все пользователи
|
|
|
while IFS= read -ru4 SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done 4< <(awk -F':' '$1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif [[ ${SELECT_PARAM} =~ ^([[:digit:]]+)'-'*([[:digit:]]*)$ ]]; then
|
|
|
UID_MIN=${BASH_REMATCH[1]}
|
|
|
UID_MAX=${BASH_REMATCH[2]}
|
|
|
[[ -n ${UID_MAX} ]] || UID_MAX=${UID_MIN}
|
|
|
while IFS= read -r SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif grep -q ^"${SELECT_PARAM}:" ${FILE_PASSWD} &>/dev/null; then
|
|
|
show_user "${SELECT_PARAM}"
|
|
|
fi
|
|
|
done <<< "${PARAM_ALL// /$'\n'}"
|
|
|
}
|
|
|
|
|
|
# Получить запись вида конфигурации USERSHADOW из системного пользователя: USERSHADOW[superadmin]='2024-03-06:0:99999:7::'
|
|
|
# $1 # Варианты пользователей, можно указывать несколько через пробел, кроме nobody
|
|
|
# <пуcто> # Эквивалентно '@users @systems'
|
|
|
# @users # Все пользователи кроме системных, MIN_UID и MAX_UID взять из /etc/login.defs
|
|
|
# @systems # Только системные, SYS_MIN_UID и SYS_MAX_UID взять из /etc/login.defs
|
|
|
# @all # Все с UID от 0 до 65535
|
|
|
# <digital>-<digital> # Все пользователи диапазона
|
|
|
# <username> # Имя пользователя
|
|
|
get_conf_usershadow_from_system(){
|
|
|
FILE_PASSWD="${ROOTFS}/etc/passwd"
|
|
|
FILE_SHADOW="${ROOTFS}/etc/shadow"
|
|
|
FILE_LOGINDEFS="${ROOTFS}/etc/login.defs"
|
|
|
DATA_FILE_SHADOW=$(cat ${FILE_SHADOW})
|
|
|
DATE_STARTUP_SYSTEM=$(date -d "$(cut -f1 -d. /proc/uptime) seconds ago" +'%Y-%m-%d') #"
|
|
|
# Дата когда был установлен пакет и впервые добавлены пользователи
|
|
|
DATE_SYSUSERS=$(stat --printf=%y ${ROOTFS}/usr/share/ublinux-sysusers/README | cut -d' ' -f1)
|
|
|
show_user(){
|
|
|
local SELECT_USER="$1"
|
|
|
[[ ${DATA_FILE_SHADOW} =~ ($'\n'|^)+${SELECT_USER}:([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
|
|
|
&& SELECT_PASSWORD=${BASH_REMATCH[2]} \
|
|
|
&& SELECT_LASTCHANGED=${BASH_REMATCH[3]} \
|
|
|
&& SELECT_MINDAY=${BASH_REMATCH[4]} \
|
|
|
&& SELECT_MAXDAY=${BASH_REMATCH[5]} \
|
|
|
&& SELECT_WARN=${BASH_REMATCH[6]} \
|
|
|
&& SELECT_INACTIVE=${BASH_REMATCH[7]} \
|
|
|
&& SELECT_EXPIRE=${BASH_REMATCH[8]} \
|
|
|
&& SELECT_NOUSE=${BASH_REMATCH[9]}
|
|
|
[[ -n ${SELECT_LASTCHANGED} ]] && SELECT_LASTCHANGED=$(date -d @$((${SELECT_LASTCHANGED}*24*60*60)) +'%Y-%m-%d')
|
|
|
[[ -n ${SELECT_EXPIRE} ]] && SELECT_LASTCHANGED=$(date -d @$((${SELECT_EXPIRE}*24*60*60)) +'%Y-%m-%d')
|
|
|
if [[ -z ${SELECT_MINDAY} && -z ${SELECT_MAXDAY} && -z ${SELECT_WARN} && -z ${SELECT_INACTIVE} && -z ${SELECT_EXPIRE} ]]; then
|
|
|
[[ ${SELECT_LASTCHANGED} == ${DATE_STARTUP_SYSTEM} ]] && return 0
|
|
|
# Сравнить дату впервые созданных пользователей с датой установки пакета ublinux-sysusers
|
|
|
[[ ${SELECT_LASTCHANGED} == ${DATE_SYSUSERS} ]] && return 0
|
|
|
# # Найти файл 'sysusers' где встречается пользователь и сравнить дату создания файла с датой создания пользователя
|
|
|
# FILE_NAME_SYSTEMD=$(grep -E "^u[[:blank:]]+${SELECT_USER}" ${ROOTFS}/usr/share/ublinux-sysusers/*.sysusers ${ROOTFS}/usr/share/ublinux-sysusers/dynamic/*.sysusers 2>/dev/null | cut -d: -f1 | xargs stat --printf=%y | cut -d' ' -f1;)
|
|
|
fi
|
|
|
echo "USERSHADOW[${SELECT_USER}]='${SELECT_LASTCHANGED}:${SELECT_MINDAY}:${SELECT_MAXDAY}:${SELECT_WARN}:${SELECT_INACTIVE}:${SELECT_EXPIRE}'"
|
|
|
}
|
|
|
local PARAM_ALL="$@"
|
|
|
[[ -n ${PARAM_ALL} ]] || PARAM_ALL="@users @systems"
|
|
|
while IFS= read -r SELECT_PARAM; do
|
|
|
if [[ ${SELECT_PARAM} == "@users" ]]; then
|
|
|
# Все пользователи кроме системных
|
|
|
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
while IFS= read -r SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif [[ ${SELECT_PARAM} == "@systems" ]]; then
|
|
|
# Пользователи системные
|
|
|
UID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
UID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_UID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
while IFS= read -r SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done < <(awk -F':' -v USER_MIN=${UID_MIN:=500} -v USER_MAX=${UID_MAX:=999} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif [[ ${SELECT_PARAM} == "@all" ]]; then
|
|
|
# Все пользователи
|
|
|
while IFS= read -ru4 SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done 4< <(awk -F':' '$1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif [[ ${SELECT_PARAM} =~ ^([[:digit:]]+)'-'*([[:digit:]]*)$ ]]; then
|
|
|
UID_MIN=${BASH_REMATCH[1]}
|
|
|
UID_MAX=${BASH_REMATCH[2]}
|
|
|
[[ -n ${UID_MAX} ]] || UID_MAX=${UID_MIN}
|
|
|
while IFS= read -r SELECT_USER; do
|
|
|
show_user "${SELECT_USER}"
|
|
|
done < <(awk -F':' -v USER_MIN=${UID_MIN:=1000} -v USER_MAX=${UID_MAX:=65534} '$3 >= USER_MIN && $3 <= USER_MAX && $1 != "nobody" { print $1}' ${FILE_PASSWD})
|
|
|
elif grep -q ^"${SELECT_PARAM}:" ${FILE_PASSWD} &>/dev/null; then
|
|
|
show_user "${SELECT_PARAM}"
|
|
|
fi
|
|
|
done <<< "${PARAM_ALL// /$'\n'}"
|
|
|
}
|
|
|
|
|
|
############################################################################################################
|
|
|
# Получить запись вида конфигурации GROUPADD из систеных групп
|
|
|
# $1 # Варианты групп, можно указывать несколько через пробел, кроме nobody
|
|
|
# <пусто> # Эквивалентно '@groups @systems'
|
|
|
# @groups # Все кроме системных, MIN_GID и MAX_GID взять из /etc/login.defs
|
|
|
# @systems # Только системные, SYS_MIN_GID и SYS_MAX_GID взять из /etc/login.defs
|
|
|
# @all # Все c GID от 0 до 65535
|
|
|
# <digital>-<digital> # Все пользователи диапазона
|
|
|
# <groupname> # Имя группы
|
|
|
get_conf_groupadd_from_system(){
|
|
|
FILE_GROUP="${ROOTFS}/etc/group"
|
|
|
FILE_GSHADOW="${ROOTFS}/etc/gshadow"
|
|
|
FILE_LOGINDEFS="${ROOTFS}/etc/login.defs"
|
|
|
DATA_FILE_GROUP=$(cat ${FILE_GROUP})
|
|
|
DATA_FILE_GSHADOW=$(cat ${FILE_GSHADOW})
|
|
|
# Загрузить файлы которые совпадают в каталогах /usr/lib/sysusers.d/ и /usr/share/ublinux-sysusers/. И загрузить которые уникальные в /usr/lib/sysusers.d/
|
|
|
DATA_SYSUSERS=$(cat \
|
|
|
$(comm --nocheck-order -12 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/share/ublinux-sysusers/|;s|$|.sysusers|') \
|
|
|
$(comm --nocheck-order -23 <(cd /usr/lib/sysusers.d/ && ls -v1 *.conf | sed "s/\.conf//g") <(cd /usr/share/ublinux-sysusers/ && ls -v1 *.sysusers | sed "s/\.sysusers//g") | sed 's|^|/usr/lib/sysusers.d/|;s|$|.conf|') \
|
|
|
)
|
|
|
show_group(){
|
|
|
local SELECT_GROUP="$1"
|
|
|
local SELECT_PLAINPASSWORD SELECT_GID SELECT_MEMBERS
|
|
|
[[ ${DATA_FILE_GROUP} =~ ($'\n'|^)+${SELECT_GROUP}:([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
|
|
|
&& SELECT_PLAINPASSWORD=${BASH_REMATCH[2]} \
|
|
|
&& SELECT_GID=${BASH_REMATCH[3]} \
|
|
|
&& SELECT_MEMBERS=${BASH_REMATCH[4]}
|
|
|
local SELECT_PASSWORD SELECT_ADMINISTRATORS SELECT_GMEMBERS
|
|
|
[[ ${DATA_FILE_GSHADOW} =~ ($'\n'|^)+${SELECT_GROUP}:([^$'\n']*):([^$'\n']*):([^$'\n']*)($'\n'|$)+ ]] \
|
|
|
&& SELECT_PASSWORD=${BASH_REMATCH[2]} \
|
|
|
&& SELECT_ADMINISTRATORS=${BASH_REMATCH[3]} \
|
|
|
&& SELECT_GMEMBERS=${BASH_REMATCH[4]}
|
|
|
[[ ${SELECT_PASSWORD} == "!*" && ${SELECT_PLAINPASSWORD} != "x" ]] && SELECT_PASSWORD="${SELECT_PLAINPASSWORD}"
|
|
|
local SELECT_OPTIONAL
|
|
|
if [[ ${SELECT_PASSWORD} == "!*" && ${SELECT_MEMBERS} == ${SELECT_GMEMBERS} && -z ${SELECT_ADMINISTRATORS} ]]; then
|
|
|
DATA_SYSUSERS_MEMBERS=$(sed -Enr "s/^m (.*) ${SELECT_GROUP}/\1/p" <<< ${DATA_SYSUSERS}) #"
|
|
|
[[ -n ${DATA_SYSUSERS_MEMBERS} ]] && DATA_SYSUSERS_MEMBERS=$(printf "%s\n" ${DATA_SYSUSERS_MEMBERS} | sort -u | xargs | tr " " ",") || unset DATA_SYSUSERS_MEMBERS
|
|
|
[[ ${SELECT_MEMBERS} == ${DATA_SYSUSERS_MEMBERS} ]] && return 0
|
|
|
fi
|
|
|
echo "GROUPADD[${SELECT_GROUP}]='${SELECT_MEMBERS}:${SELECT_GID}:${SELECT_OPTIONAL}:${SELECT_ADMINISTRATORS}:${SELECT_PASSWORD}'"
|
|
|
}
|
|
|
local PARAM_ALL="$@"
|
|
|
[[ -n ${PARAM_ALL} ]] || PARAM_ALL="@groups @systems"
|
|
|
while IFS= read -r SELECT_PARAM; do
|
|
|
if [[ ${SELECT_PARAM} == "@groups" ]]; then
|
|
|
# Все группы кроме системных
|
|
|
GID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*GID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
GID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*GID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
while IFS= read -r SELECT_GROUP; do
|
|
|
show_group "${SELECT_GROUP}"
|
|
|
done < <(awk -F':' -v GROUP_MIN=${GID_MIN:=1000} -v GROUP_MAX=${GID_MAX:=65534} '$3 >= GROUP_MIN && $3 <= GROUP_MAX && $1 != "nobody" { print $1}' ${FILE_GROUP})
|
|
|
elif [[ ${SELECT_PARAM} == "@systems" ]]; then
|
|
|
# Группы системные
|
|
|
GID_MIN=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_GID_MIN[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
GID_MAX=$([[ $(cat "${FILE_LOGINDEFS}") =~ [^#[^:blank:]]*SYS_GID_MAX[[:blank:]]+([[:digit:]]+) ]]; echo -n "${BASH_REMATCH[1]}")
|
|
|
while IFS= read -r SELECT_GROUP; do
|
|
|
show_group "${SELECT_GROUP}"
|
|
|
done < <(awk -F':' -v GROUP_MIN=${GID_MIN:=500} -v GROUP_MAX=${GID_MAX:=999} '$3 >= GROUP_MIN && $3 <= GROUP_MAX && $1 != "nobody" { print $1}' ${FILE_GROUP})
|
|
|
elif [[ ${SELECT_PARAM} == "@all" ]]; then
|
|
|
# Все группы
|
|
|
while IFS= read -ru4 SELECT_GROUP; do
|
|
|
show_group "${SELECT_GROUP}"
|
|
|
done 4< <(awk -F':' '$1 != "nobody" { print $1}' ${FILE_GROUP})
|
|
|
elif [[ ${SELECT_PARAM} =~ ^([[:digit:]]+)'-'*([[:digit:]]*)$ ]]; then
|
|
|
GID_MIN=${BASH_REMATCH[1]}
|
|
|
GID_MAX=${BASH_REMATCH[2]}
|
|
|
[[ -n ${GID_MAX} ]] || GID_MAX=${GID_MIN}
|
|
|
while IFS= read -r SELECT_GROUP; do
|
|
|
show_group "${SELECT_GROUP}"
|
|
|
done < <(awk -F':' -v GROUP_MIN=${GID_MIN:=1000} -v GROUP_MAX=${GID_MAX:=65534} '$3 >= GROUP_MIN && $3 <= GROUP_MAX && $1 != "nobody" { print $1}' ${FILE_GROUP})
|
|
|
elif grep -q ^"${SELECT_PARAM}:" ${FILE_GROUP} &>/dev/null; then
|
|
|
show_group "${SELECT_PARAM}"
|
|
|
fi
|
|
|
done <<< "${PARAM_ALL// /$'\n'}"
|
|
|
}
|
|
|
|
|
|
#####################################################################################
|
|
|
#####################################################################################
|
|
|
|
|
|
detectDE(){
|
|
|
[[ -z ${SESSION} && ${KDE_FULL_SESSION} == true ]] && SESSION=kde
|
|
|
[[ -z ${SESSION} && ${XDG_CURRENT_DESKTOP} == XFCE ]] && SESSION=xfce
|
|
|
[[ -z ${SESSION} && ${DESKTOP_SESSION} == LXDE ]] && SESSION=lxde
|
|
|
[[ -z ${SESSION} && ${XDG_CURRENT_DESKTOP} == LXQt ]] && SESSION=lxqt
|
|
|
[[ -z ${SESSION} && ${DESKTOP_SESSION} == i3 ]] && SESSION=i3
|
|
|
[[ -z ${SESSION} && ${XDG_CURRENT_DESKTOP} == i3 ]] && SESSION=i3
|
|
|
[[ -z ${SESSION} && ${DESKTOP_SESSION} == i3term ]] && SESSION=i3term
|
|
|
[[ -z ${SESSION} && ${XDG_CURRENT_DESKTOP} == i3term ]] && SESSION=i3term
|
|
|
[[ -z ${SESSION} && ${XDG_CURRENT_DESKTOP} == MATE ]] && SESSION=mate
|
|
|
if [[ -z ${SESSION} ]]; then
|
|
|
ps -A | grep -q " xfce4-session$" && SESSION=xfce
|
|
|
ps -A | grep -q " kdeinit$" && SESSION=kde
|
|
|
ps -A | grep -q " i3$" && SESSION=i3
|
|
|
ps -A | grep -q " i3term$" && SESSION=i3term
|
|
|
ps -A | grep -q " gnome-panel$" && SESSION=gnome
|
|
|
ps -A | grep -q " gnome-shell$" && SESSION=gnome-shell
|
|
|
ps -A | grep -q " plasmashell$" && SESSION=plasma
|
|
|
fi
|
|
|
[[ -z ${SESSION} && -x /usr/bin/startxfce4 ]] && SESSION=xfce
|
|
|
[[ -z ${SESSION} && -x /usr/bin/startlxde ]] && SESSION=lxde
|
|
|
[[ -z ${SESSION} && -x /usr/bin/startlxqt ]] && SESSION=lxqt
|
|
|
[[ -z ${SESSION} && -x /usr/bin/plasmashell ]] && SESSION=plasma
|
|
|
[[ ${SESSION} == kde && -x /usr/bin/plasmashell ]] && SESSION=plasma
|
|
|
# SESSION=budgie
|
|
|
# SESSION=cinnamon
|
|
|
# SESSION=sway
|
|
|
echo ${SESSION}
|
|
|
}
|
|
|
|
|
|
# ===========================================================
|
|
|
# liblinuxlive functions
|
|
|
# ===========================================================
|
|
|
|
|
|
debug_log(){
|
|
|
if grep -q "debug" /proc/cmdline ; then
|
|
|
echo "- debug: $*" >&2
|
|
|
log "- debug: $*"
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
log(){
|
|
|
echo "$@" 2>/dev/null >>/var/log/ublinux.log
|
|
|
}
|
|
|
|
|
|
debug_mode(){
|
|
|
if [ "$(cmdline_parameter debug)" -o "$DEBUGMODE" == "yes" ] ; then
|
|
|
name=$(basename $0)
|
|
|
slash="/"
|
|
|
[ "$(pwd)" == "/union" ] && slash=""
|
|
|
if ! test -f ${slash}var/log/ublinux/${name}.log ; then
|
|
|
echo "$0 -- debug mode enabled"
|
|
|
test -d ${slash}var/log/ublinux || mkdir -p ${slash}var/log/ublinux
|
|
|
echo $(date) > ${slash}var/log/ublinux/${name}.log || echo "can not create log file"
|
|
|
$0 "$@" 2>&1 | tee -a ${slash}var/log/ublinux/${name}.log
|
|
|
exit 0
|
|
|
fi
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
echodebug(){
|
|
|
[ "$DEBUG_IS_ENABLED" -o "$DEBUGMODE" == "yes" ] && echo "$1"
|
|
|
if [ -n "$2" ] ;then
|
|
|
command=$2
|
|
|
shift ; shift
|
|
|
if [ -z $1 ] ;then
|
|
|
$command
|
|
|
else
|
|
|
$command "$@"
|
|
|
fi
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
# Create module
|
|
|
# call mksquashfs with apropriate arguments
|
|
|
# $1 = directory which will be compressed to squashfs module
|
|
|
# $2 = output filesystem module file
|
|
|
# $3..$9 = optional arguments like -keep-as-directory or -b 123456789
|
|
|
create_module(){
|
|
|
. /usr/lib/ublinux/default
|
|
|
. /etc/ublinux/config 2>/dev/null
|
|
|
. /etc/ublinux/system 2>/dev/null
|
|
|
echo " $@ " | grep -Eq ' -comp | -noD ' && MKSQFS_OPTS=
|
|
|
mksquashfs "$1" "$2" $MKSQFS_OPTS $3 $4 $5 $6 $7 $8 $9 -noappend >/dev/null || return 1
|
|
|
chmod 444 "$2"
|
|
|
}
|
|
|
|
|
|
# look into cmdline and echo $1 back if $1 is set
|
|
|
# $1 = value name, case sensitive, for example 'debug'
|
|
|
cmdline_parameter(){
|
|
|
. /etc/ublinux/config 2>/dev/null || . etc/ublinux/config 2>/dev/null
|
|
|
echo -n " $CMDLINE " | cat /proc/cmdline - 2>/dev/null | tr "[:cntrl:]" " " | grep -Em1 -o "(^|[[:space:]])$1([[:space:]]|\$)" | head -1 | tr -d " "
|
|
|
}
|
|
|
|
|
|
# look into cmdline and echo value of $1 option
|
|
|
# $1 = value name, case sensitive, for example 'changes'
|
|
|
cmdline_value(){
|
|
|
. /etc/ublinux/config 2>/dev/null || . etc/ublinux/config 2>/dev/null
|
|
|
echo -n " $CMDLINE " | cat /proc/cmdline - 2>/dev/null | tr "[:cntrl:]" " " | grep -Em1 -o "(^|[[:space:]])$1=[^[:space:]]+" | head -1 | cut -d "=" -f 2-
|
|
|
}
|
|
|
|
|
|
# Find and run all scripts from the given module
|
|
|
# This function is used by the activate and deactivate script when the distro
|
|
|
# is already started, not during live setup
|
|
|
# $1 = mounted module full path
|
|
|
# $2..$n = optional arguments for the scripts, eg. 'start'
|
|
|
find_n_run_scripts(){
|
|
|
debug_log "find_n_run_scripts" "$*"
|
|
|
local MOD
|
|
|
|
|
|
MOD="$1"
|
|
|
shift
|
|
|
|
|
|
RCPATH=/etc/init.d
|
|
|
[ -d $RCPATH ] || RCPATH=/etc/rc.d/init.d
|
|
|
RUNLEVEL=$(runlevel | awk '{print $2}')
|
|
|
[ -d "/etc/rc$RUNLEVEL.d" ] && RCPATH=/etc/rc$RUNLEVEL.d
|
|
|
[ -d "/etc/rc.d/rc$RUNLEVEL.d" ] && RCPATH=/etc/rc.d/rc$RUNLEVEL.d
|
|
|
RUNSCRIPTS="$MOD$RCPATH|$MOD/usr/lib/ublinux/rc.local|$MOD/usr/lib/ublinux/rc.post"
|
|
|
echo $@ | grep -q start || RUNSCRIPTS="$MOD$RCPATH"
|
|
|
|
|
|
find "$MOD" | grep -E "$RUNSCRIPTS" | cut -b "${#MOD}"- | cut -b 2- | xargs -n 1 -r readlink -f | sort -u | \
|
|
|
while read SCRIPT; do
|
|
|
if [ "$SCRIPT" != "" -a -x "$SCRIPT" -a ! -d "$SCRIPT" ]; then
|
|
|
# call the script by real path, not from the module
|
|
|
log "starting '"$SCRIPT" $@'"
|
|
|
"${SCRIPT}" "$@"
|
|
|
fi
|
|
|
done
|
|
|
}
|
|
|
|
|
|
# test if the script is started by root user. If not, exit
|
|
|
allow_only_root(){
|
|
|
if [ "0$UID" -ne 0 ]; then
|
|
|
echo "Only root can run $(basename $0)"; exit 1
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
|
|
|
#####################
|
|
|
# Hotkeys functions #
|
|
|
#####################
|
|
|
|
|
|
notify_send(){
|
|
|
local FIND_DISPLAY=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
|
|
|
local FIND_USER=$(who | grep '('${FIND_DISPLAY}')' | awk '{print $1}' | head -n 1) #'
|
|
|
local FIND_UID=$(id -u ${FIND_USER})
|
|
|
[[ -n ${FIND_DISPLAY} && -n ${FIND_USER} && -n ${FIND_UID} ]] || return 1
|
|
|
sudo -u ${FIND_USER} DISPLAY=${FIND_DISPLAY} DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${FIND_UID}/bus notify-send "$@"
|
|
|
}
|
|
|
|
|
|
show_run(){
|
|
|
DE=$(detectDE)
|
|
|
if [ "$DE" = "kde" -o "$DE" = "plasma" ] ; then
|
|
|
krunner
|
|
|
elif [ "$DE" = "gnome" ] ; then
|
|
|
gnome-panel-control --run-dialog
|
|
|
elif [ "$DE" = "lxqt" ] ; then
|
|
|
lxqt-runner
|
|
|
else
|
|
|
rofi -config /usr/share/ublinux/i3/rofi.cfg -show
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
lock_session(){
|
|
|
DE=$(detectDE)
|
|
|
# qdbus org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.Lock
|
|
|
xterm -geometry 0x0+1+1 -e "dbus-send --dest=org.freedesktop.ScreenSaver --print-reply /ScreenSaver org.freedesktop.ScreenSaver.Lock"
|
|
|
if [ "$DE" != "kde" -a "$DE" != "plasma" ] ; then
|
|
|
ps -U $(id -u) | grep -q xscreensaver || xscreensaver -no-splash &
|
|
|
sleep 0.5s
|
|
|
xscreensaver-command -lock
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
xss_slideshow(){
|
|
|
chbg -xscreensaver -randomize -R -effect 1 -interval 0.2 -mode smart -max_size 100 -R /usr/share/ublinux/screensaver/Default >/dev/null 2>&1
|
|
|
}
|
|
|
|
|
|
xss_heartbeat(){
|
|
|
. /usr/lib/ublinux/default
|
|
|
. /etc/ublinux/config 2>/dev/null
|
|
|
SSAVERBLOCKAPPS="$(echo "$SSAVERBLOCKAPPS"| tr ',; ' '|' )"
|
|
|
bash -c "while true ;do top -bn1 -u $(id -un) | awk '{ print \$7 FS \$NF }' | grep ^[1-9] | grep -Eq \"$SSAVERBLOCKAPPS\" && xscreensaver-command -deactivate >/dev/null ; sleep 20s ; done " &
|
|
|
}
|
|
|
|
|
|
|
|
|
show_hotkeys(){
|
|
|
MSG1=$(gettext -s "UBLinux magic keys:")
|
|
|
echo "$MSG1" > /tmp/listkeys
|
|
|
echo " " >> /tmp/listkeys
|
|
|
cat $HOME/.xbindkeysrc | sed -e 's/^".*"//' -e 's/Mod4/WIN/' -e '/^#.*#/ d' -e '/^ *$/ d' -e 's/^# *//' | while read a ; do
|
|
|
gettext -s "$a" >> /tmp/listkeys
|
|
|
done
|
|
|
mdialog --textbox /tmp/listkeys 600 600
|
|
|
rm -f /tmp/listkeys
|
|
|
}
|
|
|
|
|
|
show_info(){
|
|
|
. /etc/os-release
|
|
|
FILE_INFO="/tmp/info.txt"
|
|
|
LIVECDNAME="$NAME"
|
|
|
UPTIME=$(uptime | awk '{print "time - "$1", up - "$3}').
|
|
|
RAM=$(free -m | grep Mem | awk '{ print "total - "$2", free - "$4}')
|
|
|
SWAP=$(free -m | grep Swap | awk '{ print "total - "$2", free - "$4}')
|
|
|
CPU="$(cat /proc/cpuinfo | sed -e '/model name/!d' -e 's/^.*://')"
|
|
|
CPUARCH=$(uname -p)
|
|
|
KERNEL=$(uname -r)
|
|
|
VIDEO=$(lspci | sed -e '/VGA/!d' -e 's/^.*://')
|
|
|
GLXINFO=$(glxinfo | sed '2,3!d')
|
|
|
AUDIO=$(lspci | sed -e '/Audio/!d' -e 's/^.*://')
|
|
|
CMDLINE=$(cat /proc/cmdline)
|
|
|
VERSION=$(cat /etc/ublinux-release)
|
|
|
if [ $(cmdline_parameter unionfs) ] ;then
|
|
|
PROF_SIZE=$(df -h / |grep unionfs | awk '{print " ["$5"] total - "$2", free - "$4}')
|
|
|
else
|
|
|
PROF_SIZE=$(df -h / |grep aufs | awk '{print " ["$5"] total - "$2", free - "$4}')
|
|
|
fi
|
|
|
echo "$LIVECDNAME ($VERSION)" > "${FILE_INFO}"
|
|
|
echo "UPTIME: $UPTIME" >> "${FILE_INFO}"
|
|
|
echo "KERNEL: $KERNEL" >> "${FILE_INFO}"
|
|
|
echo "RAM: $RAM" >> "${FILE_INFO}"
|
|
|
echo "SWAP: $SWAP" >> "${FILE_INFO}"
|
|
|
[ "$(cat /proc/cmdline | grep changes= )" ] && echo "PROFILE: $PROF_SIZE" >> "${FILE_INFO}"
|
|
|
echo -e "CPU: ($CPUARCH) \n$CPU" >> "${FILE_INFO}"
|
|
|
echo "VIDEO: $VIDEO" >> "${FILE_INFO}"
|
|
|
echo "$GLXINFO" >> "${FILE_INFO}"
|
|
|
echo "AUDIO: $AUDIO" >> "${FILE_INFO}"
|
|
|
echo "CMDLINE: $CMDLINE" >> "${FILE_INFO}"
|
|
|
echo "MODULES:" >> "${FILE_INFO}"
|
|
|
grep squashfs /proc/mounts | awk '{print $2}' | sort >> "${FILE_INFO}"
|
|
|
zenity --text-info \
|
|
|
--width=640 \
|
|
|
--height=480 \
|
|
|
--title="Show info" \
|
|
|
--filename="${FILE_INFO}"
|
|
|
rm -f "${FILE_INFO}"
|
|
|
}
|
|
|
|
|
|
touchpad(){
|
|
|
MSG2=$(gettext -s "Touchpad disabled, WIN+t to enable again")
|
|
|
if [ $(synclient -l | grep TouchpadOff | awk '{ print $3 }') -eq 0 ] ;then
|
|
|
synclient TouchpadOff=1
|
|
|
mdialog --passivepopup "$MSG2"
|
|
|
else
|
|
|
synclient TouchpadOff=0
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
rfswitch(){
|
|
|
MSG3=$(gettext -s "bluetooth, WI-FI interfaces disabled, WIN+w to enable again")
|
|
|
rfkill list | grep yes
|
|
|
if [ $? -eq 0 ] ;then
|
|
|
rfkill unblock all
|
|
|
else
|
|
|
rfkill block all
|
|
|
mdialog --passivepopup "$MSG3"
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
recordvideo(){
|
|
|
MSG1=$(gettext -s "Recording are stoped, please wait for encoding")
|
|
|
MSG2=$(gettext -s "Video are encoded and placed to your home dir")
|
|
|
RMDOPT=
|
|
|
. /etc/ublinux/config 2>/dev/null
|
|
|
ps -U $UID | grep -q pulseaudio && RMDOPT="$RMDOPT --device pulse"
|
|
|
PID=$(ps -U $UID -o pid,comm | grep recordmydesktop | awk '{print $1}')
|
|
|
if [ -z "$PID" ] ;then
|
|
|
recordmydesktop $RMDOPT &
|
|
|
else
|
|
|
kill "$PID"
|
|
|
mdialog --passivepopup "$MSG1"
|
|
|
bash -c "while true ;do ps -A -o pid | grep -q ^$PID$ || break ; sleep 1s ;done ; mdialog --passivepopup \"$MSG2\""
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
show_network(){
|
|
|
echo "netstat --inet" > ~/network.txt
|
|
|
netstat --inet >> ~/network.txt
|
|
|
echo -e "\nlsof -i" >> ~/network.txt
|
|
|
/usr/sbin/lsof -i >> ~/network.txt
|
|
|
mdialog --textbox $HOME/network.txt 600 250
|
|
|
rm -f $HOME/info.txt
|
|
|
}
|
|
|
|
|
|
google_search(){
|
|
|
xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "http://www.google.ru/search?hl=ru&q=" $1}' | xargs firefox -new-tab
|
|
|
}
|
|
|
|
|
|
translate_en_rus(){
|
|
|
[ "$1" == "passive" ] && mdialog --passivepopup "$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&text=$(xclip -o | sed "s/[\"'<>]//g")&sl=auto&tl=ru" | sed 's/\[\[\[\"//' | cut -d \" -f 1)"
|
|
|
[ "$1" == "msgbox" ] && mdialog --msgbox "$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&text=$(xclip -o | sed "s/[\"'<>]//g")&sl=auto&tl=ru" | sed 's/\[\[\[\"//' | cut -d \" -f 1)"
|
|
|
[ "$1" == "firefox" ] && xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "translate.google.com/translate_t?hl=en#en|ru|" $1}' | xargs firefox -new-tab
|
|
|
}
|
|
|
|
|
|
translate_rus_en(){
|
|
|
[ "$1" == "passive" ] && mdialog --passivepopup "$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&text=$(xclip -o | sed "s/[\"'<>]//g")&sl=auto&tl=en" | sed 's/\[\[\[\"//' | cut -d \" -f 1)"
|
|
|
[ "$1" == "msgbox" ] && mdialog --msgbox "$(wget -U "Mozilla/5.0" -qO - "http://translate.google.com/translate_a/t?client=t&text=$(xclip -o | sed "s/[\"'<>]//g")&sl=auto&tl=en" | sed 's/\[\[\[\"//' | cut -d \" -f 1)"
|
|
|
[ "$1" == "firefox" ] && xclip -o | sed -r '2~1d;s/(^\s+|\s+$)//g;s/%/%25/g;s/#/%23/g;s/\$/%24/g;s/&/%26/g;s/\+/%2B/;s/,/%2C/g;s/:/%3A/g;s/;/%3B/g;s/=/%3D/g;s/\?/%3F/g;s/@/%40/g;s/\s/+/g' | awk '{print "translate.google.com/translate_t?hl=ru#ru|en|" $1}' | xargs firefox -new-tab
|
|
|
}
|
|
|
|
|
|
open_url(){
|
|
|
xclip -o | sed -n 1p | xargs firefox -new-tab
|
|
|
}
|
|
|
|
|
|
userkeys(){
|
|
|
string=$(head -n $1 $HOME/.userkeys | tail -n 1)
|
|
|
TMPFILE=$HOME/tmp/userkey-$(id -un)
|
|
|
> $TMPFILE
|
|
|
echo "#!/bin/bash" > $TMPFILE
|
|
|
echo "$string" >> $TMPFILE
|
|
|
chmod +x $TMPFILE
|
|
|
$TMPFILE
|
|
|
rm -f $TMPFILE
|
|
|
}
|
|
|
|
|
|
screen_scale(){
|
|
|
scale_[1]=1x1
|
|
|
scale_[2]=1x1.2
|
|
|
scale_[3]=1.2x1.2
|
|
|
scale_[4]=1.2x1.5
|
|
|
scale_[5]=1.5x1.5
|
|
|
scale=2
|
|
|
[ -f /tmp/scale ] && scale=$(cat /tmp/scale)
|
|
|
xrandr --output LVDS1 --scale ${scale_[$scale]}
|
|
|
if [ $scale == 5 ] ; then
|
|
|
echo 1 > /tmp/scale
|
|
|
else
|
|
|
echo $(expr $scale + 1) > /tmp/scale
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
################
|
|
|
##### MAIN #####
|
|
|
################
|
|
|
|
|
|
return 0 2>/dev/null && return 0
|
|
|
if [[ -z $@ ]]; then
|
|
|
while read -r FUNCTION; do
|
|
|
$"${FUNCTION##* }"
|
|
|
done < <(declare -F | grep "declare -f exec_")
|
|
|
else
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
declare -f ${1} &>/dev/null && FUNCTION+="; ${1}" && shift || { FUNCTION+=" '${1}'" && shift; }
|
|
|
done
|
|
|
eval ${FUNCTION#*; }
|
|
|
fi
|
|
|
|