You need to sign in or sign up before continuing.
epm-desktop 5.52 KB
#!/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
}