epm-simulate 5.07 KB
Newer Older
1 2
#!/bin/sh
#
Vitaly Lipatov's avatar
Vitaly Lipatov committed
3 4
# Copyright (C) 2012-2015, 2018  Etersoft
# Copyright (C) 2012-2015, 2018  Vitaly Lipatov <lav@etersoft.ru>
5
#
6 7 8
# 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
9 10 11 12 13
# (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
14
# GNU Affero General Public License for more details.
15
#
16 17
# 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/>.
18 19
#

20
load_helper epm-install
21
load_helper epm-search
22

23 24 25
# for zypper before SUSE/11.0
__use_zypper_dry_run()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
26
    a='' zypper install --help 2>&1 | grep -q -- "--dry-run" && echo "--dry-run"
27 28
}

29 30
__use_yum_assumeno()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
31
    a='' yum --help 2>&1 | grep -q -- "--assumeno"
32 33
}

34 35 36

__check_yum_result()
{
37 38 39
    grep -q "^No package" $1 && return 1
    grep -q "^Complete!" $1 && return 0
    grep -q "Exiting on user [Cc]ommand" $1 && return 0
40
    # dnf issue
41
    grep -q "^Operation aborted." $1 && return 0
42 43 44 45
    # return default result by default
    return $2
}

46 47
__check_pacman_result()
{
48 49 50
    grep -q "^error: target not found:" $1 && return 1
    grep -q "^Total Installed Size:" $1 && return 0
    grep -q "^Total Download Size:" $1 && return 0
51 52 53 54
    # return default result by default
    return $2
}

55

56
_epm_do_simulate()
57
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
58
    local CMD
59
    local RES=0
Vitaly Lipatov's avatar
Vitaly Lipatov committed
60
    local filenames="$*"
61

Vitaly Lipatov's avatar
Vitaly Lipatov committed
62
    case $PMTYPE in
63 64 65 66 67 68 69
        apt-rpm|apt-dpkg)
            CMD="apt-get --simulate install"
            ;;
        aptitude-dpkg)
            CMD="aptitude -s install"
            ;;
        yum-rpm)
70
            set_sudo
71 72 73 74 75
            if __use_yum_assumeno ; then
                store_output sudocmd yum --assumeno install $filenames
                __check_yum_result $RC_STDOUT $?
            else
                store_output sudocmd yum install $filenames <<EOF
Vitaly Lipatov's avatar
Vitaly Lipatov committed
76 77
n
EOF
78 79 80 81 82 83
                __check_yum_result $RC_STDOUT $?
            fi
            RES=$?
            clean_store_output
            return $RES ;;
        dnf-rpm)
84
            set_sudo
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
            store_output sudocmd dnf --assumeno install $filenames
            __check_yum_result $RC_STDOUT $?
            RES=$?
            clean_store_output
            return $RES ;;
        urpm-rpm)
            CMD="urpmi --test --auto"
            ;;
        eopkg)
            CMD="eopkg --dry-run install"
            ;;
        zypper-rpm)
            if ! __use_zypper_dry_run >/dev/null ; then
                fatal "zypper is too old: does not support --dry-run"
            fi
            CMD="zypper --non-interactive install --dry-run"
            ;;
        emerge)
            local res=0
            for pkg in $filenames ; do
            is_installed $pkg && continue
            docmd emerge --pretend $pkg && continue
            pkg=1
            break
            done
            return $res ;;
        opkg)
            docmd --noaction install $filenames
            return $res ;;
        pacman)
115
            set_sudo
116
            store_output sudocmd pacman -v -S $filenames <<EOF
Vitaly Lipatov's avatar
Vitaly Lipatov committed
117 118
no
EOF
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
            __check_pacman_result $RC_STDOUT $?
            RES=$?
            clean_store_output
            return $RES ;;
        slackpkg)
            #docmd /usr/sbin/slackpkg -batch=on -default_answer=yes download
            # just try search every package
            # FIXME: epm_search have to return false status code if the package does not found
            local pkg res
            res=0
            for pkg in $filenames ; do
                # FIXME: -[0-0] does not work in search!
                # FIXME: we need strict search here (not find gst-plugins-base if search for gst-plugins
                # TODO: use short?
                # use verbose for get package status
                #pkg_filenames="$pkg-[0-9]" verbose=--verbose __epm_search_internal | grep -E "(installed|upgrade)" && continue
                #pkg_filenames="$pkg" verbose=--verbose __epm_search_internal | grep -E "(installed|upgrade)" && continue
136
                __epm_search_internal "$pkg" | grep -q "^$pkg-[0-9]" && continue
137 138 139 140 141
                res=1
                info "Package '$pkg' does not found in repository."
            done
            return $res ;;
        *)
142
            fatal 'Have no suitable simulate command for $PMTYPE'
143
            ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
144 145
    esac

146
    sudocmd $CMD $filenames
147 148
}

149 150
epm_simulate()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
151
    [ -z "$pkg_filenames" ] && info "Simulate: skipped due empty list" && return 22
152 153 154

    local filenames="$(echo $pkg_filenames | filter_out_installed_packages)"

Vitaly Lipatov's avatar
Vitaly Lipatov committed
155
    [ -z "$filenames" ] && info "Simulate: All packages are already installed" && return 0
156 157 158 159

    _epm_do_simulate $filenames
    local RES=$?
    if [ -z "$quiet" ] ; then
Vitaly Lipatov's avatar
Vitaly Lipatov committed
160
        if [ "$RES" = 0 ] ; then
161
            info 'Simulate result: $filenames package(s) CAN BE installed'
Vitaly Lipatov's avatar
Vitaly Lipatov committed
162 163 164
        else
            info "Simulate result: There are PROBLEMS with install some package(s)"
        fi
165 166 167 168
    fi
    return $RES
}