epm-sh-functions 18.6 KB
Newer Older
Vitaly Lipatov's avatar
Vitaly Lipatov committed
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2012, 2014  Etersoft
# Copyright (C) 2012, 2014  Vitaly Lipatov <lav@etersoft.ru>
Vitaly Lipatov's avatar
Vitaly Lipatov committed
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
Vitaly Lipatov's avatar
Vitaly Lipatov committed
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
# GNU Affero General Public License for more details.
Vitaly Lipatov's avatar
Vitaly Lipatov committed
15
#
16 17
# 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/>.
Vitaly Lipatov's avatar
Vitaly Lipatov committed
18 19
#

20
# copied from /etc/init.d/outformat (ALT Linux)
21

22

23
# FIXME on Android: FIX ME! implement ttyname_r() bionic/libc/bionic/stubs.c:366
24 25
inputisatty()
{
26 27 28
    # check stdin
    #tty -s 2>/dev/null
    test -t 0
29 30
}

31 32
isatty()
{
33 34
    # check stdout
    test -t 1
35 36 37 38
}

isatty2()
{
39 40
    # check stderr
    test -t 2
41 42
}

43 44
check_tty()
{
45
    isatty2 || return
46

47 48 49
    # Set a sane TERM required for tput
    [ -n "$TERM" ] || TERM=dumb
    export TERM
50

51
    check_core_commands
52

53 54 55 56 57
    # grep -E from busybox may not --color
    # grep -E from MacOS print help to stderr
    if grep -E --help 2>&1 | grep -q -- "--color" ; then
        export EGREPCOLOR="--color"
    fi
58

59 60 61 62
    is_command tput || return
    # FreeBSD does not support tput -S
    echo | a= tput -S >/dev/null 2>/dev/null || return
    USETTY="tput -S"
63 64
}

65 66 67 68
: ${BLACK:=0} ${RED:=1} ${GREEN:=2} ${YELLOW:=3} ${BLUE:=4} ${MAGENTA:=5} ${CYAN:=6} ${WHITE:=7}

set_boldcolor()
{
69 70 71 72 73
    [ -n "$USETTY" ] || return
    {
        echo bold
        echo setaf $1
    } | $USETTY
74 75
}

76 77
set_color()
{
78 79 80 81
    [ -n "$USETTY" ] || return
    {
        echo setaf $1
    } | $USETTY
82 83
}

84 85
restore_color()
{
86 87 88 89 90
    [ -n "$USETTY" ] || return
    {
        echo op; # set Original color Pair.
        echo sgr0; # turn off all special graphics mode (bold in our case).
    } | $USETTY
91 92
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
93 94
echover()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
95
    [ -z "$verbose" ] && return
96
    echo "$*" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
97 98
}

99 100 101
# echo string without EOL
echon()
{
102 103
    # default /bin/sh on MacOS does not recognize -n
    echo -n "$*" 2>/dev/null || a= /bin/echo -n "$*"
104 105 106
}


Vitaly Lipatov's avatar
Vitaly Lipatov committed
107 108 109
# Used DISTRNAME
set_target_pkg_env()
{
110 111 112 113 114 115
    [ -n "$DISTRNAME" ] || fatal "Missing DISTRNAME in set_target_pkg_env."
    local ver="$DISTRVERSION"
    [ -n "$ver" ] && ver="/$ver"
    PKGFORMAT=$($DISTRVENDOR -p "$DISTRNAME$ver")
    PKGVENDOR=$($DISTRVENDOR -s "$DISTRNAME$ver")
    RPMVENDOR=$($DISTRVENDOR -n "$DISTRNAME$ver")
Vitaly Lipatov's avatar
Vitaly Lipatov committed
116 117 118
}

# Print command line and run command line
119
showcmd()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
120
{
121 122 123 124 125 126 127
    if [ -z "$quiet" ] ; then
        set_boldcolor $GREEN
        local PROMTSIG="\$"
        is_root && PROMTSIG="#"
        echo " $PROMTSIG $*"
        restore_color
    fi >&2
128 129
}

130 131 132
# Print command
echocmd()
{
133 134 135 136 137
    set_boldcolor $GREEN
    local PROMTSIG="\$"
    is_root && PROMTSIG="#"
    echo -n "$PROMTSIG $*"
    restore_color
138 139
}

140 141 142
# Print command line and run command line
docmd()
{
143 144
    showcmd "$*$EXTRA_SHOWDOCMD"
    "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
145 146
}

147
# Run every arg with docmd
148 149
docmd_foreach()
{
150 151 152 153 154 155 156
    local cmd pkg
    cmd="$1"
    #showcmd "$@"
    shift
    for pkg in "$@" ; do
        docmd $cmd $pkg
    done
157 158
}

159 160 161
# run command line with SUDO
sudorun()
{
162 163 164 165 166 167
    set_sudo
    if [ -z "$SUDO" ] ; then
        "$@"
        return
    fi
    $SUDO "$@"
168 169
}

170
# Print command line and run command line with SUDO
171
sudocmd()
172
{
173 174 175
    set_sudo
    [ -n "$SUDO" ] && showcmd "$SUDO $*" || showcmd "$*"
    sudorun "$@"
176 177
}

178
# Run every arg with sudocmd
179
# Returns on any error
180 181
sudocmd_foreach()
{
182 183 184 185 186 187 188 189
    local cmd pkg
    cmd="$1"
    #showcmd "$@"
    shift
    for pkg in "$@" ; do
        # don't quote $cmd here: it can be a command with an args
        sudocmd $cmd $pkg || return
    done
190 191
}

192 193 194
# print full path to files
make_filepath()
{
195 196 197 198 199 200
    local i
    for i in "$@" ; do
        [ -f "$i" ] || continue
        echo "$i" | grep -q "/" && echo "$i" && continue
        echo "./$i"
    done
201 202
}

203 204
get_firstarg()
{
205
    echon "$1"
206 207 208 209
}

get_lastarg()
{
210 211 212
    local lastarg
    eval "lastarg=\${$#}"
    echon "$lastarg"
213 214
}

215 216 217
# TODO: see etersoft-build-utils/tests/test_isnumber.sh
isnumber()
{
218
    echo "$*" | filter_strip_spaces | grep -q "^[0-9]\+$"
219 220
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
221 222
# copied from strings
# CHECKME: the same like estrlist has ?
Vitaly Lipatov's avatar
Vitaly Lipatov committed
223
# Note: used grep -E! write '[0-9]+(first|two)', not '[0-9]\+...'
Vitaly Lipatov's avatar
Vitaly Lipatov committed
224 225
rhas()
{
226
    echo "$1" | grep -E -q -- "$2"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
227 228 229 230 231 232 233 234 235
}

# copied from strings
is_dirpath()
{
    [ "$1" = "." ] && return $?
    rhas "$1" "/"
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
236 237 238 239 240 241 242 243 244 245 246 247 248
filter_strip_spaces()
{
        # possible use just
        #xargs echo
        sed -e "s| \+| |g" | \
                sed -e "s|^ ||" | sed -e "s| \$||"
}

strip_spaces()
{
        echo "$*" | filter_strip_spaces
}

249 250 251 252 253 254

# https://superuser.com/questions/422459/substitution-in-text-file-without-regular-expressions
# http://stackoverflow.com/a/2705678/120999
# use for subst complex string with symbols treating as regexp
sed_escape()
{
255
    echo "$*" | sed -e 's/[]()$*.^|[]/\\&/g'
256 257 258
}


259 260 261
# param true false
subst_option()
{
262
    eval "[ -n \"\$$1\" ]" && echo "$2" || echo "$3"
263 264
}

265 266 267
store_output()
{
    # use make_temp_file from etersoft-build-utils
268
    RC_STDOUT="$(mktemp)"
269 270
    local CMDSTATUS=$RC_STDOUT.pipestatus
    echo 1 >$CMDSTATUS
271
    #RC_STDERR=$(mktemp)
272
    ( LANG=C $@ 2>&1 ; echo $? >$CMDSTATUS ) | tee $RC_STDOUT
Vitaly Lipatov's avatar
Vitaly Lipatov committed
273
    return "$(cat $CMDSTATUS)"
274
    # bashism
275
    # http://tldp.org/LDP/abs/html/bashver3.html#PIPEFAILREF
276
    #return $PIPESTATUS
277 278
}

279 280 281 282 283 284
showcmd_store_output()
{
    showcmd "$@"
    store_output "$@"
}

285 286
clean_store_output()
{
287
    rm -f $RC_STDOUT $RC_STDOUT.pipestatus
288 289
}

290
# run epm, possible from side repo
291 292
epm()
{
293
    if [ "$EPMMODE" = "pipe" ] ; then
294
        epm_main --inscript "$@"
295
        return
296
    fi
297 298 299 300 301 302

    # run epm again to full initialization
    local bashopt=''
    [ -n "$verbose" ] && bashopt='-x'

    $CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
303 304 305 306 307
}

# run $SUDO epm, possible from side repo
sudoepm()
{
308
    [ "$EPMMODE" = "pipe" ] && fatal "Can't use sudo epm call from the piped script"
309

310 311
    local bashopt=''
    [ -n "$verbose" ] && bashopt='-x'
312

313
    sudorun $CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
314
}
Vitaly Lipatov's avatar
Vitaly Lipatov committed
315 316 317 318

# Print error message and stop the program
fatal()
{
319
    if [ -z "$TEXTDOMAIN" ] ; then
320 321 322 323
        set_color $RED >&2
        echo -n "ERROR: " >&2
        restore_color >&2
        echo "$*  (you can discuss the epm $EPMVERSION problem in Telegram: https://t.me/useepm)" >&2
324 325 326 327 328
#    else
#        echog "Error in $0: $@" >&2
    fi
#    [ "$TERM" = "screen" ] && echo "(screen detected: waiting ten seconds to exit ...)" >&2 && sleep 10
    exit 1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
329
}
330

Vitaly Lipatov's avatar
Vitaly Lipatov committed
331 332 333
# Print warning message
warning()
{
334
    if [ -z "$TEXTDOMAIN" ] ; then
335 336 337 338
        set_color $YELLOW >&2
        echo -n "WARNING: " >&2
        restore_color >&2
        echo "$*" >&2
339 340 341
#    else
#        echog "Error in $0: $@" >&2
    fi
Vitaly Lipatov's avatar
Vitaly Lipatov committed
342 343
}

344 345
info()
{
346
    [ -n "$quiet" ] && return
347

348 349 350 351 352 353 354
    # print message to stderr if stderr forwarded to (a file)
    if isatty2 ; then
        isatty || return 0
        echo "$*"
    else
        echo "$*" >&2
    fi
355 356
}

357 358 359
# if we have not sudo, returns 1 and set SUDO variable to fatal
SUDO_TESTED=''
SUDO_CMD='sudo'
360 361
set_sudo()
{
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
    local nofail="$1"

    # cache the result
    [ -n "$SUDO_TESTED" ] && return "$SUDO_TESTED"
    SUDO_TESTED="0"

    SUDO=""
    # skip SUDO if disabled
    [ -n "$EPMNOSUDO" ] && return
    if [ "$DISTRNAME" = "Cygwin" ] || [ "$DISTRNAME" = "Windows" ] ; then
        # skip sudo using on Windows
        return
    fi

    # if we are root, do not need sudo
    is_root && return

    # start error section
    SUDO_TESTED="1"

    if ! is_command $SUDO_CMD ; then
        [ "$nofail" = "nofail" ] || SUDO="fatal 'Can't find sudo. Please install and tune sudo ('# epm install sudo') or run epm under root.'"
        return "$SUDO_TESTED"
    fi

    # if input is a console
    if inputisatty && isatty && isatty2 ; then
389 390 391 392 393 394
        if ! $SUDO_CMD -n true ; then
            info "Please enter sudo user password to use sudo in the current session."
            if ! $SUDO_CMD -l >/dev/null ; then
                [ "$nofail" = "nofail" ] || SUDO="fatal 'Can't use sudo (only passwordless sudo is supported in non interactive using). Please run epm under root.'"
                return "$SUDO_TESTED"
            fi
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
        fi
    else
        # use sudo if one is tuned and tuned without password
        if ! $SUDO_CMD -l -n >/dev/null 2>/dev/null ; then
            [ "$nofail" = "nofail" ] || SUDO="fatal 'Can't use sudo (only passwordless sudo is supported). Please run epm under root or check http://altlinux.org/sudo '"
            return "$SUDO_TESTED"
        fi
    fi

    SUDO_TESTED="0"
    # FIXME: does not work: sudo -- VARIABLE=some command
    SUDO="$SUDO_CMD"
    #SUDO="$SUDO_CMD --"
    # check for < 1.7 version which do not support -- (and --help possible too)
    #$SUDO_CMD -h 2>/dev/null | grep -q "  --" || SUDO="$SUDO_CMD"
410

411 412
}

413 414 415
# return TRUE if we can run privileged command
sudo_allowed()
{
416
    set_sudo nofail
417 418
}

419 420
# wait for n seconds (if possible) during executing command
# args: seconds command
421 422
withtimeout()
{
423 424 425 426 427 428 429 430 431
    local TO=$(print_command_path timeout || print_command_path gtimeout)
    if [ -x "$TO" ] ; then
        $TO "$@"
        return
    fi
    fatal "Possible indefinite wait due timeout command is missed"
    # fallback: drop time arg and run without timeout
    #shift
    #"$@"
432 433
}

434 435
set_eatmydata()
{
436 437 438 439 440 441 442 443 444 445 446
    # don't use eatmydata (useless)
    return 0
    # skip if disabled
    [ -n "$EPMNOEATMYDATA" ] && return
    # use if possible
    is_command eatmydata || return
    set_sudo
    # FIXME: check if SUDO already has eatmydata
    [ -n "$SUDO" ] && SUDO="$SUDO eatmydata" || SUDO="eatmydata"
    [ -n "$verbose" ] && info "Uwaga! eatmydata is installed, we will use it for disable all sync operations."
    return 0
447 448
}

449 450
# 
__get_package_for_command()
451
{
452 453 454 455 456 457 458 459
    case "$1" in
        equery|revdep-rebuild)
            echo 'gentoolkit'
            ;;
        update-kernel|remove-old-kernels)
            echo 'update-kernel'
            ;;
    esac
460 461
}

462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
# TODO:
confirm() {
    local response
    # call with a prompt string or use a default
    read -r -p "${1:-Are you sure? [y/N]} " response
    case $response in
        [yY][eE][sS]|[yY])
            true
            ;;
        *)
            false
            ;;
    esac
}

477 478 479

confirm_info()
{
480 481 482 483
    info "$*"
    if [ -z "$non_interactive" ] ; then
        confirm "Are you sure? [y/N]" || fatal "Exiting"
    fi
484 485 486 487

}


488 489
is_root()
{
490 491
    local EFFUID="$(id -u)"
    [ "$EFFUID" = "0" ]
492 493
}

494 495
assure_root()
{
496
    is_root || fatal "run me only under root"
497 498 499 500
}

regexp_subst()
{
501 502 503
    local expression="$1"
    shift
    sed -i -r -e "$expression" "$@"
504 505
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
506
# TODO: we we can't use epm directly?
507 508
assure_exists()
{
509 510 511 512 513 514
    load_helper epm-assure
    local package="$2"
    local textpackage=
    [ -n "$package" ] || package="$(__get_package_for_command "$1")"
    [ -n "$3" ] && textpackage=" >= $3"
    ( direct='' epm_assure "$1" $package $3 ) || fatal "Can't assure in '$1' command from $package$textpackage package"
515 516
}

517 518
assure_exists_erc()
{
519 520 521
    load_helper epm-assure
    local package="erc"
    ( direct='' epm_assure "$package" ) || epm ei erc || fatal "erc is not available to install."
522 523
}

524
# will replaced within disabled_eget in packaged version
Vitaly Lipatov's avatar
Vitaly Lipatov committed
525
eget()
526
{
527 528 529 530 531 532 533
    local EGET
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_eget ] ; then
        ( EGET_BACKEND=$eget_backend $SHAREDIR/tools_eget "$@" )
        return
    fi
    fatal "Internal error: missed tools_eget"
534

535 536 537 538 539
    # FIXME: we need disable output here, eget can be used for get output
    assure_exists eget eget 3.3 >/dev/null
    # run external command, not the function
    EGET=$(print_command_path eget) || fatal "Missed command eget from installed package eget"
    $EGET "$@"
540 541
}

542 543 544
# will replaced within disabled_erc in packaged version
erc()
{
545

546 547 548 549 550
    # install 7zip in any case (can be used)
    if is_command 7z || is_command 7za || is_command 7zr || is_command 7zz ; then
        :
    else
        epm install p7zip
551 552
    fi

553 554 555 556 557 558
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_erc ] ; then
        $SHAREDIR/tools_erc "$@"
        return
    fi
    fatal "Internal error: missed tools_erc"
559

560 561 562
    # FIXME: we need disable output here, ercat can be used for get output
    assure_exists_erc >/dev/null
    # run external command, not the function
563
    local ERC
564 565
    ERC=$(print_command_path erc) || fatal "Missed command erc from installed package erc"
    $ERC "$@"
566 567 568 569 570
}

# will replaced within disabled_ercat in packaged version
ercat()
{
571 572 573 574 575 576 577
    local ERCAT
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_ercat ] ; then
        $SHAREDIR/tools_ercat "$@"
        return
    fi
    fatal "Internal error: missed tools_ercat"
578

579 580 581 582 583
    # FIXME: we need disable output here, ercat can be used for get output
    assure_exists_erc >/dev/null
    # run external command, not the function
    ERCAT=$(print_command_path ercat) || fatal "Missed command ercat from installed package erc"
    $ERCAT "$@"
584 585
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
586 587
estrlist()
{
588 589 590 591 592
    if [ -s $SHAREDIR/tools_estrlist ] ; then
        $SHAREDIR/tools_estrlist "$@"
        return
    fi
    fatal "missed tools_estrlist"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
593 594 595 596
}

onefile_estrlist()
{
597
    internal_tools_estrlist "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
598 599
}

600 601
# will replaced within eget() in packed version
onefile_eget()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
602
{
603 604 605 606 607
    # check for both
    # we really need that cross here,
    is_command curl || assure_exists wget
    is_command wget || assure_exists curl
    internal_tools_eget "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
608 609
}

610
# TODO: improve and drop!
611 612
get_package_type()
{
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
    local i
    case $1 in
        *.deb)
            echo "deb"
            return
            ;;
        *.rpm)
            echo "rpm"
            return
            ;;
        *.txz)
            echo "txz"
            return
            ;;
        *.tbz)
            echo "tbz"
            return
            ;;
        *.exe)
            echo "exe"
            return
            ;;
        *.msi)
            echo "msi"
            return
            ;;
        *.AppImage)
            echo "AppImage"
            return
            ;;
        *)
644 645
            # print extension by default
            echo "$1" | sed -e 's|.*\.||'
646 647 648
            return 1
            ;;
    esac
649 650 651
}


652
# print options description from HELPCMD/HELPOPT lines in the code
653
# args: section_name, [file with code]
654 655
get_help()
{
656 657 658
    if [ "$0" = "/dev/stdin" ] || [ "$0" = "sh" ] ; then
        return
    fi
659
    local F="$0"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
660 661 662
    if [ -n "$2" ] ; then
        is_dirpath "$2" && F="$2" || F="$(dirname $0)/$2"
    fi
663

664
    cat "$F" | grep -- "# $1" | while read -r n ; do
Vitaly Lipatov's avatar
Vitaly Lipatov committed
665 666 667 668 669 670
        if echo "$n" | grep -q "# $1: PART: " ; then
            echo
            echo "$n" | sed -e "s|# $1: PART: ||"
            continue
        fi
        echo "$n" | grep -q "^ *#" && continue
671 672 673
        opt=`echo $n | sed -e "s|) # $1:.*||g" -e 's|"||g' -e 's@^|@@'`
        desc=`echo $n | sed -e "s|.*) # $1:||g"`
        printf "    %-20s %s\n" "$opt" "$desc"
674 675 676
    done
}

677 678
# TODO: get all info by one request (too slow)
set_distro_info()
679
{
680 681 682 683
    # use external distro_info if internal one is missed
    DISTRVENDOR=$PROGDIR/distr_info
    [ -x $DISTRVENDOR ] || DISTRVENDOR=distro_info
    export DISTRVENDOR
684

685 686 687 688 689 690 691
    [ -n "$DISTRNAME" ] || DISTRNAME=$($DISTRVENDOR -d) || fatal "Can't get distro name."
    [ -n "$DISTRVERSION" ] || DISTRVERSION=$($DISTRVENDOR -v)
    if [ -z "$DISTRARCH" ] ; then
        DISTRARCH=$($DISTRVENDOR --distro-arch)
    fi
    DISTRCONTROL="$($DISTRVENDOR -y)"
    [ -n "$BASEDISTRNAME" ] || BASEDISTRNAME=$($DISTRVENDOR -s)
692

693
    [ -n "$TMPDIR" ] || TMPDIR="/tmp"
694 695 696 697
    # TODO: improve BIGTMPDIR conception
    # https://bugzilla.mozilla.org/show_bug.cgi?id=69938
    # https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s15.html
    # https://geekpeach.net/ru/%D0%BA%D0%B0%D0%BA-systemd-tmpfiles-%D0%BE%D1%87%D0%B8%D1%89%D0%B0%D0%B5%D1%82-tmp-%D0%B8%D0%BB%D0%B8-var-tmp-%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0-tmpwatch-%D0%B2-centos-rhel-7
698
    [ -n "$BIGTMPDIR" ] || [ -d "/var/tmp" ] && BIGTMPDIR="/var/tmp" || BIGTMPDIR="$TMPDIR"
699 700 701 702 703
}

# FIXME: detect if not recognized
set_pm_type()
{
704 705 706
    local CMD
    set_distro_info
    set_target_pkg_env
707

708
# override package manager detection result
709 710 711 712 713
if [ -n "$EPM_BACKEND" ] ; then
    PMTYPE=$EPM_BACKEND
    return
fi
# obsoleted
714
if [ -n "$FORCEPM" ] ; then
715 716
    PMTYPE=$FORCEPM
    return
717 718
fi

719
    PMTYPE="$($DISTRVENDOR -g $DISTRNAME/$DISTRVERSION)"
720
}
721

722 723
is_active_systemd()
{
724
    [ "$DISTRCONTROL" = "systemd" ]
725
}
726 727 728

assure_distr()
{
729 730 731
    local TEXT="this option"
    [ -n "$2" ] && TEXT="$2"
    [ "$DISTRNAME" = "$1" ] || fatal "$TEXT supported only for $1 distro"
732
}
733 734 735 736 737

# return delimiter sign in depend of package type
get_pkg_name_delimiter()
{
   local pkgtype="$1"
738
   [ -n "$pkgtype" ] || pkgtype="$PKGFORMAT"
739 740 741 742

   [ "$pkgtype" = "deb" ] && echo "_" && return
   echo "-"
}
743

744
# used via remove_on_exit
745 746
__epm_remove_tmp_files()
{
747 748 749 750 751 752 753 754 755 756 757 758 759
    [ -n "$DEBUG" ] && return 0

    if [ -n "$to_clean_tmp_dirs" ] ; then
        echo "$to_clean_tmp_dirs" | while read p ; do
            rm -rf "$p" 2>/dev/null
        done
    fi

    if [ -n "$to_clean_tmp_files" ] ; then
        echo "$to_clean_tmp_files" | while read p ; do
            rm -f "$p" 2>/dev/null
            rmdir "$(dirname "$p")" 2>/dev/null
        done
760
    fi
761

762 763 764 765
    return 0
}


766 767 768 769 770
remove_on_exit()
{
    trap "__epm_remove_tmp_files" EXIT
    while [ -n "$1" ] ; do
        if [ -d "$1" ] ; then
771 772
            to_clean_tmp_dirs="$to_clean_tmp_dirs
$1"
773
        elif [ -f "$1" ] ; then
774 775
            to_clean_tmp_files="$to_clean_tmp_files
$1"
776 777 778 779 780
        fi
        shift
    done
}

781 782
has_space()
{
783
    estrlist -- has_space "$@"
784
}
785

Vitaly Lipatov's avatar
Vitaly Lipatov committed
786 787
is_url()
{
788
    echo "$1" | grep -q "^[filehtps]*:/"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
789 790
}

791
# print a path to the command if exists in $PATH
792
if a= which which 2>/dev/null >/dev/null ; then
793 794 795 796
    # 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()
{
797
    a= which -- "$1" 2>/dev/null
798
}
799
elif a= type -a type 2>/dev/null >/dev/null ; then
800 801
print_command_path()
{
802
    a= type -fpP -- "$1" 2>/dev/null
803 804 805 806
}
else
print_command_path()
{
807
    a= type "$1" 2>/dev/null | sed -e 's|.* /|/|'
808 809 810 811 812 813 814 815 816
}
fi

# check if <arg> is a real command
is_command()
{
    print_command_path "$1" >/dev/null
}

817
# compatibility layer
818

819
# add realpath if missed
820
if ! is_command realpath ; then
821 822 823 824 825 826 827
realpath()
{
    [ -n "$*" ] || return
    readlink -f "$@"
}
fi

828

829 830 831 832 833
# TODO: use perl if sed -i is not accessible
# sed -i is only supported in GNU sed.
#  sed -i "s/$find/$replace/g" "$@"
#  perl -p -i -e "s/$find/$replace/g" "$@"

834
# add subst if missed
835
if ! is_command subst ; then
836 837 838 839 840
subst()
{
    sed -i -e "$@"
}
fi
841 842 843 844


check_core_commands()
{
845 846 847
    #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?)"
848 849
}