You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.9 KiB
82 lines
2.9 KiB
#!/usr/bin/bash
|
|
#
|
|
# Author: Dmitry Razumov <asmeron@ublinux.com>
|
|
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
|
|
#
|
|
# 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
|
|
|