epm-desktop 5.52 KB
Newer Older
1
#!/bin/sh
2
# shellcheck disable=SC3043,SC2086
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# 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

20 21 22 23 24 25 26 27 28 29 30 31
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
}

32
is_de_exist() {
33
    local json_file="$(realpath $CONFIGDIR/desktop.d/$1.json)"
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
    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() {
53
    local json_file="$(realpath $CONFIGDIR/desktop.d/$1.json)"
54 55 56
    local key="$2"

    if [ "$key" = "description" ]; then
57
        epm --quiet tool json -b < "$json_file" | grep "\[\"$key\"" | xargs | sed 's/[",]//g' | cut -f2- -d ' '
58
    else
59
        epm --quiet tool json -b < "$json_file" | grep "\[\"$key\"" | awk '{print $2}' | sed 's/[",]//g' | xargs
60 61 62 63
    fi
}

get_repo_version() {
64 65
    local de_name=$1
    local package_name=$(get_value "$de_name" "dependencies" | awk '{print $1}')
66 67 68
    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" \
69
        | epm --quiet tool json -b 2> /dev/null | grep '"packages",0,"version"]' | awk '{print $2}' | tr -d '"')
70 71 72 73

    if [ -n "$latest_version" ]; then
        echo "$latest_version"
    else
74
        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/-.*//') 
75 76 77 78

        if [ -n "$latest_version" ]; then
            echo "$latest_version"
        else
79
            get_value "$de_name" "version"
80 81 82 83 84 85 86 87 88 89 90 91 92
        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
93

94 95
    message "Installing $de_name with dependencies: $dependencies"
    
96
    if epm install $dependencies; then
97
        run_script "$de_name-postin" $de_name || warning "Postinstall script for $de_name encountered an issue."
98 99
        message "$de_name successfully installed."
    else
100 101
        fatal "Failed to install $de_name."
        return 1
102
    fi
103

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
}

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
119
        run_script "$de_name-postun" $de_name || warning "Postuninstall script for $de_name encountered an issue." 
120 121
        message "$de_name successfully removed."
    else
122
        fatal "Failed to remove $de_name."
123 124 125 126 127 128 129 130
        return 1
    fi
}

get_de_info() {
    local de_name=$1
    message "   Information for $de_name:
    Name: $(get_value $de_name name)
131 132
    Version: $(get_repo_version $de_name)
    Installed: $(is_installed $de_name && echo 'true'|| echo 'false' )
133 134 135 136 137 138 139
    Description: $(get_value $de_name description)"
}

list_des() {
    if [ "$json" -eq 1 ]; then
        echo '['
        first=1
140
        for de in $CONFIGDIR/desktop.d/*.json; do
141 142 143 144 145
            if [ $first -eq 1 ]; then
                first=0
            else
                echo ','
            fi
146 147 148 149 150 151 152

            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"
        
153 154 155
        done
        echo ']'
    else
156
        for de in $CONFIGDIR/desktop.d/*.json; do
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
            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
}