#!/usr/bin/bash # # Author: Dmitry Razumov # Copyright (c) 2021-2025 UBLinux # # SPDX-License-Identifier: AGPL-3.0-or-later # ENABLED=yes [[ ${ENABLED} == "yes" ]] || { return 0 2>/dev/null && return 0 || exit 0; } . /usr/lib/ublinux/functions . /usr/lib/ublinux/default SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/desktop; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null # ARG1: AUTOEXEC[user-1,@wheel]="xbindkeys;kde:yakuake;gnome:guake;xfce:plank.desktop,xterm;lxde:guake" exec_autoexec_set(){ local PARAM="$@" if [[ -n ${PARAM} ]]; then local AUTOEXEC= declare -A AUTOEXEC=() [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}" fi [[ -n ${AUTOEXEC[@]} ]] || return CURRENT_DE=$(get_de) for ITEM_UNIT in "${!AUTOEXEC[@]}"; do local IS_EXEC= while read USER_GROUP; do if [[ ${USER_GROUP} == 0 ]] \ || ( [[ ${USER_GROUP} =~ ^"@" ]] && getent group "${USER_GROUP//@/}" | grep -q "\b${USER}\b" ) \ || getent passwd "${USER_GROUP}" | grep -q ^"\b${USER}\b"; then IS_EXEC=yes fi done < <(echo "${ITEM_UNIT}" | tr ',; ' \\n) if [[ -n ${IS_EXEC} ]]; then while IFS= read -ru3 DE_CMD; do FIND_DE=${DE_CMD%%:*} FIND_CMD=${DE_CMD#*:} [[ ${FIND_DE} != ${FIND_CMD} && ${FIND_DE} != ${CURRENT_DE} ]] && continue [[ -z ${FIND_CMD} ]] || while IFS= read -ru4 EXEC_CMD; do cd ${HOME} if [[ ${EXEC_CMD} =~ ".desktop"$ ]]; then bash -c "$(grep '^Exec' $(find /usr/share/applications ~/local/share/applications -iname ${EXEC_CMD} 2>/dev/null | tail -1) | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')" & #echo "bash -c $(grep '^Exec' $(find /usr/share/applications ~/local/share/applications -iname ${EXEC_CMD} 2>/dev/null | tail -1) | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g') &" elif [[ ${EXEC_CMD} =~ (".service"|".socket"|".target"|".timer")$ ]]; then if [[ $(readlink -fq /usr/bin/init 2>/dev/null) =~ "lib/systemd/systemd"$ ]]; then systemctl --user start ${EXEC_CMD} fi else bash -c "${EXEC_CMD}" & #echo "bash -c ${EXEC_CMD} &" fi done 4< <(echo "${FIND_CMD}" | tr ',' \\n) done 3< <(echo "${AUTOEXEC[${ITEM_UNIT}]}" | tr ';' \\n) fi done } # ARG1: AUTOEXEC[superadmin]= exec_autoexec_remove(){ PARAM="$@" [[ -n ${PARAM} ]] && ITEM_UNIT=${PARAM#*[} && ITEM_UNIT=${ITEM_UNIT%%]*} || return 0 [[ -n ${ITEM_UNIT} ]] || return 0 } ################ ##### MAIN ##### ################ if [[ -z $@ || $1 == @("set="|"set+="|"set++=") ]]; then shift exec_autoexec_set $@ KERNEL_AUTOEXEC="$(cmdline_value autoexec)" [[ -n ${KERNEL_AUTOEXEC} ]] && exec_autoexec_set AUTOEXEC="${KERNEL_AUTOEXEC}" elif [[ $1 == @("set-="|"set--="|"remove") ]]; then shift exec_autoexec_remove $@ fi