#!/bin/sh # # Copyright (C) 2012-13 Etersoft # Copyright (C) 2012-13 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/>. # load_helper epm-query # TODO: use when run install with epm --skip-installed install filter_out_installed_packages() { [ -z "$skip_installed" ] && cat && return case $PKGFORMAT in "rpm") LANG=C LC_ALL=C xargs -n1 rpm -q 2>&1 | grep 'is not installed' | sed -e 's|^.*package \(.*\) is not installed.*|\1|g' ;; "deb") LANG=C LC_ALL=C xargs -n1 dpkg -l 2>&1 | grep 'no packages found matching' | sed -e 's|^.*no packages found matching \(.*\)|\1|g' ;; *) for i in $(cat) ; do is_installed $i || echo $i done ;; esac | sed -e "s|rpm-build-altlinux-compat[^ ]*||g" | filter_strip_spaces } # copied from etersoft-build-utils/share/eterbuild/functions/rpmpkg epm_install_names() { if [ -n "$non_interactive" ] ; then epm_ni_install_names "$@" return fi [ -z "$1" ] && return case $PMTYPE in apt-rpm|apt-dpkg) sudocmd apt-get $APTOPTIONS install $@ return ;; deepsolver-rpm) sudocmd ds-install $@ return ;; urpm-rpm) sudocmd urpmi $URPMOPTIONS $@ return ;; pkgsrc) sudocmd pkg_add -r $@ return ;; emerge) sudocmd emerge -uD $@ return ;; pacman) sudocmd pacman -S $force $nodeps $@ return ;; yum-rpm) sudocmd yum $YUMOPTIONS install $@ return ;; dnf-rpm) sudocmd dnf install $@ return ;; zypper-rpm) sudocmd zypper install $ZYPPEROPTIONS $@ return ;; mpkg) sudocmd mpkg install $@ return ;; slackpkg) separate_installed $@ # TODO: use upgrade if package is already installed [ -n "$pkg_noninstalled" ] && sudocmd /usr/sbin/slackpkg install $pkg_noninstalled [ -n "$pkg_installed" ] && sudocmd /usr/sbin/slackpkg upgrade $pkg_installed return ;; homebrew) separate_installed $@ [ -n "$pkg_noninstalled" ] && sudocmd brew install $pkg_noninstalled [ -n "$pkg_installed" ] && sudocmd brew upgrade $pkg_installed return ;; ipkg) [ -n "$force" ] && force=-force-depends sudocmd ipkg $force install $@ return ;; *) fatal "Do not known install command for $PMTYPE" ;; esac } # Non interactive install epm_ni_install_names() { [ -z "$1" ] && return case $PMTYPE in apt-rpm|apt-dpkg) sudocmd apt-get -y --force-yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" $APTOPTIONS install $@ return ;; yum-rpm) sudocmd yum -y $YUMOPTIONS install $@ return ;; urpm-rpm) sudocmd urpmi --auto $URPMOPTIONS $@ return ;; zypper-rpm) # FIXME: returns true ever no package found, need check for "no found", "Nothing to do." yes | sudocmd zypper --non-interactive $ZYPPEROPTIONS install $@ return ;; pkgsrc) sudocmd pkg_add -r $@ return ;; pacman) sudocmd pacman -S --noconfirm $force $nodeps $@ return ;; npackd) # npackdcl update --package=<package> (remove old and install new) docmd npackdcl add --package=$@ return ;; chocolatey) docmd chocolatey install $@ return ;; ipkg) sudocmd ipkg -force-defaults install $@ return ;; slackpkg) # TODO: use upgrade if package is already installed sudocmd /usr/sbin/slackpkg -batch=on -default_answer=yes install $@ return ;; *) fatal "Do not known appropriate install command for $PMTYPE" ;; esac } epm_install_files() { [ -z "$1" ] && return case $PMTYPE in apt-rpm) sudocmd rpm -Uvh $force $nodeps $@ && return # TODO: check for "is already installed" # if run with --nodeps, do not fallback on hi level [ -n "$nodeps" ] && return # use install_names ;; apt-dpkg) # the new version of the conf. file is installed with a .dpkg-dist suffix if [ -n "$non_interactive" ] ; then DPKGOPTIONS="--force-confdef --force-confold" fi sudocmd dpkg $DPKGOPTIONS -i $@ # if run with --nodeps, do not fallback on hi level [ -n "$nodeps" ] && return # fall to apt-get -f install for fix deps # can't use APTOPTIONS with empty install args epm_install_names -f return ;; yum-rpm|dnf-rpm) sudocmd rpm -Uvh $force $nodeps $@ && return # if run with --nodeps, do not fallback on hi level [ -n "$nodeps" ] && return YUMOPTIONS=--nogpgcheck # use install_names ;; zypper-rpm) sudocmd rpm -Uvh $force $nodeps $@ && return # if run with --nodeps, do not fallback on hi level [ -n "$nodeps" ] && return ZYPPEROPTIONS=--no-gpg-checks # use install_names ;; urpm-rpm) sudocmd rpm -Uvh $force $nodeps $@ && return # if run with --nodeps, do not fallback on hi level [ -n "$nodeps" ] && return URPMOPTIONS=--no-verify-rpm # use install_names ;; pkgsrc) sudocmd pkg_add $@ return ;; pacman) sudocmd pacman -U --noconfirm $force $nodeps $@ && return [ -n "$nodeps" ] && return sudocmd pacman -U $force $@ return ;; slackpkg) sudocmd /sbin/installpkg $@ return ;; esac # other systems can install file package via ordinary command epm_install_names "$@" } epm_print_install_command() { case $PMTYPE in apt-rpm|yum-rpm|urpm-rpm|zypper-rpm|dnf-rpm) echo "rpm -Uvh --force $nodeps $@" ;; apt-dpkg) echo "dpkg -i $@" ;; pkgsrc) echo "pkg_add $@" ;; pacman) echo "pacman -U --noconfirm --force $nodeps $@" ;; slackpkg) echo "/sbin/installpkg $@" ;; npackd) echo "npackdcl add --package=$@" ;; ipkg) echo "ipkg install $@" ;; *) fatal "Do not known appropriate install command for $PMTYPE" ;; esac } epm_install() { if [ -n "$show_command_only" ] ; then epm_print_install_command $pkg_filenames return fi [ -n "$pkg_files$pkg_names" ] || fatal "Run install without packages" local names="$(echo $pkg_names | filter_out_installed_packages)" local files="$(echo $pkg_files | filter_out_installed_packages)" [ -z "$files$names" ] && echo "Skip empty install list" && return 22 epm_install_names $names || return epm_install_files $files }