diff --git a/packed/epm.sh b/packed/epm.sh index 1a6f95f97db9ed6455bc410cc79730b9a4b62d94..039917332c6881f812f182ea51ea150f439706db 100755 --- a/packed/epm.sh +++ b/packed/epm.sh @@ -33,7 +33,7 @@ SHAREDIR=$PROGDIR # will replaced with /etc/eepm during install CONFIGDIR=$PROGDIR/../etc -EPMVERSION="3.41.2" +EPMVERSION="3.42.0" if [ "$EPMVERSION" = "@""VERSION""@" ] ; then EPMVERSION=$(head $PROGDIR/../eepm.spec | grep "^Version: " | sed -e 's|Version: ||' ) @@ -91,37 +91,36 @@ check_tty() is_command tput || return # FreeBSD does not support tput -S - echo | tput -S >/dev/null 2>/dev/null || return - [ -z "$USETTY" ] || return - export USETTY=1 + echo | a= tput -S >/dev/null 2>/dev/null || return + USETTY="tput -S" } : ${BLACK:=0} ${RED:=1} ${GREEN:=2} ${YELLOW:=3} ${BLUE:=4} ${MAGENTA:=5} ${CYAN:=6} ${WHITE:=7} set_boldcolor() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo bold echo setaf $1 - } |tput -S + } | $USETTY } set_color() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo setaf $1 - } |tput -S + } | $USETTY } restore_color() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo op; # set Original color Pair. echo sgr0; # turn off all special graphics mode (bold in our case). - } |tput -S + } | $USETTY } echover() @@ -737,22 +736,22 @@ is_url() echo "$1" | grep -q "^[filehtps]*:/" } -if which which 2>/dev/null >/dev/null ; then +if a= which which 2>/dev/null >/dev/null ; then # the best case if we have which command (other ways needs checking) # TODO: don't use which at all, it is binary, not builtin shell command print_command_path() { - which -- "$1" 2>/dev/null + a= which -- "$1" 2>/dev/null } -elif type -a type 2>/dev/null >/dev/null ; then +elif a= type -a type 2>/dev/null >/dev/null ; then print_command_path() { - type -fpP -- "$1" 2>/dev/null + a= type -fpP -- "$1" 2>/dev/null } else print_command_path() { - type "$1" 2>/dev/null | sed -e 's|.* /|/|' + a= type "$1" 2>/dev/null | sed -e 's|.* /|/|' } fi @@ -782,10 +781,7 @@ fi check_core_commands() { - #which --help >/dev/null || fatal "Can't find which command (which package is missed?)" - # broken which on Debian systems - # TODO: use is_command and print_command_path instead of - which which >/dev/null || fatal "Can't find which command (which or debianutils package is missed?)" + #which which >/dev/null || fatal "Can't find which command (which or debianutils package is missed?)" is_command grep || fatal "Can't find grep command (coreutils package is missed?)" is_command sed || fatal "Can't find sed command (sed package is missed?)" } @@ -1855,7 +1851,7 @@ __epm_changelog_files() case $(get_package_type $1) in rpm) assure_exists rpm - docmd_foreach "rpm -q -p --changelog" $@ | less + docmd_foreach "rpm -q -p --changelog" $@ ;; *) fatal "Have no suitable command for $1" @@ -1869,17 +1865,17 @@ __epm_changelog_local_names() case $PMTYPE in apt-rpm|yum-rpm|dnf-rpm|urpm-rpm|zypper-rpm) - docmd_foreach "rpm -q --changelog" $@ | less + docmd_foreach "rpm -q --changelog" $@ ;; apt-dpkg|aptitude-dpkg) - docmd zcat /usr/share/doc/$1/changelog.Debian.gz | less + docmd zcat /usr/share/doc/$1/changelog.Debian.gz ;; emerge) assure_exists equery - docmd equery changes -f $1 | less + docmd equery changes -f $1 ;; pacman) - docmd pacman -Qc $1 | less + docmd pacman -Qc $1 ;; *) fatal "Have no suitable command for $PMTYPE" @@ -1893,7 +1889,7 @@ __epm_changelog_unlocal_names() case $PMTYPE in apt-rpm) - __epm_changelog_apt $@ | less + __epm_changelog_apt "$1" ;; #apt-dpkg) # # FIXME: only first pkg @@ -1903,14 +1899,14 @@ __epm_changelog_unlocal_names() # sudocmd yum clean all # ;; urpm-rpm) - docmd urpmq --changelog $@ | less + docmd urpmq --changelog "$1" ;; #zypper-rpm) # sudocmd zypper clean # ;; emerge) assure_exists equery - docmd equery changes -f $1 | less + docmd equery changes -f "$1" ;; *) fatal "Have no suitable command for $PMTYPE. Try install the package firstly." @@ -1926,6 +1922,7 @@ epm_changelog() __epm_changelog_files $pkg_files + # TODO: add less or bat local pkg for pkg in $pkg_names ; do if is_installed $pkg ; then @@ -2861,7 +2858,7 @@ __epm_korinf_site_mask() { tURL="$EPM_KORINF_REPO_URL/$archprefix$($DISTRVENDOR --vendor-name)/$($DISTRVENDOR --repo-name)" docmd eget --check "$tURL" && URL="$tURL" fi - echo "$URL/$MASK*.$PKGFORMAT" + eget --list --latest "$URL/$MASK*.$PKGFORMAT" } __epm_korinf_list() { @@ -2943,7 +2940,7 @@ __alt_local_content_filelist() update_alt_contents_index local CI="$(cat $ALT_CONTENTS_INDEX_LIST)" - # TODO: safe way to use less + # TODO: safe way to use less or bat #local OUTCMD="less" #[ -n "$USETTY" ] || OUTCMD="cat" OUTCMD="cat" @@ -3021,7 +3018,8 @@ __epm_filelist_file() ;; esac - docmd $CMD $@ | less + # TODO: add less + docmd $CMD $@ } __epm_filelist_name() @@ -3049,7 +3047,7 @@ __epm_filelist_name() CMD="conary query --ls" ;; pacman) - docmd pacman -Ql $@ | sed -e "s|.* ||g" | less + docmd pacman -Ql $@ | sed -e "s|.* ||g" return ;; emerge) @@ -3078,7 +3076,7 @@ __epm_filelist_name() ;; slackpkg) is_installed $@ || fatal "Query filelist for non installed packages is not implemented yet" - docmd awk 'BEGIN{desk=1}{if(/^FILE LIST:$/){desk=0} else if (desk==0) {print}}' /var/log/packages/${pkg_filenames}* | less + docmd awk 'BEGIN{desk=1}{if(/^FILE LIST:$/){desk=0} else if (desk==0) {print}}' /var/log/packages/${pkg_filenames}* return ;; *) @@ -3086,7 +3084,7 @@ __epm_filelist_name() ;; esac - # TODO: add less + # TODO: add less or bat (for any output in the function) docmd $CMD $@ && return # TODO: may be we need check is installed before prev. line? is_installed $@ || __epm_filelist_remote $@ @@ -3182,10 +3180,11 @@ epm_full_upgrade() # File bin/epm-history: EHOG='\(apt-get\|rpm\)' +JCHAN='-t apt-get -t rpm' __alt_epm_history_journal() { - a= journalctl -t apt-get -t rpm + a= journalctl $JCHAN } __alt_epm_history_uniq() @@ -3281,25 +3280,25 @@ if [ $PMTYPE = "apt-rpm" ] ; then return ;; --installed) # HELPCMD: print only new installed packages - __alt_epm_history_installed | less + __alt_epm_history_installed return ;; --removed) # HELPCMD: print only removed packages - __alt_epm_history_removed #| less + __alt_epm_history_removed return ;; --updated) # HELPCMD: print only updated packages - __alt_epm_history_updated | less + __alt_epm_history_updated return ;; --list) # HELPCMD: (or empty) print all history entries - docmd journalctl -t apt-get + docmd journalctl $JCHAN return ;; "") ;; *) - fatal "Unknown option $1" + fatal "Unknown option $1. Use epm history --help to get help." esac fi @@ -3307,10 +3306,10 @@ fi case $PMTYPE in apt-rpm) - docmd journalctl -t apt-get -t rpm -r + docmd journalctl $JCHAN -r ;; apt-dpkg) - docmd less /var/log/dpkg.log + docmd cat /var/log/dpkg.log ;; dnf-rpm) sudocmd dnf history @@ -3319,13 +3318,13 @@ case $PMTYPE in sudocmd eopkg history ;; zypper-rpm) - less /var/log/zypp/history + docmd cat /var/log/zypp/history ;; pacman) - docmd less /var/log/pacman.log + docmd cat /var/log/pacman.log ;; emerge) - docmd less /var/log/portage + docmd cat /var/log/portage ;; *) fatal "Have no suitable command for $PMTYPE" @@ -5254,8 +5253,15 @@ Options: --list - list all installed apps --list-all - list all available apps --list-scripts - list all available scripts - --short (with --list) - list names only" - --installed <app> - check if the app is installed" + --short (with --list) - list names only + --installed <app> - check if the app is installed + --product-alternatives- list alternatives (use like epm play app=beta) + +Examples: + epm play --remove opera + epm play yandex-browser = beta + epm play telegram = beta + epm play telegram = 4.7.1 EOF } @@ -11376,11 +11382,34 @@ has() grep "$*" "$DISTROFILE" >/dev/null 2>&1 } -# Has a system the specified command? -hascommand() +# copied from epm-sh-functions +# print a path to the command if exists in $PATH +if a= which which 2>/dev/null >/dev/null ; then + # the best case if we have which command (other ways needs checking) + # TODO: don't use which at all, it is binary, not builtin shell command +print_command_path() { - which "$1" 2>/dev/null >/dev/null + a= which -- "$1" 2>/dev/null } +elif a= type -a type 2>/dev/null >/dev/null ; then +print_command_path() +{ + a= type -fpP -- "$1" 2>/dev/null +} +else +print_command_path() +{ + a= type "$1" 2>/dev/null | sed -e 's|.* /|/|' +} +fi + +# check if <arg> is a real command +is_command() +{ + print_command_path "$1" >/dev/null +} +##########################3 + firstupper() { @@ -11461,7 +11490,7 @@ case $DISTRIB_ID in Ubuntu|Debian|Mint|OSNovaLinux|AstraLinux*|Elbrus) CMD="apt-dpkg" #which aptitude 2>/dev/null >/dev/null && CMD=aptitude-dpkg - #hascommand snappy && CMD=snappy + #is_command snappy && CMD=snappy ;; Solus) CMD="eopkg" @@ -11471,14 +11500,14 @@ case $DISTRIB_ID in ;; ROSA) CMD="urpm-rpm" - hascommand yum && CMD="yum-rpm" - hascommand dnf && CMD="dnf-rpm" + is_command yum && CMD="yum-rpm" + is_command dnf && CMD="dnf-rpm" # use dnf since 2020 #[ "$DISTRIB_ID/$DISTRIB_RELEASE" = "ROSA/2020" ] && CMD="urpm-rpm" ;; FreeBSD|NetBSD|OpenBSD|Solaris) CMD="pkgsrc" - hascommand pkg && CMD=pkgng + is_command pkg && CMD=pkgng ;; Gentoo) CMD="emerge" @@ -11488,7 +11517,7 @@ case $DISTRIB_ID in ;; Fedora|CentOS|OracleLinux|RockyLinux|AlmaLinux|RHEL|RELS|Scientific|GosLinux|Amzn|RedOS) CMD="dnf-rpm" - hascommand dnf || CMD="yum-rpm" + is_command dnf || CMD="yum-rpm" [ "$DISTRIB_ID/$DISTRIB_RELEASE" = "CentOS/7" ] && CMD="yum-rpm" ;; Slackware) @@ -11502,8 +11531,8 @@ case $DISTRIB_ID in ;; Windows) CMD="appget" - hascommand $CMD || CMD="chocolatey" - hascommand $CMD || CMD="winget" + is_command $CMD || CMD="chocolatey" + is_command $CMD || CMD="winget" ;; MacOS) CMD="homebrew" @@ -11535,17 +11564,17 @@ case $DISTRIB_ID in echo "apt-dpkg" && return fi - if hascommand "rpm" && [ -s /var/lib/rpm/Name ] || [ -s /var/lib/rpm/rpmdb.sqlite ] ; then - hascommand "zypper" && echo "zypper-rpm" && return - hascommand "dnf" && echo "dnf-rpm" && return - hascommand "apt-get" && echo "apt-rpm" && return - hascommand "yum" && echo "yum-rpm" && return - hascommand "urpmi" && echo "urpm-rpm" && return + if is_command "rpm" && [ -s /var/lib/rpm/Name ] || [ -s /var/lib/rpm/rpmdb.sqlite ] ; then + is_command "zypper" && echo "zypper-rpm" && return + is_command "dnf" && echo "dnf-rpm" && return + is_command "apt-get" && echo "apt-rpm" && return + is_command "yum" && echo "yum-rpm" && return + is_command "urpmi" && echo "urpm-rpm" && return fi - if hascommand "dpkg" && [ -s /var/lib/dpkg/status ] ; then - hascommand "apt" && echo "apt-dpkg" && return - hascommand "apt-get" && echo "apt-dpkg" && return + if is_command "dpkg" && [ -s /var/lib/dpkg/status ] ; then + is_command "apt" && echo "apt-dpkg" && return + is_command "apt-get" && echo "apt-dpkg" && return fi echo "We don't support yet DISTRIB_ID $DISTRIB_ID" >&2 @@ -11831,13 +11860,13 @@ elif distro slackware-version ; then DISTRIB_ID="Slackware" DISTRIB_RELEASE="$(grep -Eo '[0-9]+\.[0-9]+' $DISTROFILE)" -elif distro os-release && hascommand tce-ab ; then +elif distro os-release && is_command tce-ab ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="TinyCoreLinux" DISTRIB_RELEASE="$VERSION_ID" -elif distro os-release && hascommand xbps-query ; then +elif distro os-release && is_command xbps-query ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="VoidLinux" @@ -11891,7 +11920,7 @@ elif [ "$(uname -s 2>/dev/null)" = "Darwin" ] ; then DISTRIB_RELEASE=$(uname -r) # fixme: move to up -elif [ "$(uname)" = "Linux" ] && hascommand guix ; then +elif [ "$(uname)" = "Linux" ] && is_command guix ; then DISTRIB_ID="GNU/Linux/Guix" DISTRIB_RELEASE=$(uname -r) @@ -11984,7 +12013,7 @@ case "$DIST_ARCH" in armv7*) # TODO: use uname only # uses binutils package - if hascommand readelf && [ -z "$(readelf -A /proc/self/exe | grep Tag_ABI_VFP_args)" ] ; then + if is_command readelf && [ -z "$(readelf -A /proc/self/exe | grep Tag_ABI_VFP_args)" ] ; then DIST_ARCH="armel" else DIST_ARCH="armhf" @@ -12128,10 +12157,8 @@ get_core_mhz() get_virt() { local VIRT - local SDCMD - SDCMD=$(which systemd-detect-virt 2>/dev/null) - if [ -n "$SDCMD" ] ; then - VIRT="$($SDCMD)" + if is_command systemd-detect-virt ; then + VIRT="$(systemd-detect-virt)" [ "$VIRT" = "none" ] && echo "(host system)" && return [ -z "$VIRT" ] && echo "(unknown)" && return echo "$VIRT" && return @@ -12163,7 +12190,7 @@ get_service_manager() [ -d /run/systemd/system ] && echo "systemd" && return # TODO #[ -d /usr/share/upstart ] && echo "upstart" && return - hascommand systemctl && echo "systemd" && return + is_command systemctl && echo "systemd" && return [ -d /etc/init.d ] && echo "sysvinit" && return echo "(unknown)" } @@ -12425,33 +12452,41 @@ isatty2() check_tty() { isatty || return - which tput >/dev/null 2>/dev/null || return + is_command tput >/dev/null 2>/dev/null || return # FreeBSD does not support tput -S - echo | tput -S >/dev/null 2>/dev/null || return - [ -z "$USETTY" ] || return - export USETTY=1 + echo | a= tput -S >/dev/null 2>/dev/null || return + export USETTY="tput -S" } : ${BLACK:=0} ${RED:=1} ${GREEN:=2} ${YELLOW:=3} ${BLUE:=4} ${MAGENTA:=5} ${CYAN:=6} ${WHITE:=7} set_boldcolor() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo bold echo setaf $1 - } |tput -S + } | $USETTY +} + +set_color() +{ + [ -n "$USETTY" ] || return + { + echo setaf $1 + } | $USETTY } restore_color() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo op; # set Original color Pair. echo sgr0; # turn off all special graphics mode (bold in our case). - } |tput -S + } | $USETTY } + echover() { [ -n "$verbose" ] || return @@ -12480,22 +12515,22 @@ docmd() # copied from epm # print a path to the command if exists in $PATH -if which which 2>/dev/null >/dev/null ; then +if a= which which 2>/dev/null >/dev/null ; then # the best case if we have which command (other ways needs checking) # TODO: don't use which at all, it is binary, not builtin shell command print_command_path() { - which -- "$1" 2>/dev/null + a= which -- "$1" 2>/dev/null } -elif type -a type 2>/dev/null >/dev/null ; then +elif a= type -a type 2>/dev/null >/dev/null ; then print_command_path() { - type -fpP -- "$1" 2>/dev/null + a= type -fpP -- "$1" 2>/dev/null } else print_command_path() { - type "$1" 2>/dev/null | sed -e 's|.* /|/|' + a= type "$1" 2>/dev/null | sed -e 's|.* /|/|' } fi @@ -12506,7 +12541,6 @@ is_command() } - # check man glob filter_glob() { @@ -12585,6 +12619,7 @@ LATEST='' SECONDLATEST='' CHECKMIRRORS='' TARGETFILE='' +FORCEIPV='' set_quiet() { @@ -12604,6 +12639,8 @@ Options: -q - quiet mode -k|--no-check-certificate - skip SSL certificate chain support -U|-A|--user-agent - send browser like UserAgent + -4|--ipv4|--inet4-only - use only IPV4 + -6|--ipv6|--inet6-only - use only IPV6 -O-|-O - - output downloaded file to stdout -O file - download to this file --latest - print only latest version of a file @@ -12652,13 +12689,19 @@ while [ -n "$1" ] ; do WGETUSERAGENT="-U '$user_agent'" CURLUSERAGENT="-A '$user_agent'" ;; + -4|--ipv4|--inet4-only) + FORCEIPV="-4" + ;; + -6|--ipv6|--inet6-only) + FORCEIPV="-6" + ;; --list|--list-only) LISTONLY="$1" set_quiet ;; --check) CHECKURL="$1" - set_quiet + #set_quiet ;; --latest) LATEST="$1" @@ -12720,9 +12763,9 @@ elif [ -n "$WGET" ] ; then __wget() { if [ -n "$WGETUSERAGENT" ] ; then - docmd $WGET $WGETQ $WGETNOSSLCHECK "$WGETUSERAGENT" "$@" + docmd $WGET $FORCEIPV $WGETQ $WGETNOSSLCHECK "$WGETUSERAGENT" "$@" else - docmd $WGET $WGETQ $WGETNOSSLCHECK "$@" + docmd $WGET $FORCEIPV $WGETQ $WGETNOSSLCHECK "$@" fi } @@ -12762,9 +12805,9 @@ CURL="$(print_command_path curl)" __curl() { if [ -n "$CURLUSERAGENT" ] ; then - docmd $CURL --fail -L $CURLQ "$CURLUSERAGENT" $CURLNOSSLCHECK "$@" + docmd $CURL $FORCEIPV --fail -L $CURLQ "$CURLUSERAGENT" $CURLNOSSLCHECK "$@" else - docmd $CURL --fail -L $CURLQ $CURLNOSSLCHECK "$@" + docmd $CURL $FORCEIPV --fail -L $CURLQ $CURLNOSSLCHECK "$@" fi } # put remote content to stdout @@ -12855,14 +12898,14 @@ get_urls() fi # cat html, divide to lines by tags and cut off hrefs only - scat $URL | sed -e 's|<|<\n|g' -e 's|data-file=|href=|g' | \ + scat $URL | sed -e 's|<|<\n|g' -e 's|data-file=|href=|g' -e "s|'|\"|g" | \ grep -i -o -E 'href="(.+)"' | cut -d'"' -f2 } if [ -n "$CHECKURL" ] ; then - set_quiet + #set_quiet check_url_is_accessible "$1" return fi @@ -13401,7 +13444,7 @@ $(get_help HELPOPT) print_version() { echo "Etersoft uncompressor version @VERSION@" - echo "Copyright (c) Etersoft 2013, 2020" + echo "Copyright (c) Etersoft 2013, 2020, 2023" echo "This program may be freely redistributed under the terms of the GNU AGPLv3." } @@ -13413,7 +13456,7 @@ regular_unpack() local opt="$4" # instead of epm assure - if ! which "$prg" >/dev/null 2>/dev/null ; then + if ! is_command "$prg" ; then epm assure $prg $pkg || fatal "Try install $pkg package for $prg unpack command." fi diff --git a/packed/serv.sh b/packed/serv.sh index bc9073b13c633118e7be2cfa1b1b29e2da98a0fa..7e683db69c508e68e48a9c7fe59f23a05f4a008b 100755 --- a/packed/serv.sh +++ b/packed/serv.sh @@ -72,37 +72,36 @@ check_tty() is_command tput || return # FreeBSD does not support tput -S - echo | tput -S >/dev/null 2>/dev/null || return - [ -z "$USETTY" ] || return - export USETTY=1 + echo | a= tput -S >/dev/null 2>/dev/null || return + USETTY="tput -S" } : ${BLACK:=0} ${RED:=1} ${GREEN:=2} ${YELLOW:=3} ${BLUE:=4} ${MAGENTA:=5} ${CYAN:=6} ${WHITE:=7} set_boldcolor() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo bold echo setaf $1 - } |tput -S + } | $USETTY } set_color() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo setaf $1 - } |tput -S + } | $USETTY } restore_color() { - [ "$USETTY" = "1" ] || return + [ -n "$USETTY" ] || return { echo op; # set Original color Pair. echo sgr0; # turn off all special graphics mode (bold in our case). - } |tput -S + } | $USETTY } echover() @@ -718,22 +717,22 @@ is_url() echo "$1" | grep -q "^[filehtps]*:/" } -if which which 2>/dev/null >/dev/null ; then +if a= which which 2>/dev/null >/dev/null ; then # the best case if we have which command (other ways needs checking) # TODO: don't use which at all, it is binary, not builtin shell command print_command_path() { - which -- "$1" 2>/dev/null + a= which -- "$1" 2>/dev/null } -elif type -a type 2>/dev/null >/dev/null ; then +elif a= type -a type 2>/dev/null >/dev/null ; then print_command_path() { - type -fpP -- "$1" 2>/dev/null + a= type -fpP -- "$1" 2>/dev/null } else print_command_path() { - type "$1" 2>/dev/null | sed -e 's|.* /|/|' + a= type "$1" 2>/dev/null | sed -e 's|.* /|/|' } fi @@ -763,10 +762,7 @@ fi check_core_commands() { - #which --help >/dev/null || fatal "Can't find which command (which package is missed?)" - # broken which on Debian systems - # TODO: use is_command and print_command_path instead of - which which >/dev/null || fatal "Can't find which command (which or debianutils package is missed?)" + #which which >/dev/null || fatal "Can't find which command (which or debianutils package is missed?)" is_command grep || fatal "Can't find grep command (coreutils package is missed?)" is_command sed || fatal "Can't find sed command (sed package is missed?)" } @@ -1485,11 +1481,34 @@ has() grep "$*" "$DISTROFILE" >/dev/null 2>&1 } -# Has a system the specified command? -hascommand() +# copied from epm-sh-functions +# print a path to the command if exists in $PATH +if a= which which 2>/dev/null >/dev/null ; then + # the best case if we have which command (other ways needs checking) + # TODO: don't use which at all, it is binary, not builtin shell command +print_command_path() { - which "$1" 2>/dev/null >/dev/null + a= which -- "$1" 2>/dev/null } +elif a= type -a type 2>/dev/null >/dev/null ; then +print_command_path() +{ + a= type -fpP -- "$1" 2>/dev/null +} +else +print_command_path() +{ + a= type "$1" 2>/dev/null | sed -e 's|.* /|/|' +} +fi + +# check if <arg> is a real command +is_command() +{ + print_command_path "$1" >/dev/null +} +##########################3 + firstupper() { @@ -1570,7 +1589,7 @@ case $DISTRIB_ID in Ubuntu|Debian|Mint|OSNovaLinux|AstraLinux*|Elbrus) CMD="apt-dpkg" #which aptitude 2>/dev/null >/dev/null && CMD=aptitude-dpkg - #hascommand snappy && CMD=snappy + #is_command snappy && CMD=snappy ;; Solus) CMD="eopkg" @@ -1580,14 +1599,14 @@ case $DISTRIB_ID in ;; ROSA) CMD="urpm-rpm" - hascommand yum && CMD="yum-rpm" - hascommand dnf && CMD="dnf-rpm" + is_command yum && CMD="yum-rpm" + is_command dnf && CMD="dnf-rpm" # use dnf since 2020 #[ "$DISTRIB_ID/$DISTRIB_RELEASE" = "ROSA/2020" ] && CMD="urpm-rpm" ;; FreeBSD|NetBSD|OpenBSD|Solaris) CMD="pkgsrc" - hascommand pkg && CMD=pkgng + is_command pkg && CMD=pkgng ;; Gentoo) CMD="emerge" @@ -1597,7 +1616,7 @@ case $DISTRIB_ID in ;; Fedora|CentOS|OracleLinux|RockyLinux|AlmaLinux|RHEL|RELS|Scientific|GosLinux|Amzn|RedOS) CMD="dnf-rpm" - hascommand dnf || CMD="yum-rpm" + is_command dnf || CMD="yum-rpm" [ "$DISTRIB_ID/$DISTRIB_RELEASE" = "CentOS/7" ] && CMD="yum-rpm" ;; Slackware) @@ -1611,8 +1630,8 @@ case $DISTRIB_ID in ;; Windows) CMD="appget" - hascommand $CMD || CMD="chocolatey" - hascommand $CMD || CMD="winget" + is_command $CMD || CMD="chocolatey" + is_command $CMD || CMD="winget" ;; MacOS) CMD="homebrew" @@ -1644,17 +1663,17 @@ case $DISTRIB_ID in echo "apt-dpkg" && return fi - if hascommand "rpm" && [ -s /var/lib/rpm/Name ] || [ -s /var/lib/rpm/rpmdb.sqlite ] ; then - hascommand "zypper" && echo "zypper-rpm" && return - hascommand "dnf" && echo "dnf-rpm" && return - hascommand "apt-get" && echo "apt-rpm" && return - hascommand "yum" && echo "yum-rpm" && return - hascommand "urpmi" && echo "urpm-rpm" && return + if is_command "rpm" && [ -s /var/lib/rpm/Name ] || [ -s /var/lib/rpm/rpmdb.sqlite ] ; then + is_command "zypper" && echo "zypper-rpm" && return + is_command "dnf" && echo "dnf-rpm" && return + is_command "apt-get" && echo "apt-rpm" && return + is_command "yum" && echo "yum-rpm" && return + is_command "urpmi" && echo "urpm-rpm" && return fi - if hascommand "dpkg" && [ -s /var/lib/dpkg/status ] ; then - hascommand "apt" && echo "apt-dpkg" && return - hascommand "apt-get" && echo "apt-dpkg" && return + if is_command "dpkg" && [ -s /var/lib/dpkg/status ] ; then + is_command "apt" && echo "apt-dpkg" && return + is_command "apt-get" && echo "apt-dpkg" && return fi echo "We don't support yet DISTRIB_ID $DISTRIB_ID" >&2 @@ -1940,13 +1959,13 @@ elif distro slackware-version ; then DISTRIB_ID="Slackware" DISTRIB_RELEASE="$(grep -Eo '[0-9]+\.[0-9]+' $DISTROFILE)" -elif distro os-release && hascommand tce-ab ; then +elif distro os-release && is_command tce-ab ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="TinyCoreLinux" DISTRIB_RELEASE="$VERSION_ID" -elif distro os-release && hascommand xbps-query ; then +elif distro os-release && is_command xbps-query ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="VoidLinux" @@ -2000,7 +2019,7 @@ elif [ "$(uname -s 2>/dev/null)" = "Darwin" ] ; then DISTRIB_RELEASE=$(uname -r) # fixme: move to up -elif [ "$(uname)" = "Linux" ] && hascommand guix ; then +elif [ "$(uname)" = "Linux" ] && is_command guix ; then DISTRIB_ID="GNU/Linux/Guix" DISTRIB_RELEASE=$(uname -r) @@ -2093,7 +2112,7 @@ case "$DIST_ARCH" in armv7*) # TODO: use uname only # uses binutils package - if hascommand readelf && [ -z "$(readelf -A /proc/self/exe | grep Tag_ABI_VFP_args)" ] ; then + if is_command readelf && [ -z "$(readelf -A /proc/self/exe | grep Tag_ABI_VFP_args)" ] ; then DIST_ARCH="armel" else DIST_ARCH="armhf" @@ -2237,10 +2256,8 @@ get_core_mhz() get_virt() { local VIRT - local SDCMD - SDCMD=$(which systemd-detect-virt 2>/dev/null) - if [ -n "$SDCMD" ] ; then - VIRT="$($SDCMD)" + if is_command systemd-detect-virt ; then + VIRT="$(systemd-detect-virt)" [ "$VIRT" = "none" ] && echo "(host system)" && return [ -z "$VIRT" ] && echo "(unknown)" && return echo "$VIRT" && return @@ -2272,7 +2289,7 @@ get_service_manager() [ -d /run/systemd/system ] && echo "systemd" && return # TODO #[ -d /usr/share/upstart ] && echo "upstart" && return - hascommand systemctl && echo "systemd" && return + is_command systemctl && echo "systemd" && return [ -d /etc/init.d ] && echo "sysvinit" && return echo "(unknown)" } @@ -2545,7 +2562,7 @@ print_version() local on_text="(host system)" local virt="$($DISTRVENDOR -i)" [ "$virt" = "(unknown)" ] || [ "$virt" = "(host system)" ] || on_text="(under $virt)" - echo "Service manager version 3.41.2 https://wiki.etersoft.ru/Epm" + echo "Service manager version 3.42.0 https://wiki.etersoft.ru/Epm" echo "Running on $($DISTRVENDOR -e) $on_text with $SERVICETYPE" echo "Copyright (c) Etersoft 2012-2021" echo "This program may be freely redistributed under the terms of the GNU AGPLv3."