#!/bin/sh # # Copyright (C) 2012-2018 Etersoft # Copyright (C) 2012-2018 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/>. # PROGDIR=$(dirname "$0") PROGNAME=$(basename "$0") [ "$PROGDIR" = "." ] && PROGDIR=$(pwd) if [ "$0" = "/dev/stdin" ] || [ "$0" = "sh" ] ; then PROGDIR="" PROGNAME="" fi # will replaced to /usr/share/eepm during install SHAREDIR=$PROGDIR CONFIGDIR=$PROGDIR/.. load_helper() { local CMD="$SHAREDIR/$1" # do not use fatal() here, it can be initial state [ -r "$CMD" ] || { echo "FATAL: Have no $CMD helper file" ; exit 1; } # shellcheck disable=SC1090 . $CMD } load_helper epm-sh-functions #PATH=$PATH:/sbin:/usr/sbin set_pm_type set_sudo check_tty ############################# phelp() { echo "$Descr $Usage Commands: $(get_help HELPCMD) Options: $(get_help HELPOPT) " } print_version() { echo "EPM package manager version @VERSION@ https://wiki.etersoft.ru/Epm" echo "Running on $($DISTRVENDOR -e) ('$PMTYPE' package manager uses '$PKGFORMAT' package format)" echo "Copyright (c) Etersoft 2012-2019" echo "This program may be freely redistributed under the terms of the GNU AGPLv3." } Usage="Usage: epm [options] <command> [package name(s), package files]..." Descr="epm - EPM package manager" EPMVERSION=@VERSION@ verbose= quiet= nodeps= noremove= dryrun= force= repack= inscript= scripts= short= direct= sort= non_interactive= skip_installed= show_command_only= epm_cmd= pkg_files= pkg_dirs= pkg_names= pkg_urls= quoted_args= # load system wide config [ -f /etc/eepm/eepm.conf ] && . /etc/eepm/eepm.conf case $PROGNAME in epmi) epm_cmd=install ;; epmI) epm_cmd=Install ;; epme) epm_cmd=remove ;; epmcl) epm_cmd=changelog ;; epms) epm_cmd=search ;; epmsf) epm_cmd=search_file ;; epmq) epm_cmd=query ;; epmqi) epm_cmd=info ;; epmqf) epm_cmd=query_file ;; epmqa) epm_cmd=packages ;; epmqp) epm_cmd=query_package ;; epmql) epm_cmd=filelist ;; epmrl) epm_cmd=repolist ;; epmu) epm_cmd=update ;; epm|upm|eepm) ;; epm.sh) ;; *) # epm by default # fatal "Unknown command: $progname" ;; esac # was called with alias name [ -n "$epm_cmd" ] && PROGNAME="epm" check_command() { # do not override command [ -z "$epm_cmd" ] || return # Base commands case $1 in -i|install|add|i) # HELPCMD: install package(s) from remote repositories or from local file epm_cmd=install ;; -e|-P|rm|del|remove|delete|uninstall|erase|e) # HELPCMD: remove (delete) package(s) from the database and the system epm_cmd=remove ;; -s|search|s) # HELPCMD: search in remote package repositories epm_cmd=search ;; -qp|qp|query_package) # HELPCMD: search in the list of installed packages epm_cmd=query_package ;; -qf|qf|-S|wp|which|belongs) # HELPCMD: query package(s) owning file epm_cmd=query_file ;; # Useful commands reinstall) # HELPCMD: reinstall package(s) from remote repositories or from local file epm_cmd=reinstall ;; Install) # HELPCMD: perform update package repo info and install package(s) via install command epm_cmd=Install ;; -q|q|installed|query) # HELPCMD: check presence of package(s) and print this name (also --short is supported) epm_cmd=query ;; -sf|sf|filesearch) # HELPCMD: search in which package a file is included epm_cmd=search_file ;; -ql|ql|filelist) # HELPCMD: print package file list epm_cmd=filelist ;; check|fix|verify) # HELPCMD: check local package base integrity and fix it epm_cmd=check ;; dedup) # HELPCMD: remove unallowed duplicated pkgs (after upgrade crash) epm_cmd=dedup ;; -cl|cl|changelog) # HELPCMD: show changelog for package epm_cmd=changelog ;; -qi|qi|info|show) # HELPCMD: print package detail info epm_cmd=info ;; requires|deplist|depends|req) # HELPCMD: print package requires epm_cmd=requires ;; provides|prov) # HELPCMD: print package provides epm_cmd=provides ;; whatdepends|rdepends|whatrequires|wd) # HELPCMD: print packages dependences on that epm_cmd=whatdepends ;; whatprovides) # HELPCMD: print packages provides that target epm_cmd=whatprovides ;; conflicts) # HELPCMD: print package conflicts epm_cmd=conflicts ;; -qa|qa|-l|list|packages) # HELPCMD: print list of installed package(s) epm_cmd=packages ;; programs) # HELPCMD: print list of installed GUI program(s) (they have .desktop files) epm_cmd=programs ;; assure) # HELPCMD: <command> [package]: install package if command does not exist epm_cmd=assure ;; policy|resolve) # HELPCMD: print detailed information about the priority selection of package epm_cmd=policy ;; # Repository control update) # HELPCMD: update remote package repository databases epm_cmd=update ;; addrepo|ar) # HELPCMD: add package repo (etersoft, autoimports, archive 2017/12/31); run with param to get list epm_cmd=addrepo ;; repolist|sl|rl|listrepo|repo) # HELPCMD: print repo list epm_cmd=repolist ;; repofix) # HELPCMD: fix paths in sources lists (ALT Linux only) epm_cmd=repofix ;; removerepo|rr) # HELPCMD: remove package repo epm_cmd=removerepo ;; full-upgrade) # HELPCMD: update all system packages and kernel epm_cmd=full_upgrade ;; release-upgrade|upgrade-release|upgrade-system) # HELPCMD: update whole system to the release in arg (default: next (latest) release) epm_cmd=release_upgrade ;; kernel-update|kernel-upgrade|update-kernel|upgrade-kernel) # HELPCMD: update system kernel to the last repo version epm_cmd=kernel_update ;; remove-old-kernels|remove-old-kernel) # HELPCMD: remove old system kernels (exclude current or last two kernels) epm_cmd=remove_old_kernels ;; # Other commands clean) # HELPCMD: clean local package cache epm_cmd=clean ;; restore) # HELPCMD: install (restore) packages need for the project (f.i. by requirements.txt) epm_cmd=restore ;; autoremove|package-cleanup) # HELPCMD: auto remove unneeded package(s) Supports args for ALT: [libs|python|perl|libs-devel] epm_cmd=autoremove ;; autoorphans|--orphans) # HELPCMD: remove all packages not from the repository epm_cmd=autoorphans ;; upgrade|dist-upgrade) # HELPCMD: performs upgrades of package software distributions epm_cmd=upgrade ;; Upgrade) # HELPCMD: force update package base, then run upgrade epm_cmd=Upgrade ;; downgrade) # HELPCMD: downgrade [all] packages to the repo state epm_cmd=downgrade ;; download) # HELPCMD: download package(s) file to the current dir epm_cmd=download ;; # TODO: replace with install --simulate simulate) # HELPCMD: simulate install with check requires epm_cmd=simulate ;; audit) # HELPCMD: audits installed packages against known vulnerabilities epm_cmd=audit ;; #checksystem) # HELPCMD: check system for known errors (package management related) # epm_cmd=checksystem # ;; site|url) # HELPCMD: open package's site in a browser (use -p for open packages.altlinux.org site) epm_cmd=site ;; ei|ik|epminstall|epm-install|selfinstall) # HELPCMD: install package(s) from Korinf (eepm by default) epm_cmd=epm_install ;; print) # HELPCMD: print various info, run epm print help for details epm_cmd=print ;; repack) # HELPCMD: repack rpm to local compatibility epm_cmd=repack ;; -V|checkpkg|integrity) # HELPCMD: check package file integrity (checksum) epm_cmd=checkpkg ;; -h|--help|help) # HELPOPT: print this help help=1 phelp exit 0 ;; *) return 1 ;; esac return 0 } check_option() { case $1 in -v|--version) # HELPOPT: print version print_version exit 0 ;; --verbose) # HELPOPT: verbose mode verbose=1 ;; --skip-installed) # HELPOPT: skip already installed packages during install skip_installed=1 ;; --show-command-only) # HELPOPT: show command only, do not any action (supports install and remove ONLY) show_command_only=1 ;; --quiet|--silent) # HELPOPT: quiet mode (do not print commands before exec) quiet=1 ;; --nodeps) # HELPOPT: skip dependency check (during install/simulate and so on) nodeps="--nodeps" ;; --force) # HELPOPT: force install/remove package (f.i., override) force="--force" ;; --noremove|--no-remove) # HELPOPT: exit if any packages are to be removed during upgrade noremove="--no-remove" ;; --no-stdin|--inscript) # HELPOPT: don't read from stdin for epm args inscript=1 ;; --dry-run|--simulate|--just-print|--no-act) # HELPOPT: print only (autoremove/autoorphans/remove only) dryrun="--dry-run" ;; --short) # HELPOPT: short output (just 'package' instead 'package-version-release') short="--short" ;; --direct) # HELPOPT: direct install package file from ftp (not via hilevel repository manager) direct="--direct" ;; --repack) # HELPOPT: repack rpm package(s) before install repack="--repack" ;; --scripts) # HELPOPT: include scripts in repacked rpm package(s) (see --repack or repacking when foreign package is installed) scripts="--scripts" ;; --sort) # HELPOPT: sort output, f.i. --sort=size (supported only for packages command) # TODO: how to read arg? sort="$1" ;; --auto|--non-interactive) # HELPOPT: non interactive mode non_interactive=1 ;; *) return 1 ;; esac return 0 } check_filenames() { local opt for opt in "$@" ; do # files can be with full path or have extension via . if [ -f "$opt" ] && echo "$opt" | grep -q "[/\.]" ; then pkg_files="$pkg_files $opt" elif [ -d "$opt" ] ; then pkg_dirs="$pkg_dirs $opt" elif echo "$opt" | grep -q "://" ; then pkg_urls="$pkg_urls $opt" else pkg_names="$pkg_names $opt" fi quoted_args="$quoted_args \"$opt\"" done } FLAGENDOPTS= for opt in "$@" ; do [ "$opt" = "--" ] && FLAGENDOPTS=1 && continue if [ -z "$FLAGENDOPTS" ] ; then check_command $opt && continue check_option $opt && continue fi # Note: will parse all params separately (no package names with spaces!) check_filenames $opt done # if input is not console and run script from file, get pkgs from stdin too if [ ! -n "$inscript" ] && ! inputisatty && [ -n "$PROGDIR" ] ; then for opt in $(withtimeout 10 cat) ; do # FIXME: do not work # workaround against # yes | epme [ "$opt" = "y" ] && break; [ "$opt" = "yes" ] && break; check_filenames $opt done fi pkg_files=$(strip_spaces "$pkg_files") pkg_dirs=$(strip_spaces "$pkg_dirs") # in common case dirs equals to names only suddenly pkg_names=$(strip_spaces "$pkg_names $pkg_dirs") pkg_urls=$(strip_spaces "$pkg_urls") pkg_filenames=$(strip_spaces "$pkg_files $pkg_names") # Just debug #echover "command: $epm_cmd" #echover "pkg_files=$pkg_files" #echover "pkg_names=$pkg_names" # Just printout help if run without args if [ -z "$epm_cmd" ] ; then print_version echo fatstr="Unknown command in $* arg(s)" [ -n "$*" ] || fatstr="That program needs be running with some command" fatal "$fatstr. Run $ $PROGNAME --help to get help." fi # Use eatmydata for write specific operations case $epm_cmd in update|upgrade|Upgrade|install|reinstall|Install|remove|autoremove|kernel_update|release_upgrade|check) set_eatmydata ;; esac # Run helper for command load_helper epm-$epm_cmd epm_$epm_cmd # return last error code (from subroutine)