epm-checkpkg 3.7 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2009, 2012, 2013, 2014, 2016, 2018, 2022  Etersoft
# Copyright (C) 2009, 2012, 2013, 2014, 2016, 2018, 2022  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 15 16 17
# 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/>.
18 19
#

20 21 22 23 24 25
# changed since rpm 4.0.4
__rpm_allows_nosignature()
{
    a= rpm --help | grep -q -- "--nosignature"
}

26 27
check_pkg_integrity()
{
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    local PKG="$1"
    local RET
    local NOSIGNATURE

    case $(get_package_type $PKG) in
    rpm)
        assure_exists rpm
        __rpm_allows_nosignature && NOSIGNATURE="--nosignature" || NOSIGNATURE="--nogpg"
        docmd rpm --checksig $NOSIGNATURE $PKG
        ;;
    deb)
        assure_exists dpkg
        # FIXME: debsums -ca package ?
        docmd dpkg --contents $PKG >/dev/null && echo "Package $PKG is correct."
        ;;
43 44 45
    apk)
        docmd apkg verify $PKG
        ;;
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
    exe)
        file $PKG | grep -q "executable for MS Windows"
        ;;
    msi)
        # TODO: add to patool via cabextract
        assure_exists cabextract
        #file $PKG | grep -q "Microsoft Office Document"
        docmd cabextract -t $PKG
        ;;
    ebuild)
        true
        ;;
    *)
        docmd erc test "$PKG" && return
        ;;
    esac
62 63
}

64 65
__epm_check_all_pkgs()
{
66
case $PMTYPE in
67 68 69 70
    eopkg)
        sudocmd eopkg check
        return
        ;;
71 72
esac

73 74 75 76 77 78 79 80 81 82 83 84
    local j cl
    #local play_installed="$(epm play --list-installed-packages)"
    epm qa --short | xargs -n20 | while read cl ; do
        #cl="$(estrlist exclude "$play_installed" "$i")"
        __epm_check_installed_pkg $cl && continue
        # check each package
        for j in $cl ; do
            __epm_check_installed_pkg $j && continue
            # TODO: check play installed too
            epm --auto reinstall $j </dev/null || exit
        done
    done
85 86
}

87 88 89
__epm_check_installed_pkg()
{
case $PMTYPE in
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
    *-rpm)
        docmd rpm -V $@
        ;;
    *-dpkg)
        assure_exists debsums
        docmd debsums $@
        ;;
    emerge)
        assure_exists equery
        docmd equery check $@
        ;;
    eopkg)
        sudocmd eopkg check $@
        ;;
    *)
        fatal "Have no suitable command for $PMTYPE"
        ;;
107 108 109 110
esac

}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
111 112

epm_checkpkg()
113
{
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
    if [ "$1" = "--all" ] ; then
        __epm_check_all_pkgs
        return
    fi

    if [ -n "$pkg_names" ] ; then
        # TODO: если есть / или расширение, это отсутствующий файл
        info "Suggest $pkg_names are name(s) of installed package(s)"
        __epm_check_installed_pkg $pkg_names
        return
    fi

    # if possible, it will put pkg_urls into pkg_files or pkg_names
    if [ -n "$pkg_urls" ] ; then
        load_helper epm-download
        __handle_pkg_urls_to_checking
    fi

    [ -n "$pkg_files" ] || fatal "Checkpkg: filename(s) is missed"

    local RETVAL=0

    local pkg
    for pkg in $pkg_files ; do
        check_pkg_integrity $pkg || RETVAL=1
    done

    # TODO: reinvent
    [ -n "$to_remove_pkg_files" ] && rm -fv $to_remove_pkg_files
    [ -n "$to_remove_pkg_files" ] && rmdir -v $(dirname $to_remove_pkg_files | head -n1) 2>/dev/null

    #fatal "Broken package $pkg"
    return $RETVAL
147
}