epm-simulate 5 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 70 71 72 73 74
        apt-rpm|apt-dpkg)
            CMD="apt-get --simulate install"
            ;;
        aptitude-dpkg)
            CMD="aptitude -s install"
            ;;
        yum-rpm)
            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
75 76
n
EOF
77 78 79 80 81 82 83 84 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
                __check_yum_result $RC_STDOUT $?
            fi
            RES=$?
            clean_store_output
            return $RES ;;
        dnf-rpm)
            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)
            store_output sudocmd pacman -v -S $filenames <<EOF
Vitaly Lipatov's avatar
Vitaly Lipatov committed
114 115
no
EOF
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
            __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
133
                __epm_search_internal "$pkg" | grep -q "^$pkg-[0-9]" && continue
134 135 136 137 138 139 140
                res=1
                info "Package '$pkg' does not found in repository."
            done
            return $res ;;
        *)
            fatal "Have no suitable simulate command for $PMTYPE"
            ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
141 142
    esac

143
    sudocmd $CMD $filenames
144 145
}

146 147
epm_simulate()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
148
    [ -z "$pkg_filenames" ] && info "Simulate: Skip empty list" && return 22
149 150 151

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

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

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