epm-sh-functions 16.5 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
check_core_commands()
{
24 25
	#which --help >/dev/null || fatal "Can't find which command (which package is missed?)"
	# broken which on Debian systems
26
	# TODO: use is_command and print_command_path instead of
27 28 29
	which which >/dev/null || fatal "Can't find which command (which or debianutils package is missed?)"
	which grep >/dev/null || fatal "Can't find grep command (coreutils package is missed?)"
	which sed >/dev/null || fatal "Can't find sed command (sed package is missed?)"
30 31 32
}


33
# FIXME on Android: FIX ME! implement ttyname_r() bionic/libc/bionic/stubs.c:366
34 35 36
inputisatty()
{
	# check stdin
37 38
	#tty -s 2>/dev/null
	test -t 0
39 40
}

41 42
isatty()
{
43 44 45 46 47 48
	# check stdout
	test -t 1
}

isatty2()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
49 50
	# check stderr
	test -t 2
51 52
}

53 54
check_tty()
{
55 56 57 58 59 60
	isatty2 || return

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

61 62
	check_core_commands

Vitaly Lipatov's avatar
Vitaly Lipatov committed
63 64
	# grep -E from busybox may not --color
	# grep -E from MacOS print help to stderr
Vitaly Lipatov's avatar
Vitaly Lipatov committed
65
	if grep -E --help 2>&1 | grep -q -- "--color" ; then
66
		export EGREPCOLOR="--color"
67 68
	fi

69 70 71 72
	which 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
73 74 75
	export USETTY=1
}

76 77 78 79
: ${BLACK:=0} ${RED:=1} ${GREEN:=2} ${YELLOW:=3} ${BLUE:=4} ${MAGENTA:=5} ${CYAN:=6} ${WHITE:=7}

set_boldcolor()
{
80
	[ "$USETTY" = "1" ] || return
81 82 83 84 85 86
	{
		echo bold
		echo setaf $1
	} |tput -S
}

87 88 89 90 91 92 93 94
set_color()
{
	[ "$USETTY" = "1" ] || return
	{
		echo setaf $1
	} |tput -S
}

95 96
restore_color()
{
97
	[ "$USETTY" = "1" ] || return
98 99 100 101 102 103
	{
		echo op; # set Original color Pair.
		echo sgr0; # turn off all special graphics mode (bold in our case).
	} |tput -S
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
104 105
echover()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
106
    [ -z "$verbose" ] && return
107
    echo "$*" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
108 109
}

110 111 112
# echo string without EOL
echon()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
113
	# default /bin/sh on MacOS does not recognize -n
114
	echo -n "$*" 2>/dev/null || a= /bin/echo -n "$*"
115 116 117
}


Vitaly Lipatov's avatar
Vitaly Lipatov committed
118 119 120
# Used DISTRNAME
set_target_pkg_env()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
121
	[ -n "$DISTRNAME" ] || fatal "Missing DISTRNAME in set_target_pkg_env."
122 123 124 125 126
	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
127 128 129
}

# Print command line and run command line
130
showcmd()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
131
{
132 133 134
	if [ -z "$quiet" ] ; then
		set_boldcolor $GREEN
		local PROMTSIG="\$"
135
		is_root && PROMTSIG="#"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
136
		echo " $PROMTSIG $*"
137
		restore_color
138
	fi >&2
139 140
}

141 142 143 144 145 146 147 148 149 150
# Print command
echocmd()
{
	set_boldcolor $GREEN
	local PROMTSIG="\$"
	is_root && PROMTSIG="#"
	echo -n "$PROMTSIG $*"
	restore_color
}

151 152 153
# Print command line and run command line
docmd()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
154
	showcmd "$*$EXTRA_SHOWDOCMD"
155
	"$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
156 157
}

158
# Run every arg with docmd
159 160
docmd_foreach()
{
161
	local cmd pkg
162 163 164 165
	cmd="$1"
	#showcmd "$@"
	shift
	for pkg in "$@" ; do
166
		docmd $cmd $pkg
167 168 169
	done
}

170 171 172 173
# run command line with SUDO
sudorun()
{
	set_sudo
Vitaly Lipatov's avatar
Vitaly Lipatov committed
174
	if [ -z "$SUDO" ] ; then
175
		"$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
176 177 178
		return
	fi
	$SUDO "$@"
179 180
}

181
# Print command line and run command line with SUDO
182
sudocmd()
183
{
184
	set_sudo
185
	[ -n "$SUDO" ] && showcmd "$SUDO $*" || showcmd "$*"
186
	sudorun "$@"
187 188
}

189
# Run every arg with sudocmd
190
# Returns on any error
191 192
sudocmd_foreach()
{
193
	local cmd pkg
194 195 196 197
	cmd="$1"
	#showcmd "$@"
	shift
	for pkg in "$@" ; do
198 199
		# don't quote $cmd here: it can be a command with an args
		sudocmd $cmd $pkg || return
200 201 202
	done
}

203 204 205 206 207 208 209 210
# add realpath if missed
if ! which realpath 2>/dev/null >/dev/null ; then
realpath()
{
	readlink -f "$@"
}
fi

211 212 213 214 215 216 217 218 219 220 221
# print full path to files
make_filepath()
{
	local i
	for i in "$@" ; do
		[ -f "$i" ] || continue
		echo "$i" | grep -q "/" && echo "$i" && continue
		echo "./$i"
	done
}

222 223
get_firstarg()
{
224
	echon "$1"
225 226 227 228 229
}

get_lastarg()
{
	local lastarg
Vitaly Lipatov's avatar
Vitaly Lipatov committed
230
	eval "lastarg=\${$#}"
231
	echon "$lastarg"
232 233
}

234 235 236 237 238 239
# TODO: see etersoft-build-utils/tests/test_isnumber.sh
isnumber()
{
	echo "$*" | filter_strip_spaces | grep -q "^[0-9]\+$"
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
240 241
# copied from strings
# CHECKME: the same like estrlist has ?
Vitaly Lipatov's avatar
Vitaly Lipatov committed
242
# Note: used grep -E! write '[0-9]+(first|two)', not '[0-9]\+...'
Vitaly Lipatov's avatar
Vitaly Lipatov committed
243 244 245 246 247 248 249 250 251 252 253 254
rhas()
{
	echo "$1" | grep -E -q -- "$2"
}

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

Vitaly Lipatov's avatar
Vitaly Lipatov committed
255 256 257 258 259 260 261 262 263 264 265 266 267
filter_strip_spaces()
{
        # possible use just
        #xargs echo
        sed -e "s| \+| |g" | \
                sed -e "s|^ ||" | sed -e "s| \$||"
}

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

268 269 270 271 272 273
# param true false
subst_option()
{
	eval "[ -n \"\$$1\" ]" && echo "$2" || echo "$3"
}

274 275 276 277
store_output()
{
    # use make_temp_file from etersoft-build-utils
    RC_STDOUT=$(mktemp)
278 279
    local CMDSTATUS=$RC_STDOUT.pipestatus
    echo 1 >$CMDSTATUS
280
    #RC_STDERR=$(mktemp)
281
    ( LANG=C $@ 2>&1 ; echo $? >$CMDSTATUS ) | tee $RC_STDOUT
Vitaly Lipatov's avatar
Vitaly Lipatov committed
282
    return "$(cat $CMDSTATUS)"
283
    # bashism
284
    # http://tldp.org/LDP/abs/html/bashver3.html#PIPEFAILREF
285
    #return $PIPESTATUS
286 287
}

288 289 290 291 292 293
showcmd_store_output()
{
    showcmd "$@"
    store_output "$@"
}

294 295
clean_store_output()
{
296
    rm -f $RC_STDOUT $RC_STDOUT.pipestatus
297 298
}

299
# run epm, possible from side repo
300 301
epm()
{
302
	if [ -n "$PROGNAME" ] ; then
303 304 305 306

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

307
		$CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
308 309 310
	else
		epm_main --inscript "$@"
	fi
311 312 313 314 315
}

# run $SUDO epm, possible from side repo
sudoepm()
{
316
	[ -n "$PROGNAME" ] || fatal "Can't use sudo epm call from the piped script"
317 318 319 320

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

321
	sudorun $CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
322
}
Vitaly Lipatov's avatar
Vitaly Lipatov committed
323 324 325 326 327

# Print error message and stop the program
fatal()
{
	if [ -z "$TEXTDOMAIN" ] ; then
328
		echo "Error: $*  (you can discuss the problem in Telegram: https://t.me/useepm)" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
329 330
#	else
#		echog "Error in $0: $@" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
331
	fi
332
#	[ "$TERM" = "screen" ] && echo "(screen detected: waiting ten seconds to exit ...)" >&2 && sleep 10
Vitaly Lipatov's avatar
Vitaly Lipatov committed
333 334
	exit 1
}
335

Vitaly Lipatov's avatar
Vitaly Lipatov committed
336 337 338 339
# Print warning message
warning()
{
	if [ -z "$TEXTDOMAIN" ] ; then
Vitaly Lipatov's avatar
Vitaly Lipatov committed
340
		echo "Warning: $*" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
341 342 343 344 345
#	else
#		echog "Error in $0: $@" >&2
	fi
}

346 347 348 349
info()
{
	[ -n "$quiet" ] && return

350 351 352
	# print message to stderr if stderr forwarded to (a file)
	if isatty2 ; then
		isatty || return 0
Vitaly Lipatov's avatar
Vitaly Lipatov committed
353
		echo "$*"
354
	else
Vitaly Lipatov's avatar
Vitaly Lipatov committed
355
		echo "$*" >&2
356
	fi
357 358
}

359 360 361
# if we have not sudo, returns 1 and set SUDO variable to fatal
SUDO_TESTED=''
SUDO_CMD='sudo'
362 363
set_sudo()
{
364 365 366 367 368 369
	local nofail="$1"

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

370 371 372
	SUDO=""
	# skip SUDO if disabled
	[ -n "$EPMNOSUDO" ] && return
373 374 375 376
	if [ "$DISTRNAME" = "Cygwin" ] || [ "$DISTRNAME" = "Windows" ] ; then
		# skip sudo using on Windows
		return
	fi
377

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

381 382 383
	# start error section
	SUDO_TESTED="1"

384
	if ! which $SUDO_CMD >/dev/null 2>/dev/null ; then
385 386
		[ "$nofail" = "nofail" ] || SUDO="fatal 'Can't find sudo. Please install and tune sudo ('# epm install sudo') or run epm under root.'"
		return "$SUDO_TESTED"
387
	fi
388

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

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

410 411
}

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

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

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

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

461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
# 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
}

476 477 478 479 480 481 482 483 484 485 486

confirm_info()
{
	info "$*"
	if [ -z "$non_interactive" ] ; then
		confirm "Are you sure? [y/N]" || fatal "Exiting"
	fi

}


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

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

regexp_subst()
{
	local expression="$1"
	shift
	sed -i -r -e "$expression" "$@"
}

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

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

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

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

541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
# will replaced within disabled_erc in packaged version
erc()
{
	local ERC
	# use internal eget only if exists
	if [ -s $SHAREDIR/tools_erc ] ; then
		$SHAREDIR/tools_erc "$@"
		return
	fi
	fatal "Internal error: missed tools_erc"

	# FIXME: we need disable output here, ercat can be used for get output
	assure_exists_erc >/dev/null
	# run external command, not the function
	ERC=$(which erc) || fatal "Missed command erc from installed package erc"
	$ERC "$@"
}

# will replaced within disabled_ercat in packaged version
ercat()
{
	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"

	# 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=$(which ercat) || fatal "Missed command ercat from installed package erc"
	$ERCAT "$@"
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
577 578 579 580 581 582 583 584 585 586 587 588 589 590
estrlist()
{
	if [ -s $SHAREDIR/tools_estrlist ] ; then
		$SHAREDIR/tools_estrlist "$@"
		return
	fi
	fatal "missed tools_estrlist"
}

onefile_estrlist()
{
	internal_tools_estrlist "$@"
}

591 592
# will replaced within eget() in packed version
onefile_eget()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
593
{
594 595 596
	# check for both
	which curl 2>/dev/null >/dev/null || assure_exists wget
	which wget 2>/dev/null >/dev/null || assure_exists curl
597
	internal_tools_eget "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
598 599
}

600
# TODO: improve and drop!
601 602 603
get_package_type()
{
	local i
604 605 606 607 608 609 610 611 612
	case $1 in
		*.deb)
			echo "deb"
			return
			;;
		*.rpm)
			echo "rpm"
			return
			;;
613 614 615 616 617 618 619 620
		*.txz)
			echo "txz"
			return
			;;
		*.tbz)
			echo "tbz"
			return
			;;
621 622 623 624
		*.exe)
			echo "exe"
			return
			;;
625 626 627 628
		*.msi)
			echo "msi"
			return
			;;
629 630 631 632
		*.AppImage)
			echo "AppImage"
			return
			;;
633 634 635 636 637 638 639
		*)
			#fatal "Don't know type of $1"
			# return package name for info
			echo "$1"
			return 1
			;;
	esac
640 641 642
}


643
# print options description from HELPCMD/HELPOPT lines in the code
644
# args: section_name, [file with code]
645 646
get_help()
{
647 648 649
    if [ "$0" = "/dev/stdin" ] || [ "$0" = "sh" ] ; then
        return
    fi
650
    local F="$0"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
651 652 653
    if [ -n "$2" ] ; then
        is_dirpath "$2" && F="$2" || F="$(dirname $0)/$2"
    fi
654

655
    cat "$F" | grep -- "# $1" | while read -r n ; do
Vitaly Lipatov's avatar
Vitaly Lipatov committed
656 657 658 659 660 661
        if echo "$n" | grep -q "# $1: PART: " ; then
            echo
            echo "$n" | sed -e "s|# $1: PART: ||"
            continue
        fi
        echo "$n" | grep -q "^ *#" && continue
662 663 664
        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"
665 666 667
    done
}

668 669
# TODO: get all info by one request (too slow)
set_distro_info()
670
{
671
	# use external distro_info if internal one is missed
672
	DISTRVENDOR=$PROGDIR/distr_info
673
	[ -x $DISTRVENDOR ] || DISTRVENDOR=distro_info
674
	export DISTRVENDOR
675

676
	[ -n "$DISTRNAME" ] || DISTRNAME=$($DISTRVENDOR -d) || fatal "Can't get distro name."
677
	[ -n "$DISTRVERSION" ] || DISTRVERSION=$($DISTRVENDOR -v)
678
	if [ -z "$DISTRARCH" ] ; then
Vitaly Lipatov's avatar
Vitaly Lipatov committed
679
		DISTRARCH=$($DISTRVENDOR --distro-arch)
680
	fi
681
	DISTRCONTROL="$($DISTRVENDOR -y)"
682
	[ -n "$BASEDISTRNAME" ] || BASEDISTRNAME=$($DISTRVENDOR -s)
683 684 685 686 687 688

	# 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
	[ -n "$BIGTMPDIR" ] || [ -d "/var/tmp" ] && BIGTMPDIR="/var/tmp" || BIGTMPDIR="/tmp"
689 690 691 692 693 694 695
}

# FIXME: detect if not recognized
set_pm_type()
{
	local CMD
	set_distro_info
696 697
	set_target_pkg_env

698 699 700 701 702 703
# override package manager detection result
if [ -n "$FORCEPM" ] ; then
	PMTYPE=$FORCEPM
	return
fi

704
	PMTYPE="$($DISTRVENDOR -g $DISTRNAME/$DISTRVERSION)"
705
}
706

707 708
is_active_systemd()
{
709
	[ "$DISTRCONTROL" = "systemd" ]
710
}
711 712 713 714 715 716 717

assure_distr()
{
	local TEXT="this option"
	[ -n "$2" ] && TEXT="$2"
	[ "$DISTRNAME" = "$1" ] || fatal "$TEXT supported only for $1 distro"
}
718 719 720 721 722

# return delimiter sign in depend of package type
get_pkg_name_delimiter()
{
   local pkgtype="$1"
723
   [ -n "$pkgtype" ] || pkgtype="$PKGFORMAT"
724 725 726 727

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

729 730 731 732 733 734 735 736 737 738

# don't remove <arg> on exit
__epm_remove_from_tmp_files()
{
   keep="$1"
   [ -r "$keep" ] || return 0
   [ -n "$to_remove_pkg_files" ] || return 0
   to_remove_pkg_files="$(echo "$to_remove_pkg_files" | sed -e "s|$keep||")"
}

739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754
# usage: trap "__epm_remove_tmp_files" EXIT
__epm_remove_tmp_files()
{
    # TODO: move it to exit handler
    if [ -z "$DEBUG" ] ; then
        # TODO: reinvent
        [ -n "$to_remove_pkg_files" ] && rm -f $to_remove_pkg_files
        # hack??
        [ -n "$to_remove_pkg_files" ] && rmdir $(dirname $to_remove_pkg_files | head -n1) 2>/dev/null
        [ -n "$to_remove_pkg_dirs" ] && rmdir $to_remove_pkg_dirs 2>/dev/null
        [ -n "$to_clean_tmp_dirs" ] && rm -rf $to_clean_tmp_dirs 2>/dev/null
    fi
    return 0
}


755 756
has_space()
{
757
    estrlist -- has_space "$@"
758
}
759

Vitaly Lipatov's avatar
Vitaly Lipatov committed
760 761
is_url()
{
762
    echo "$1" | grep -q "^[filehtps]*:/"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
763 764
}

765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790
# print a path to the command if exists in $PATH
if 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
}
elif type -a type 2>/dev/null >/dev/null ; then
print_command_path()
{
    type -fpP -- "$1" 2>/dev/null
}
else
print_command_path()
{
    type "$1" 2>/dev/null | sed -e 's|.* /|/|'
}
fi

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

791
# compatibility layer
792

793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
# add realpath if missed
if ! which realpath 2>/dev/null >/dev/null ; then
realpath()
{
    [ -n "$*" ] || return
    readlink -f "$@"
}
fi

# add subst if missed
if ! which subst 2>/dev/null >/dev/null ; then
subst()
{
    sed -i -e "$@"
}
fi