#!/bin/sh # # Copyright (C) 2015, 2017, 2019, 2020, 2022 Etersoft # Copyright (C) 2015, 2017, 2019, 2020, 2022 Vitaly Lipatov <lav@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/>. # # TODO epm_vardir=/var/lib/eepm __check_installed_app() { [ -s $epm_vardir/installed-app ] || return 1 grep -q -- "^$1\$" $epm_vardir/installed-app } __save_installed_app() { [ -d "$epm_vardir" ] || return 0 __check_installed_app "$1" && return 0 echo "$1" | sudorun tee -a $epm_vardir/installed-app >/dev/null } __remove_installed_app() { [ -s $epm_vardir/installed-app ] || return 0 local i for i in $* ; do sudorun sed -i "/^$i$/d" $epm_vardir/installed-app done return 0 } __is_app_installed() { __run_script "$1" --installed "$2" return } __run_script() { local script="$psdir/$1.sh" [ -x "$script" ] || return [ -f "$script.rpmnew" ] && warning "There is .rpmnew file(s) in $psdir dir. The play script can be outdated." shift ( unset EPMCURDIR ; export PATH=$PROGDIR:$PATH ; $script "$@" ) return } __get_app_package() { __run_script "$1" --package-name "$2" 2>/dev/null } __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 } __list_all_packages() { local name for name in $(__list_all_app) ; do __get_app_package $name done } # pkg app __list_app_packages_table() { local name for name in $(__list_all_app) ; do local pkg="$(__get_app_package $name)" [ -n "$pkg" ] || continue echo "$pkg $name" done } __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 return cat $epm_vardir/installed-app 2>/dev/null } __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 } # args: script, host arch __get_app_description() { __run_script "$1" --description "$2" 2>/dev/null } __check_play_script() { local script="$psdir/$1.sh" shift [ -x "$script" ] } __epm_play_run() { local script="$psdir/$1.sh" shift export PATH=$PROGDIR:$PATH set_sudo export SUDO # keep EPM_AUTO for non epm code (epm uses EPM_OPTIONS now) [ -n "$non_interactive" ] && export EPM_AUTO="--auto" local bashopt='' [ -n "$verbose" ] && bashopt='-x' #info "Running $($script --description 2>/dev/null) ..." docmd $CMDSHELL $bashopt $script "$@" } __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:" for i in $(__list_installed_app) ; do local desc="$(__get_app_description $i)" #[ -n "$desc" ] || continue [ -n "$quiet" ] || echo -n " " printf "%-20s - %s\n" "$i" "$desc" done } __epm_play_list() { local psdir="$1" local extra="$2" local i local IGNOREi586 local arch="$($DISTRVENDOR -a)" [ "$arch" = "x86_64" ] && IGNOREi586='' || IGNOREi586=1 if [ -n "$short" ] ; then for i in $(__list_all_app) ; do local desc="$(__get_app_description $i $arch)" [ -n "$desc" ] || continue echo "$i" if [ -n "$extra" ] ; then for j in $(__run_script "$i" "--product-alternatives") ; do echo " $i $j" done fi done exit fi for i in $(__list_all_app) ; do local desc="$(__get_app_description $i $arch)" [ -n "$desc" ] || continue [ -n "$quiet" ] || echo -n " " printf "%-20s - %s\n" "$i" "$desc" if [ -n "$extra" ] ; then for j in $(__run_script "$i" "--product-alternatives") ; do printf " %-20s - %s\n" "$i $j" "$desc" done fi done } 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 --list-scripts - list all available scripts --short (with --list) - list names only --installed <app> - check if the app is installed --product-alternatives- list alternatives (use like epm play app=beta) Examples: epm play --remove opera epm play yandex-browser = beta epm play telegram = beta epm play telegram = 4.7.1 EOF } __epm_play_remove() { local prescription for prescription in $* ; do 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 done } __epm_play_update() { local i RES local CMDUPDATE="$1" shift RES=0 for i in $* ; do echo echo "$i" if ! __is_app_installed "$i" ; then warning "$i is not installed" continue fi prescription="$i" 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." RES=1 continue fi __epm_play_run $prescription $CMDUPDATE || RES=$? done return $RES } # name argument __epm_play_install_one() { local prescription="$1" shift if __check_play_script "$prescription" ; then #__is_app_installed "$prescription" && info "$$prescription is already installed (use --remove to remove)" && exit 1 __epm_play_run "$prescription" --run "$@" && __save_installed_app "$prescription" || fatal "There was some error during install the application." else opsdir=$psdir psdir=$prsdir __check_play_script "$prescription" || fatal "We have no idea how to play $prescription (checked in $opsdir and $prsdir)" __epm_play_run "$prescription" --run "$@" || fatal "There was some error during run $prescription script." fi } __epm_play_install() { local i RES RES=0 load_helper epm-check_updated_repo update_repo_if_needed # get all options options='' for i in $* ; do case "$i" in --*) options="$options $i" ;; esac done while [ -n "$1" ] ; do case "$1" in --*) shift continue ;; esac local p="$1" local v='' n="$(echo $2)" if [ "$n" = "=" ] ; then v="$3" shift 3 else shift fi __epm_play_install_one $p $v $options || RES=1 done return $RES } epm_play() { [ "$EPMMODE" = "package" -o "$EPMMODE" = "git" ] || fatal "epm play is not supported in single file mode" local psdir="$(realpath $CONFIGDIR/play.d)" local prsdir="$(realpath $CONFIGDIR/prescription.d)" if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then epm_play_help exit fi if [ "$1" = "--ipfs" ] ; then shift if [ -d "$(dirname "$epm_ipfs_db")" ] ; then export EGET_IPFS_DB="$eget_ipfs_db" if [ ! -r "$EGET_IPFS_DB" ] ; then sudorun touch "$EGET_IPFS_DB" >&2 sudorun chmod -v a+rw "$EGET_IPFS_DB" >&2 # get initial db from server local URL="https://eepm.ru/app-versions" info "Initialize IPFS DB in $EGET_IPFS_DB file and fill it with data from $URL/eget-ipfs-db.txt" docmd eget -q -O $EGET_IPFS_DB "$URL/eget-ipfs-db.txt" fi else warning "ipfs db dir $eget_ipfs_db is not exists, skipping --ipfs" fi fi if [ "$1" = "--remove" ] || [ "$1" = "remove" ] ; then shift __epm_play_remove "$@" exit fi if [ "$1" = "--update" ] ; then shift local CMDUPDATE="--update" [ -n "$force" ] && CMDUPDATE="--run" if [ -z "$1" ] ; then fatal "run --update with 'all' or a project name" fi local list if [ "$1" = "all" ] ; then shift list="$(__list_installed_app)" else list="$*" fi __epm_play_update $CMDUPDATE $list exit fi if [ "$1" = "--installed" ] || [ "$1" = "installed" ] ; then shift __is_app_installed "$1" "$2" #[ -n "$quiet" ] && exit exit fi case "$1" in # internal options "--installed-version"|"--package-name"|"--product-alternatives") __run_script "$2" "$1" "$3" exit ;; "--list-installed-packages") __list_installed_packages exit ;; "--list"|"--list-installed"|"list"|"list-installed") __epm_play_list_installed exit ;; # internal options "--help"|"help") __run_script "$2" "$1" "$3" exit ;; esac if [ "$1" = "--full-list-all" ] ; then [ -n "$short" ] || [ -n "$quiet" ] || echo "Available applications (for current arch $($DISTRVENDOR -a)):" __epm_play_list $psdir extra exit fi if [ "$1" = "--list-all" ] || [ "$1" = "list-all" ] || [ -z "$*" ] ; then [ -n "$short" ] || [ -n "$quiet" ] || echo "Available applications (for current arch $($DISTRVENDOR -a)):" __epm_play_list $psdir [ -n "$quiet" ] || [ -n "$*" ] && exit echo #echo "Run epm play --help for help" epm_play_help exit fi if [ "$1" = "--list-scripts" ] || [ "$1" = "list-scripts" ] ; then [ -n "$short" ] || [ -n "$quiet" ] || echo "Run with a name of a play script to run:" __epm_play_list $prsdir exit fi __epm_play_install $(echo "$*" | sed -e 's|=| = |g') }