epm-play 8.17 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2015, 2017, 2019, 2020, 2022  Etersoft
# Copyright (C) 2015, 2017, 2019, 2020, 2022  Vitaly Lipatov <lav@etersoft.ru>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#
# 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/>.
#

# TODO
epm_vardir=/var/lib/eepm

23

24 25 26 27 28 29
__check_installed_app()
{
	[ -s $epm_vardir/installed-app ] || return 1
	grep -q -- "^$1\$" $epm_vardir/installed-app
}

30 31 32
__save_installed_app()
{
	[ -d "$epm_vardir" ] || return 0
33
	__check_installed_app "$1" && return 0
34
	echo "$1" | sudorun tee -a $epm_vardir/installed-app >/dev/null
35 36 37 38
}

__remove_installed_app()
{
39
	[ -s $epm_vardir/installed-app ] || return 0
40 41
	local i
	for i in $* ; do
42
		sudorun sed -i "/^$i$/d" $epm_vardir/installed-app
43 44 45 46
	done
	return 0
}

47 48 49 50 51 52 53

__is_app_installed()
{
	__run_script "$1" --installed "$2"
	return
}

54
__run_script()
55
{
56 57
	local script="$psdir/$1.sh"
	[ -x "$script" ] || return
58 59
	shift
	$script "$@"
60
	return
61
}
62

63 64 65
__get_app_package()
{
	__run_script "$1" --package-name "$2" 2>/dev/null
66 67
}

68

69

70 71 72 73 74 75 76 77 78 79
__list_all_app()
{
    for i in $psdir/*.sh ; do
       local name=$(basename $i .sh)
       [ -n "$IGNOREi586" ] && rhas "$name" "^i586-" && continue
       rhas "$name" "^common" && continue
       echo "$name"
    done
}

80 81 82 83 84 85 86 87 88 89
__list_all_packages()
{
    local name
    for name in $(__list_all_app) ; do
        __get_app_package $name
    done
}

# pkg app
__list_app_packages_table()
90
{
91 92
    local name
    for name in $(__list_all_app) ; do
93 94 95
        local pkg="$(__get_app_package $name)"
        [ -n "$pkg" ] || continue
        echo "$pkg $name"
96
    done
97 98 99 100 101 102 103 104 105 106 107 108
}

__list_installed_app()
{
    local i
    local tapt=$(mktemp) || fatal
    __list_app_packages_table >$tapt
    # get all installed packages and convert it to a apps list
    for i in $(epm query --short $(cat $tapt | sed -e 's| .*$||') 2>/dev/null) ; do
        grep "^$i " $tapt | sed -e 's|^.* ||'
    done
    rm -f $tapt
109
    return
110

111 112 113
    cat $epm_vardir/installed-app 2>/dev/null
}

114 115 116 117 118 119 120 121 122 123 124 125
__list_installed_packages()
{
    local i
    local tapt=$(mktemp) || fatal
    __list_app_packages_table >$tapt
    # get all installed packages and convert it to a apps list
    for i in $(epm query --short $(cat $tapt | sed -e 's| .*$||') 2>/dev/null) ; do
        grep "^$i " $tapt | cut -f1 -d" "
    done
    rm -f $tapt
}

126

127 128
__get_app_description()
{
129
    __run_script "$1" --description 2>/dev/null
130
}
131

132
__check_play_script()
133 134 135 136
{
    local script="$psdir/$1.sh"
    shift

137 138 139 140 141 142 143 144
    [ -x "$script" ]
}


__epm_play_run()
{
    local script="$psdir/$1.sh"
    shift
145

146 147
    # TODO: use epm print info instead of one?
    # we will have DISTRVENDOR there
148 149
    export PATH=$PROGDIR:$PATH

150
    set_sudo
151 152
    export SUDO

153 154
    [ -n "$non_interactive" ] && export EPM_AUTO="--auto"

155 156
    local bashopt=''
    [ -n "$verbose" ] && bashopt='-x' && export EPM_VERBOSE="$verbose"
157
    #info "Running $($script --description 2>/dev/null) ..."
158
    docmd bash $bashopt $script "$@"
159 160
}

161 162 163 164 165 166 167 168 169 170
__epm_play_list_installed()
{
    local i
    if [ -n "$short" ] ; then
        for i in $(__list_installed_app) ; do
            echo "$i"
        done
        exit
    fi
    [ -n "$quiet" ] || echo "Installed applications:"
171 172
    for i in $(__list_installed_app) ; do
        local desc="$(__get_app_description $i)"
173
        #[ -n "$desc" ] || continue
174 175 176 177 178 179 180 181 182 183 184 185 186 187
        [ -n "$quiet" ] || echo -n "  "
        printf "%-20s - %s\n" "$i" "$desc"
    done
}


__epm_play_list()
{
    local psdir="$1"
    local i
    local IGNOREi586
    [ "$($DISTRVENDOR -a)" = "x86_64" ] && IGNOREi586='' || IGNOREi586=1

    if [ -n "$short" ] ; then
188
        for i in $(__list_all_app) ; do
189 190
            local desc="$(__get_app_description $i)"
            [ -n "$desc" ] || continue
191
            echo "$i"
192 193 194
        done
        exit
    fi
195
    for i in $(__list_all_app) ; do
196 197 198
        local desc="$(__get_app_description $i)"
        [ -n "$desc" ] || continue
        [ -n "$quiet" ] || echo -n "  "
199
        printf "%-20s - %s\n" "$i" "$desc"
200 201 202 203
    done
}


204 205 206 207 208 209 210 211 212 213
__epm_play_help()
{
    cat <<EOF
Usage: epm play [options] [<app>]
Options:
    <app>                 - install <app>
    --remove <app>        - uninstall <app>
    --update [<app>|all]  - update <app> (or all installed apps) if there is new version
    --list                - list all installed apps
    --list-all            - list all available apps
214
    --list-scripts        - list all available scripts
215 216 217 218 219
    --short (with --list) - list names only"
    --installed <app>     - check if the app is installed"
EOF
}

220 221
epm_play()
{
222
local psdir="$(realpath $CONFIGDIR/play.d)"
223
local prsdir="$(realpath $CONFIGDIR/prescription.d)"
224 225

if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
226
    __epm_play_help
227 228 229
    exit
fi

230

231
if [ "$1" = "--remove" ] || [ "$1" = "remove" ]  ; then
232
    shift
233 234
    prescription="$1"
    shift
235 236 237 238 239 240 241 242
    if __check_play_script "$prescription" ; then
        __epm_play_run $prescription --remove "$@"
        __remove_installed_app "$prescription"
    else
        psdir=$prsdir
        __check_play_script "$prescription" || fatal "We have no idea how to remove $prescription (checked in $psdir and $prsdir)"
        __epm_play_run "$prescription" --remove "$@" || fatal "There was some error during run the script."
    fi
243 244 245
    exit
fi

246

247 248
if [ "$1" = "--update" ] ; then
    shift
249 250
    local CMDUPDATE="--update"
    [ -n "$force" ] && CMDUPDATE="--run"
251 252
    if [ "$1" = "all" ] ; then
        shift
253
        RES=0
254
        for i in $(__list_installed_app) ; do
255
            echo
256 257
            echo "$i"
            prescription="$i"
258 259
            if ! __check_play_script $prescription ; then
                warning "Can't find executable play script for $prescription. Try epm play --remove $prescription if you don't need it anymore."
260
                RES=1
261 262
                continue
            fi
263
            __epm_play_run $prescription $CMDUPDATE "$@" || RES=$?
264
        done
265
        exit $RES
266
    fi
267
    if [ -z "$1" ] ; then
268
        fatal "run --update with 'all' or a project name"
269
    fi
270
    __is_app_installed "$1" || fatal "$1 is not installed"
271 272
    prescription="$1"
    shift
273
    __epm_play_run $prescription $CMDUPDATE "$@"
274 275 276
    exit
fi

277
if [ "$1" = "--installed" ] || [ "$1" = "installed" ]  ; then
278
    shift
279
    __is_app_installed "$1" "$2"
280
    #[ -n "$quiet" ] && exit
281 282
    exit
fi
283

284
case "$1" in
285
    # internal options
286 287 288 289
    "--installed-version"|"--package-name"|"--product-alternatives")
        __run_script "$2" "$1" "$3"
        exit
        ;;
290 291 292 293 294 295 296 297 298
    "--list-installed-packages")
        __list_installed_packages
        exit
        ;;
    "--list"|"--list-installed"|"list"|"list-installed")
        __epm_play_list_installed
        exit
        ;;
    # internal options
299 300 301 302 303
    "--help"|"help")
        __run_script "$2" "$1" "$3"
        exit
        ;;
esac
304

305
if [ "$1" = "--list-all" ] || [ "$1" = "list-all" ] || [ -z "$*" ] ; then
306 307
    [ -n "$short" ] || [ -n "$quiet" ] || echo "Available applications:"
    __epm_play_list $psdir
308
    [ -n "$quiet" ] || [ -n "$*" ] && exit
309
    echo
310 311
    #echo "Run epm play --help for help"
    __epm_play_help
312 313 314
    exit
fi

315
if [ "$1" = "--list-scripts" ] || [ "$1" = "list-scripts" ] ; then
316 317 318 319 320
    [ -n "$short" ] || [ -n "$quiet" ] || echo "Run with a name of a play script to run:"
    __epm_play_list $prsdir
    exit
fi

321 322 323
prescription="$1"
shift

324
if __check_play_script "$prescription" ; then
325
    #__is_app_installed "$prescription" && info "$$prescription is already installed (use --remove to remove)" && exit 1
326 327 328 329 330 331
    __epm_play_run "$prescription" --run "$@" && __save_installed_app "$prescription" || fatal "There was some error during install the application."
else
    psdir=$prsdir
    __check_play_script "$prescription" || fatal "We have no idea how to play $prescription (checked in $psdir and $prsdir)"
    __epm_play_run "$prescription" --run "$@" || fatal "There was some error during run the script."
fi
332
}