#!/bin/sh # shellcheck disable=SC3043,SC2086 # Copyright (C) 2024 Etersoft # Copyright (C) 2024 Ivan Mazhukin <vanomj@etersoft.ru> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. json=0 run_script() { local script="$CONFIGDIR/desktop.d/$1.sh" [ -s "$script" ] || return [ -f "$script.rpmnew" ] && warning 'There is .rpmnew file(s) in $psdir dir. The desktop script`s can be outdated.' shift [ "$PROGDIR" = "/usr/bin" ] && SCPATH="$PATH" || SCPATH="$PROGDIR:$PATH" ( unset EPMCURDIR ; export PATH=$SCPATH ; $script "$@" ) return } is_de_exist() { local json_file="$(realpath $CONFIGDIR/desktop.d/$1.json)" local de_name=$1 if [ -f "$json_file" ]; then return 0 else message "Error: Manifest for '$de_name' not found." exit 1 fi } is_installed() { local dependencies=$1 epm installed $dependencies > /dev/null 2>&1 return } get_value() { local json_file="$(realpath $CONFIGDIR/desktop.d/$1.json)" local key="$2" if [ "$key" = "description" ]; then epm --quiet tool json -b < "$json_file" | grep "\[\"$key\"" | xargs | sed 's/[",]//g' | cut -f2- -d ' ' else epm --quiet tool json -b < "$json_file" | grep "\[\"$key\"" | awk '{print $2}' | sed 's/[",]//g' | xargs fi } get_repo_version() { local de_name=$1 local package_name=$(get_value "$de_name" "dependencies" | awk '{print $1}') local latest_version latest_version=$(eget --quiet -O- "https://rdb.altlinux.org/api/package/package_info?name=$package_name&arch=x86_64&source=false&branch=sisyphus&full=false" \ | epm --quiet tool json -b 2> /dev/null | grep '"packages",0,"version"]' | awk '{print $2}' | tr -d '"') if [ -n "$latest_version" ]; then echo "$latest_version" else latest_version=$(epm --quiet info $package_name 2>/dev/null | grep 'Version' | grep -E '[0-9]+.[0-9]+(.[0-9]+)?' | awk '{print $NF}' | sed 's/-.*//') if [ -n "$latest_version" ]; then echo "$latest_version" else get_value "$de_name" "version" fi fi } install_de() { local de_name=$1 dependencies=$(get_value "$de_name" "dependencies") if is_installed "$dependencies"; then message "$de_name is already installed." return 0 fi message "Installing $de_name with dependencies: $dependencies" if epm install $dependencies; then run_script "$de_name-postin" $de_name || warning "Postinstall script for $de_name encountered an issue." message "$de_name successfully installed." else fatal "Failed to install $de_name." return 1 fi } remove_de() { local de_name=$1 dependencies=$(get_value "$de_name" "dependencies") if ! is_installed "$dependencies"; then message "$de_name is not installed." return 0 fi message "Removing $de_name with dependencies: $dependencies" if epm remove $dependencies; then run_script "$de_name-postun" $de_name || warning "Postuninstall script for $de_name encountered an issue." message "$de_name successfully removed." else fatal "Failed to remove $de_name." return 1 fi } get_de_info() { local de_name=$1 message " Information for $de_name: Name: $(get_value $de_name name) Version: $(get_repo_version $de_name) Installed: $(is_installed $de_name && echo 'true'|| echo 'false' ) Description: $(get_value $de_name description)" } list_des() { if [ "$json" -eq 1 ]; then echo '[' first=1 for de in $CONFIGDIR/desktop.d/*.json; do if [ $first -eq 1 ]; then first=0 else echo ',' fi de_name=$(basename $de .json) ver=$(get_repo_version $de_name) installed=$(is_installed $de_name && echo 'true' || echo 'false') cat "$de" | sed -E "s/\"version\": \"[0-9]+.[0-9]+(.[0-9]+)?\"/\"version\": \"$ver\"/g" | sed "s/\"installed\": false/\"installed\": ${installed}/g" done echo ']' else for de in $CONFIGDIR/desktop.d/*.json; do basename "$de" .json done fi } show_help() { message 'Usage: epm desktop [command] Commands: install [de_name] Install a desktop environment remove [de_name] Remove a desktop environment info [de_name] Get information about a desktop environment list List all available desktop environments' } epm_desktop() { case "$2" in --json) json=1 ;; esac case "$1" in install) is_de_exist "$2" install_de "$2" ;; remove) is_de_exist "$2" remove_de "$2" ;; info) is_de_exist "$2" get_de_info "$2" ;; list) list_des ;; *) show_help ;; esac }