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.
ublinux-init/ublinux/rc.desktop/all/autoexec

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