epm-assure 3.19 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2013-2016  Etersoft
# Copyright (C) 2013-2016  Vitaly Lipatov <lav@etersoft.ru>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#
# 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/>.
#

__check_command_in_path()
{
    PATH=$PATH:/sbin:/usr/sbin which "$1" 2>/dev/null
}

25
# returns TRUE if package version is omitted, or package is not installed, or version is too old
26 27 28 29 30
__epm_need_update()
{
    local PACKAGE="$1"
    local PACKAGEVERSION="$2"

31
    [ -n "$PACKAGEVERSION" ] || return 0
32 33 34 35 36 37 38

    load_helper epm-query
    is_installed "$PACKAGE" || return 0

    load_helper epm-print
    # epm print version for package N
    local INSTALLEDVERSION=$(query_package_field "version" "$PACKAGE")
39 40
    # if needed >= installed, return 0
    [ "$(compare_version "$PACKAGEVERSION" "$INSTALLEDVERSION")" -gt 0 ] && return 0
41 42 43 44

    return 1
}

45
__epm_assure_checking()
46
{
47 48 49
    local CMD="$1"
    local PACKAGE="$2"
    local PACKAGEVERSION="$3"
50 51

    [ -n "$PACKAGEVERSION" ] && return 1
52

53
    if is_dirpath "$CMD" ; then
Vitaly Lipatov's avatar
Vitaly Lipatov committed
54
        # TODO: check for /usr/bin, /bin, /usr/sbin, /sbin
55
        if [ -e "$CMD" ] ; then
56
            if [ -n "$verbose" ] ; then
57 58
                info "File or directory $CMD is already exists."
                epm qf "$CMD"
59
            fi
60
            return 0
61 62
        fi

Vitaly Lipatov's avatar
Vitaly Lipatov committed
63
        [ -n "$PACKAGE" ] || fatal "You need run with package name param when use with absolute path to non executable file"
64
        return 1
65 66
    fi

67
    if __check_command_in_path "$CMD" >/dev/null ; then
68 69
        if [ -n "$verbose" ] ; then
            local compath="$(__check_command_in_path "$1")"
70
            info "Command $CMD is exists: $compath"
71 72
            epm qf "$compath"
        fi
73
        return 0
74 75
    fi

76 77 78 79 80 81 82 83 84
    return 1
}

# Do fast checking for command and install package if the command does not exist

# $1 - command name
# $2 - [package name]
# $3 - [needed package version]

85
epm_assure()
86 87 88 89 90 91 92 93
{
    local CMD="$1"
    local PACKAGE="$2"
    local PACKAGEVERSION="$3"
    [ -n "$PACKAGE" ] || PACKAGE="$1"

    __epm_assure_checking $CMD $PACKAGE $PACKAGEVERSION && return 0

94
    info "Installing appropriate package for $CMD command..."
95 96
    __epm_need_update $PACKAGE $PACKAGEVERSION || return 0

97 98 99
    # can't be used in epm ei case
    #docmd epm --auto install $PACKAGE || return
    load_helper epm-install
100
    # TODO: HACK: DEBUG=1 for skip to_remove_pkg handling
101
    (DEBUG=1 repack='' non_interactive=1 pkg_names="$PACKAGE" pkg_files='' pkg_urls='' epm_install ) || return
102

103 104 105
    # no check if we don't need a version
    [ -n "$PACKAGEVERSION" ] || return 0

106 107 108
    # check if we couldn't update and still need update
    __epm_need_update $PACKAGE $PACKAGEVERSION && return 1
    return 0
109
}