diff --git a/ublinux/functions b/ublinux/functions index 834dfa6..309da1b 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -1650,7 +1650,7 @@ ubconfig_exec_system(){ MOUNT_ATTR\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/44-mountattr ;; MOUNT_QUOTA\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/45-disk-quota "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; CGROUP_QUOTA\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.post.d/46-cgroup-quota "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; - POLKIT\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/59-polkit ;; + POLKIT\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/59-polkit exec_polkit;; *) NO_FIND_EXCUTE=1 ;; esac ;; diff --git a/ublinux/rc.preinit.d/59-polkit b/ublinux/rc.preinit.d/59-polkit index ba70af2..c63c440 100755 --- a/ublinux/rc.preinit.d/59-polkit +++ b/ublinux/rc.preinit.d/59-polkit @@ -23,44 +23,162 @@ SYSCONF="${ROOTFS}${SYSCONF}" SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/security; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null +# Extended pattern matching: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching +shopt -s extglob + declare -A POLKIT exec_polkit_ubinstall(){ - [[ $(cmdline_value ub.sgnfiles) =~ .*"-iso.sgn" ]] && POLKIT[com.ublinux.ubinstall-gtk.]=yes:wheel + [[ $(cmdline_value ub.sgnfiles) =~ .*"-iso.sgn" ]] && POLKIT[com.ublinux.ubinstall-gtk.]=yes } +## Управление разрешениями действий polkit, можно разрешать для группы пользователей +## POLKIT[]=[:,,<@group_1>,<@group_n>::]" +## Посмотреть все доступные объекты polkit: pkaction | grep udisks +## # Имя схемы, применимо использование не полного имени до .(точки) +## org.freedesktop.udisks2. # Mounting a filesystems all subgroup | Монтировать файловую систему все подгруппы +## org.freedesktop.udisks2.filesystem-mount # Mounting a filesystems | Монтировать файловую систему +## org.freedesktop.udisks2.filesystem-mount-system # Mount a filesystem on a system device | Монтировать файловую систему на системном устройстве +## org.freedesktop.udisks2.filesystem-mount-other-seat # Mount a device attached to another seat | Монтировать файловую систему с устройства, подключенного в другое место +## org.freedesktop.udisks2.filesystem-unmount-others # Unmount a device mounted by another user | Демонтировать устройство, смонтированное другим пользователем +## org.freedesktop.udisks2.eject-media-other-seat # Разрешение на извлечение лотка оптического привода пользователям, подключенным не к основному рабочему месту +## org.freedesktop.udisks2.power-off-drive-other-seat # Разрешение на извлечение usb-диска пользователям, подключенным не к основному рабочему месту +## org.freedesktop.machine1.host-login +## org.freedesktop.DisplayManager.AccountsService.ModifyAny +## org.freedesktop.login1.suspend +## org.freedesktop.login1.suspend-multiple-sessions +## org.freedesktop.login1.suspend-ignore-inhibit +## org.freedesktop.login1.hibernate +## org.freedesktop.login1.hibernate-multiple-sessions +## org.freedesktop.login1.hibernate-ignore-inhibit +## org.freedesktop.login1.reboot +## org.freedesktop.login1.reboot-multiple-sessions +## org.freedesktop.login1.reboot-ignore-inhibit +## org.freedesktop.login1.set-reboot-parameter +## org.freedesktop.login1.set-reboot-to-boot-loader-entry +## org.freedesktop.login1.set-reboot-to-boot-loader-menu +## org.freedesktop.login1.set-reboot-to-firmware-setup +## org.freedesktop.login1.manage +## org.freedesktop.login1.lock-sessions +## org.freedesktop.login1.chvt +## org.freedesktop.upower.hibernate +## org.freedesktop.upower.suspend +## org.xfce.power.xfce4-pm-helper +## org.xfce.session.xfsm-shutdown-helper +## org.manjaro.pamac. # GUI Pamac install package | ГУЙ pamac установка и обновление пакетов +## org.opensuse.cupspkhelper.mechanism.all-edit # Printer settings | Настройки принтера +## org.freedesktop.NetworkManager. # NetworkManager settings | Настройки NetworkManager +## org.freedesktop.NetworkManager.settings.modify.system # Разрешение на создание и модификацию системных сетевых соединений +## # Действие на правило +## yes # Предоставить разрешения +## no # Заблокировать разрешения +## auth_self # Пользователь должен ввести свой пароль для аутентификации +## auth_self_keep # Пользователь должен ввести свой пароль для аутентификации, авторизация сохраняется на несколько минут +## auth_admin # Пользователь должен ввести пароль администратора при каждом запросе +## auth_admin_keep # Пользователь должен ввести пароль администратора, авторизация сохраняется на несколько минут +## null # Пробовать следующую пользовательскую функцию +## log # Сделать запись сообщения о событии в системном журнале +## # Сервис polkit перезапускается без параметра --no-debug +## # В параметре action передается объект с информацией о совершенном процессе и связанные с этим действием параметры +## # В параметре subject передается объект с информацией о пользователе, запустившем процесс. Этот объект имеет следующие атрибуты: +## # id — идентификатор процесса; +## # user — имя пользователя; +## # groups — список групп, в которые входит пользователь; +## # seat — местонахождение субъекта (пустое значение, если местонахождение не локальное); +## # session — сессия субъекта; +## # local — true, только если местонахождение имеет локальный характер; +## # active — true, только если сеанс активен. +## # Имена пользователей перечисленные через запятую +## <@group> # Имена групп перечисленные через запятую, перед именем группы ставится знак @ +## # Применять правило только для активных сейнсов +## # Применять правило только если местонахождение локальное +## +## POLKIT[org.freedesktop.udisks2.]=yes:@storage +## POLKIT[org.manjaro.pamac.]=yes:@wheel,user-1 +## POLKIT[com.ublinux.ubl-settings-datetime.run]=yes:@users:true:true +## POLKIT[org.manjaro.pamac.]=log +## POLKIT[com.ublinux.ubl-settings-kernel.run]=yes,log:@whell,user-1 +## POLKIT[org.debian.pcsc-lite.access_pcsc]="yes:@users" +## POLKIT[org.debian.pcsc-lite.access_card]="yes:@users" + exec_polkit(){ ## Настрока polkit правил + SYSTEMD_POLKIT_CONF_FILE="${ROOTFS}"/etc/systemd/system/polkit.service.d/ubconfig-59-polkit.conf + rm -f ${SYSTEMD_POLKIT_CONF_FILE} rm -f "${ROOTFS}"/etc/polkit-1/rules.d/ublinux-* + rm -f "${ROOTFS}"/etc/polkit-1/rules.d/100-ubconfig-* + local SYSTEMD_POLKIT_CONF_MAKE= if [[ -n ${POLKIT[@]} ]]; then for RULES in "${!POLKIT[@]}"; do - RULES_GROUP= - RULES_FILE="${ROOTFS}/etc/polkit-1/rules.d/ublinux-$(sed 's/\([[:alnum:]]*.[[:alnum:]]*.[[:alnum:]]*\)\..*/\1/' <<< ${RULES}).rules" - RULES_RESULT=$(cut -d: -f1 <<< ${POLKIT[${RULES}]}) - for GROUP in $(grep ":" <<< ${POLKIT[${RULES}]} | cut -d: -f2 | tr ',' '\n'); do - RULES_GROUP+="&& subject.isInGroup(\"${GROUP}\") " - done - cat >> ${RULES_FILE} <> ${OUT_RULES_FILE} </dev/null && return 0 + if [[ -z $@ ]]; then + while read -r FUNCTION; do + $"${FUNCTION##* }" + done < <(declare -F | grep "declare -f exec_") + else + FUNCTION= + while [[ $# -gt 0 ]]; do + #[[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1//\'/}'"; } + # Что-бы передавать пустые параметры как аргументы, нужно для соблюдения очередности и кол-ва, отключил [[ -z ${1} ]] || + declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1//\'/}'" + shift + done + eval ${FUNCTION#*; } + fi diff --git a/ublinux/rc.preinit/01-inifile b/ublinux/rc.preinit/01-inifile index 4ba7e8f..adeaa83 100755 --- a/ublinux/rc.preinit/01-inifile +++ b/ublinux/rc.preinit/01-inifile @@ -30,8 +30,9 @@ SYSCONF="${ROOTFS}${SYSCONF}" rm -rf ${SYSCONF}/{..?*,.[!.]*,*} 2>/dev/null ## Парсим файл ublinux.ini.gz и создаём конфигурацию системы в ${SYSCONF} - FILE_CONFIG="${SYSCONF}/config" - [[ -f ${FILE_CONFIG} ]] || install -Dm0644 /dev/null ${FILE_CONFIG} + FILE_CONFIG_DEFAULT="${SYSCONF}/config" + FILE_CONFIG="${FILE_CONFIG_DEFAULT}" + [[ -f ${FILE_CONFIG} ]] || install -Dm0644 /dev/null ${FILE_CONFIG} FILE_ROOT_USERS="${SYSCONF}/.users_credential" [[ -f ${FILE_ROOT_USERS} ]] || install -Dm0600 /dev/null ${FILE_ROOT_USERS} while read LINE; do @@ -39,6 +40,8 @@ SYSCONF="${ROOTFS}${SYSCONF}" FILE_CONFIG=${BASH_REMATCH[1]} FILE_CONFIG_MOD=${BASH_REMATCH[2]} FILE_CONFIG_EXEC=${BASH_REMATCH[4]} + # Если указана * то заменить на config + [[ ${FILE_CONFIG##*/} == "*" ]] && FILE_CONFIG="${FILE_CONFIG_DEFAULT}" # Если указан файл без пути, то добавить путь по умолчанию ${SYSCONF} [[ ${FILE_CONFIG} =~ ^"/" ]] && FILE_CONFIG="${ROOTFS}${FILE_CONFIG}" || FILE_CONFIG="${SYSCONF}/${FILE_CONFIG}" if [[ -n ${FILE_CONFIG_MOD} ]]; then diff --git a/ublinux/rc.preinit/08-prettyname b/ublinux/rc.preinit/08-prettyname index ade8548..eaf0136 100755 --- a/ublinux/rc.preinit/08-prettyname +++ b/ublinux/rc.preinit/08-prettyname @@ -25,7 +25,8 @@ exec_prettyname(){ PATH_VERSION=$(find /memory/layer-base/ -maxdepth 2 -type f -name "VERSION*" 2>/dev/null | tail -1) [[ -n ${PATH_VERSION} ]] || PATH_VERSION="$(find ${ROOTFS}/ -maxdepth 1 -type f -name "VERSION*" 2>/dev/null | tail -1)" [[ -n ${PATH_VERSION} ]] && OS_RELEASE_PRETTY_NAME=$(head -1 "${PATH_VERSION}" 2>/dev/null) - sed -e "\$a\OS_RELEASE_PRETTY_NAME=\"${OS_RELEASE_PRETTY_NAME}\"" -e '/OS_RELEASE_PRETTY_NAME=.*/d' -i ${SYSCONF}/config + sed '/OS_RELEASE_PRETTY_NAME=.*/d' -i ${SYSCONF}/config 2>/dev/null + echo "OS_RELEASE_PRETTY_NAME=\"${OS_RELEASE_PRETTY_NAME}\"" >> ${SYSCONF}/config } diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index e64de5f..e56d936 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -1473,7 +1473,8 @@ VERSION= ## auth_admin # Пользователь должен ввести пароль администратора при каждом запросе ## auth_admin_keep # Пользователь должен ввести пароль администратора, авторизация сохраняется на несколько минут ## null # Пробовать следующую пользовательскую функцию -## log # Только сделать запись сообщения о событии в системном журнале +## log # Сделать запись сообщения о событии в системном журнале +## # Сервис polkit перезапускается без параметра --no-debug ## # В параметре action передается объект с информацией о совершенном процессе и связанные с этим действием параметры ## # В параметре subject передается объект с информацией о пользователе, запустившем процесс. Этот объект имеет следующие атрибуты: ## # id — идентификатор процесса; @@ -1492,6 +1493,10 @@ VERSION= ## POLKIT[org.manjaro.pamac.]=yes:@wheel,user-1 ## POLKIT[com.ublinux.ubl-settings-datetime.run]=yes:@users:true:true ## POLKIT[org.manjaro.pamac.]=log +## POLKIT[com.ublinux.ubl-settings-kernel.run]=yes,log:@whell,user-1 +## POLKIT[org.debian.pcsc-lite.access_pcsc]="yes:@users" +## POLKIT[org.debian.pcsc-lite.access_card]="yes:@users" + [/etc/ublinux/kiosk] ## Настройка режима киоска