epm-sh-functions 19.7 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
# Print command line and run command line
108
showcmd()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
109
{
110 111 112 113 114 115 116
    if [ -z "$quiet" ] ; then
        set_boldcolor $GREEN
        local PROMTSIG="\$"
        is_root && PROMTSIG="#"
        echo " $PROMTSIG $*"
        restore_color
    fi >&2
117 118
}

119 120 121
# Print command
echocmd()
{
122 123 124 125 126
    set_boldcolor $GREEN
    local PROMTSIG="\$"
    is_root && PROMTSIG="#"
    echo -n "$PROMTSIG $*"
    restore_color
127 128
}

129 130 131
# Print command line and run command line
docmd()
{
132 133
    showcmd "$*$EXTRA_SHOWDOCMD"
    "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
134 135
}

136
# Run every arg with docmd
137 138
docmd_foreach()
{
139 140 141 142 143 144 145
    local cmd pkg
    cmd="$1"
    #showcmd "$@"
    shift
    for pkg in "$@" ; do
        docmd $cmd $pkg
    done
146 147
}

148 149 150
# run command line with SUDO
sudorun()
{
151 152 153 154 155 156
    set_sudo
    if [ -z "$SUDO" ] ; then
        "$@"
        return
    fi
    $SUDO "$@"
157 158
}

159
# Print command line and run command line with SUDO
160
sudocmd()
161
{
162 163 164
    set_sudo
    [ -n "$SUDO" ] && showcmd "$SUDO $*" || showcmd "$*"
    sudorun "$@"
165 166
}

167
# Run every arg with sudocmd
168
# Returns on any error
169 170
sudocmd_foreach()
{
171 172 173 174 175 176 177 178
    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
179 180
}

181 182 183
# print full path to files
make_filepath()
{
184 185 186 187 188 189
    local i
    for i in "$@" ; do
        [ -f "$i" ] || continue
        echo "$i" | grep -q "/" && echo "$i" && continue
        echo "./$i"
    done
190 191
}

192 193
get_firstarg()
{
194
    echon "$1"
195 196 197 198
}

get_lastarg()
{
199 200 201
    local lastarg
    eval "lastarg=\${$#}"
    echon "$lastarg"
202 203
}

204 205 206
# TODO: see etersoft-build-utils/tests/test_isnumber.sh
isnumber()
{
207
    echo "$*" | filter_strip_spaces | grep -q "^[0-9]\+$"
208 209
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
210 211
# copied from strings
# CHECKME: the same like estrlist has ?
Vitaly Lipatov's avatar
Vitaly Lipatov committed
212
# Note: used grep -E! write '[0-9]+(first|two)', not '[0-9]\+...'
Vitaly Lipatov's avatar
Vitaly Lipatov committed
213 214
rhas()
{
215
    echo "$1" | grep -E -q -- "$2"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
216 217 218 219 220 221 222 223 224
}

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

Vitaly Lipatov's avatar
Vitaly Lipatov committed
225 226 227 228 229 230 231 232 233 234 235 236 237
filter_strip_spaces()
{
        # possible use just
        #xargs echo
        sed -e "s| \+| |g" | \
                sed -e "s|^ ||" | sed -e "s| \$||"
}

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

238 239 240 241 242 243

# 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()
{
244
    echo "$*" | sed -e 's/[]()$*.^|[]/\\&/g'
245 246 247
}


248 249 250
# param true false
subst_option()
{
251
    eval "[ -n \"\$$1\" ]" && echo "$2" || echo "$3"
252 253
}

254 255 256
store_output()
{
    # use make_temp_file from etersoft-build-utils
257
    RC_STDOUT="$(mktemp)"
258 259
    local CMDSTATUS=$RC_STDOUT.pipestatus
    echo 1 >$CMDSTATUS
260
    #RC_STDERR=$(mktemp)
261
    ( LANG=C $@ 2>&1 ; echo $? >$CMDSTATUS ) | tee $RC_STDOUT
Vitaly Lipatov's avatar
Vitaly Lipatov committed
262
    return "$(cat $CMDSTATUS)"
263
    # bashism
264
    # http://tldp.org/LDP/abs/html/bashver3.html#PIPEFAILREF
265
    #return $PIPESTATUS
266 267
}

268 269 270 271 272 273
showcmd_store_output()
{
    showcmd "$@"
    store_output "$@"
}

274 275
clean_store_output()
{
276
    rm -f $RC_STDOUT $RC_STDOUT.pipestatus
277 278
}

279
# run epm, possible from side repo
280 281
epm()
{
282
    if [ "$EPMMODE" = "pipe" ] ; then
283
        epm_main --inscript "$@"
284
        return
285
    fi
286 287 288 289 290 291

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

    $CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
292 293 294 295 296
}

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

299 300
    local bashopt=''
    [ -n "$verbose" ] && bashopt='-x'
301

302
    sudorun $CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
303
}
Vitaly Lipatov's avatar
Vitaly Lipatov committed
304 305 306 307

# Print error message and stop the program
fatal()
{
308
    if [ -z "$TEXTDOMAIN" ] ; then
309 310 311 312
        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
313 314 315 316 317
#    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
318
}
319

Vitaly Lipatov's avatar
Vitaly Lipatov committed
320 321 322
# Print warning message
warning()
{
323
    if [ -z "$TEXTDOMAIN" ] ; then
324 325 326 327
        set_color $YELLOW >&2
        echo -n "WARNING: " >&2
        restore_color >&2
        echo "$*" >&2
328 329 330
#    else
#        echog "Error in $0: $@" >&2
    fi
Vitaly Lipatov's avatar
Vitaly Lipatov committed
331 332
}

333 334
info()
{
335
    [ -n "$quiet" ] && return
336

337 338 339 340 341 342 343
    # print message to stderr if stderr forwarded to (a file)
    if isatty2 ; then
        isatty || return 0
        echo "$*"
    else
        echo "$*" >&2
    fi
344 345
}

346 347 348
# if we have not sudo, returns 1 and set SUDO variable to fatal
SUDO_TESTED=''
SUDO_CMD='sudo'
349 350
set_sudo()
{
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
    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
372
        [ "$nofail" = "nofail" ] || SUDO="fatal 'For this operation run epm under root, or install and tune sudo (http://altlinux.org/sudo)'"
373
        SUDO_TESTED="2"
374 375 376 377 378
        return "$SUDO_TESTED"
    fi

    # if input is a console
    if inputisatty && isatty && isatty2 ; then
379 380 381
        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
382
                [ "$nofail" = "nofail" ] || SUDO="fatal 'For this operation run epm under root, or install and tune sudo (http://altlinux.org/sudo)'"
383
                SUDO_TESTED="3"
384 385
                return "$SUDO_TESTED"
            fi
386 387 388 389
        fi
    else
        # use sudo if one is tuned and tuned without password
        if ! $SUDO_CMD -l -n >/dev/null 2>/dev/null ; then
390
            [ "$nofail" = "nofail" ] || SUDO="fatal 'Can't use sudo (only passwordless sudo is supported here). Please run epm under root or check http://altlinux.org/sudo '"
391
            SUDO_TESTED="4"
392 393 394 395 396 397 398 399 400 401
            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"
402

403 404
}

405 406 407
# return TRUE if we can run privileged command
sudo_allowed()
{
408
    set_sudo nofail
409 410
}

411 412
# wait for n seconds (if possible) during executing command
# args: seconds command
413 414
withtimeout()
{
415 416 417 418 419 420 421 422 423
    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
    #"$@"
424 425
}

426 427
set_eatmydata()
{
428 429 430 431 432 433 434 435 436 437 438
    # 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
439 440
}

441 442
# 
__get_package_for_command()
443
{
444 445 446 447 448 449 450 451
    case "$1" in
        equery|revdep-rebuild)
            echo 'gentoolkit'
            ;;
        update-kernel|remove-old-kernels)
            echo 'update-kernel'
            ;;
    esac
452 453
}

454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
# 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
}

469 470 471

confirm_info()
{
472 473 474 475
    info "$*"
    if [ -z "$non_interactive" ] ; then
        confirm "Are you sure? [y/N]" || fatal "Exiting"
    fi
476 477 478 479

}


480 481
is_root()
{
482 483
    local EFFUID="$(id -u)"
    [ "$EFFUID" = "0" ]
484 485
}

486 487
assure_root()
{
488
    is_root || fatal "run me only under root"
489 490
}

491 492 493 494 495 496 497 498 499
esu()
{
    if is_root ; then
        if [ -n "$*" ] ; then
            [ -n "$quiet" ] || showcmd "$*"
            exec "$@"
        else
            # just shell
            showcmd "su -"
500
            a= exec su -
501 502 503 504 505 506
        fi
    fi

    set_pm_type


Vitaly Lipatov's avatar
Vitaly Lipatov committed
507 508 509 510 511 512 513
# TODO:
#quote() {
#    for arg in "$@"; do
#        printf '%s\n' "$arg" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/"
#    done
#}

514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
    escape_args()
    {
        local output=''
        while [ -n "$1" ] ; do
            if has_space "$1" ; then
                [ -n "$output" ] && output="$output '$1'" || output="'$1'"
            else
                [ -n "$output" ] && output="$output $1" || output="$1"
            fi
            shift
        done
        echo "$output"
    }

    escaped="$(escape_args "$@")"


    # sudo is not accessible, will ask root password
    if ! set_sudo ; then
        #info "Enter root password:"
        if [ -n "$*" ] ; then
            [ -n "$quiet" ] || showcmd "su - -c $escaped"
536
            a= exec su - -c "$escaped"
537 538 539
        else
            # just shell
            showcmd "su -"
540
            a= exec su -
541 542 543 544 545 546 547 548 549 550 551 552 553
        fi
    fi

    #info "You can be asked about your password:"
    if [ -n "$*" ] ; then
        [ -n "$quiet" ] || showcmd "$SUDO su - -c $escaped"
        $SUDO su - -c "$escaped"
    else
        showcmd "$SUDO su -"
        $SUDO su -
    fi
}

554 555
regexp_subst()
{
556 557 558
    local expression="$1"
    shift
    sed -i -r -e "$expression" "$@"
559 560
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
561
# TODO: we we can't use epm directly?
562 563
assure_exists()
{
564 565 566 567 568 569
    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"
570 571
}

572 573
assure_exists_erc()
{
574 575 576
    load_helper epm-assure
    local package="erc"
    ( direct='' epm_assure "$package" ) || epm ei erc || fatal "erc is not available to install."
577 578
}

579
# will replaced within disabled_eget in packaged version
Vitaly Lipatov's avatar
Vitaly Lipatov committed
580
eget()
581
{
582 583
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_eget ] ; then
584
        ( EGET_BACKEND=$eget_backend $CMDSHELL $SHAREDIR/tools_eget "$@" )
585 586 587
        return
    fi
    fatal "Internal error: missed tools_eget"
588

Vitaly Lipatov's avatar
Vitaly Lipatov committed
589
    local EGET
590 591 592 593 594
    # 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 "$@"
595 596
}

597 598 599
# will replaced within disabled_erc in packaged version
erc()
{
600

601 602 603 604 605
    # 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
606 607
    fi

608 609
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_erc ] ; then
610
        $CMDSHELL $SHAREDIR/tools_erc "$@"
611 612 613
        return
    fi
    fatal "Internal error: missed tools_erc"
614

615 616 617
    # FIXME: we need disable output here, ercat can be used for get output
    assure_exists_erc >/dev/null
    # run external command, not the function
618
    local ERC
619 620
    ERC=$(print_command_path erc) || fatal "Missed command erc from installed package erc"
    $ERC "$@"
621 622 623 624 625
}

# will replaced within disabled_ercat in packaged version
ercat()
{
626 627 628
    local ERCAT
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_ercat ] ; then
629
        $CMDSHELL $SHAREDIR/tools_ercat "$@"
630 631 632
        return
    fi
    fatal "Internal error: missed tools_ercat"
633

634 635 636 637 638
    # 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 "$@"
639 640
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
641 642
estrlist()
{
643
    if [ -s $SHAREDIR/tools_estrlist ] ; then
644
        $CMDSHELL $SHAREDIR/tools_estrlist "$@"
645 646 647
        return
    fi
    fatal "missed tools_estrlist"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
648 649 650 651
}

onefile_estrlist()
{
652
    internal_tools_estrlist "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
653 654
}

655 656
# will replaced within eget() in packed version
onefile_eget()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
657
{
658 659 660 661 662
    # 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
663 664
}

665
# TODO: improve and drop!
666 667
get_package_type()
{
668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
    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
            ;;
        *)
699 700
            # print extension by default
            echo "$1" | sed -e 's|.*\.||'
701 702 703
            return 1
            ;;
    esac
704 705 706
}


707
# print options description from HELPCMD/HELPOPT lines in the code
708
# args: section_name, [file with code]
709 710
get_help()
{
711 712 713
    if [ "$0" = "/dev/stdin" ] || [ "$0" = "sh" ] ; then
        return
    fi
714
    local F="$0"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
715 716 717
    if [ -n "$2" ] ; then
        is_dirpath "$2" && F="$2" || F="$(dirname $0)/$2"
    fi
718

719
    cat "$F" | grep -- "# $1" | while read -r n ; do
Vitaly Lipatov's avatar
Vitaly Lipatov committed
720 721 722 723 724 725
        if echo "$n" | grep -q "# $1: PART: " ; then
            echo
            echo "$n" | sed -e "s|# $1: PART: ||"
            continue
        fi
        echo "$n" | grep -q "^ *#" && continue
726 727 728
        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"
729 730 731
    done
}

732 733
# TODO: get all info by one request (too slow)
set_distro_info()
734
{
735 736 737 738
    # use external distro_info if internal one is missed
    DISTRVENDOR=$PROGDIR/distr_info
    [ -x $DISTRVENDOR ] || DISTRVENDOR=distro_info
    export DISTRVENDOR
739

740 741 742 743 744 745 746 747
    # export pack of variables:
    # BASEDISTRNAME
    # DISTRNAME
    # DISTRVERSION
    # DISTRARCH
    # DISTRCONTROL
    # PMTYPE
    eval $($DISTRVENDOR --print-eepm-env)
748

749
    [ -n "$TMPDIR" ] || TMPDIR="/tmp"
750 751 752 753
    # 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
754
    [ -n "$BIGTMPDIR" ] || [ -d "/var/tmp" ] && BIGTMPDIR="/var/tmp" || BIGTMPDIR="$TMPDIR"
755 756 757 758 759
}

# FIXME: detect if not recognized
set_pm_type()
{
760 761
    local CMD
    set_distro_info
762

763
# override package manager detection result
764 765 766 767 768
if [ -n "$EPM_BACKEND" ] ; then
    PMTYPE=$EPM_BACKEND
    return
fi
# obsoleted
769
if [ -n "$FORCEPM" ] ; then
770 771
    PMTYPE=$FORCEPM
    return
772 773
fi

774
}
775

776 777
is_active_systemd()
{
778
    [ "$DISTRCONTROL" = "systemd" ]
779
}
780 781 782

assure_distr()
{
783 784 785
    local TEXT="this option"
    [ -n "$2" ] && TEXT="$2"
    [ "$DISTRNAME" = "$1" ] || fatal "$TEXT supported only for $1 distro"
786
}
787 788 789 790 791

# return delimiter sign in depend of package type
get_pkg_name_delimiter()
{
   local pkgtype="$1"
792
   [ -n "$pkgtype" ] || pkgtype="$PKGFORMAT"
793 794 795 796

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

798
# used via remove_on_exit
799 800
__epm_remove_tmp_files()
{
801
    trap "-" EXIT
802 803 804 805 806 807 808 809 810 811 812 813 814
    [ -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
815
    fi
816

817 818 819 820
    return 0
}


821 822
remove_on_exit()
{
823 824 825 826
    if [ -z "$set_remove_on_exit" ] ; then
        trap "__epm_remove_tmp_files" EXIT
        set_remove_on_exit=1
    fi
827 828
    while [ -n "$1" ] ; do
        if [ -d "$1" ] ; then
829 830
            to_clean_tmp_dirs="$to_clean_tmp_dirs
$1"
831
        elif [ -f "$1" ] ; then
832 833
            to_clean_tmp_files="$to_clean_tmp_files
$1"
834 835 836 837 838
        fi
        shift
    done
}

839 840 841 842 843
#has_space()
#{
#    estrlist -- has_space "$@"
#}
# use internal implementation for speed
844 845
has_space()
{
846 847 848
        # not for dash:
        [ "$1" != "${1/ //}" ]
        # [ "$(echo "$*" | sed -e "s| ||")" != "$*" ]
849
}
850

851

Vitaly Lipatov's avatar
Vitaly Lipatov committed
852 853
is_url()
{
854
    echo "$1" | grep -q "^[filehtps]*:/"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
855 856
}

857
# print a path to the command if exists in $PATH
858
if a= which which 2>/dev/null >/dev/null ; then
859 860 861 862
    # 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()
{
863
    a= which -- "$1" 2>/dev/null
864
}
865
elif a= type -a type 2>/dev/null >/dev/null ; then
866 867
print_command_path()
{
868
    a= type -fpP -- "$1" 2>/dev/null
869 870 871 872
}
else
print_command_path()
{
873
    a= type "$1" 2>/dev/null | sed -e 's|.* /|/|'
874 875 876 877 878 879 880 881 882
}
fi

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

883
# compatibility layer
884

885
# add realpath if missed
886
if ! is_command realpath ; then
887 888 889 890 891 892 893
realpath()
{
    [ -n "$*" ] || return
    readlink -f "$@"
}
fi

894

895 896 897 898 899
# 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" "$@"

900
# add subst if missed
901
if ! is_command subst ; then
902 903 904 905 906
subst()
{
    sed -i -e "$@"
}
fi
907 908 909 910


check_core_commands()
{
911 912 913
    #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?)"
914 915
}