epm-sh-functions 7.85 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
# FIXME on Android: FIX ME! implement ttyname_r() bionic/libc/bionic/stubs.c:366
23 24 25
inputisatty()
{
	# check stdin
Vitaly Lipatov's avatar
Vitaly Lipatov committed
26
	tty -s 2>/dev/null
27 28
}

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

isatty2()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
37 38
	# check stderr
	test -t 2
39 40
}

41 42
check_tty()
{
43 44 45 46 47 48
	isatty2 || return

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

49
	# egrep from busybox may not --color
Vitaly Lipatov's avatar
Vitaly Lipatov committed
50 51
	# egrep from MacOS print help to stderr
	if egrep --help 2>&1 | grep -q -- "--color" ; then
52
		export EGREPCOLOR="--color"
53 54
	fi

55 56 57 58
	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
59 60 61
	export USETTY=1
}

62 63 64 65
: ${BLACK:=0} ${RED:=1} ${GREEN:=2} ${YELLOW:=3} ${BLUE:=4} ${MAGENTA:=5} ${CYAN:=6} ${WHITE:=7}

set_boldcolor()
{
66
	[ "$USETTY" = "1" ] || return
67 68 69 70 71 72 73 74
	{
		echo bold
		echo setaf $1
	} |tput -S
}

restore_color()
{
75
	[ "$USETTY" = "1" ] || return
76 77 78 79 80 81
	{
		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
82 83
echover()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
84
    [ -z "$verbose" ] && return
85
    echo "$*" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
86 87
}

88 89 90
# echo string without EOL
echon()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
91 92
	# default /bin/sh on MacOS does not recognize -n
	/bin/echo -n "$@"
93 94 95
}


Vitaly Lipatov's avatar
Vitaly Lipatov committed
96 97 98
# Used DISTRNAME
set_target_pkg_env()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
99
	[ -n "$DISTRNAME" ] || fatal "Missing DISTRNAME in set_target_pkg_env."
Vitaly Lipatov's avatar
Vitaly Lipatov committed
100 101 102 103 104 105
	PKGFORMAT=$($DISTRVENDOR -p "$DISTRNAME")
	PKGVENDOR=$($DISTRVENDOR -s "$DISTRNAME")
	RPMVENDOR=$($DISTRVENDOR -n "$DISTRNAME")
}

# Print command line and run command line
106
showcmd()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
107
{
108 109 110
	if [ -z "$quiet" ] ; then
		set_boldcolor $GREEN
		local PROMTSIG="\$"
111
		[ "$EFFUID" = 0 ] && PROMTSIG="#"
112 113
		echo " $PROMTSIG $@"
		restore_color
114
	fi >&2
115 116 117 118 119
}

# Print command line and run command line
docmd()
{
120
	showcmd "$@$EXTRA_SHOWDOCMD"
121 122
#FIXME
	$@
Vitaly Lipatov's avatar
Vitaly Lipatov committed
123 124
}

125
# Run every arg with docmd
126 127
docmd_foreach()
{
128
	local cmd pkg
129 130 131 132
	cmd="$1"
	#showcmd "$@"
	shift
	for pkg in "$@" ; do
133
		docmd "$cmd" $pkg
134 135 136
	done
}

137
# Print command line and run command line with SUDO
138
sudocmd()
139
{
140
	showcmd "$SUDO $@"
141
	$SUDO $@
142 143
}

144
# Run every arg with sudocmd
145
# Returns on any error
146 147
sudocmd_foreach()
{
148
	local cmd pkg
149 150 151 152
	cmd="$1"
	#showcmd "$@"
	shift
	for pkg in "$@" ; do
153
		sudocmd "$cmd" $pkg || return
154 155 156
	done
}

157 158
get_firstarg()
{
159
	echon "$1"
160 161 162 163 164 165
}

get_lastarg()
{
	local lastarg
	eval lastarg=\${$#}
166
	echon "$lastarg"
167 168
}

169

Vitaly Lipatov's avatar
Vitaly Lipatov committed
170 171 172 173 174 175 176 177 178 179 180 181 182
filter_strip_spaces()
{
        # possible use just
        #xargs echo
        sed -e "s| \+| |g" | \
                sed -e "s|^ ||" | sed -e "s| \$||"
}

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

183 184 185 186 187 188
# param true false
subst_option()
{
	eval "[ -n \"\$$1\" ]" && echo "$2" || echo "$3"
}

189 190 191 192
store_output()
{
    # use make_temp_file from etersoft-build-utils
    RC_STDOUT=$(mktemp)
193 194
    local CMDSTATUS=$RC_STDOUT.pipestatus
    echo 1 >$CMDSTATUS
195
    #RC_STDERR=$(mktemp)
196
    ( $@ 2>&1 ; echo $? >$CMDSTATUS ) | tee $RC_STDOUT
197 198
    return $(cat $CMDSTATUS)
    # bashism
199
    # http://tldp.org/LDP/abs/html/bashver3.html#PIPEFAILREF
200
    #return $PIPESTATUS
201 202 203 204
}

clean_store_output()
{
205
    rm -f $RC_STDOUT $RC_STDOUT.pipestatus
206 207
}

208
# run epm, possible from side repo
209 210 211 212
epm()
{
	$PROGDIR/epm $@
}
Vitaly Lipatov's avatar
Vitaly Lipatov committed
213 214 215 216 217

# Print error message and stop the program
fatal()
{
	if [ -z "$TEXTDOMAIN" ] ; then
Vitaly Lipatov's avatar
Vitaly Lipatov committed
218
		echo "Error: $@" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
219 220
#	else
#		echog "Error in $0: $@" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
221 222 223
	fi
	exit 1
}
224

Vitaly Lipatov's avatar
Vitaly Lipatov committed
225 226 227 228 229 230 231 232 233 234
# Print warning message
warning()
{
	if [ -z "$TEXTDOMAIN" ] ; then
		echo "Warning: $@" >&2
#	else
#		echog "Error in $0: $@" >&2
	fi
}

235 236 237 238
info()
{
	[ -n "$quiet" ] && return

239 240 241 242 243 244 245
	# print message to stderr if stderr forwarded to (a file)
	if isatty2 ; then
		isatty || return 0
		echo "$@"
	else
		echo "$@" >&2
	fi
246 247
}

248 249
set_sudo()
{
250 251 252
	SUDO=""
	# skip SUDO if disabled
	[ -n "$EPMNOSUDO" ] && return
253 254 255 256
	if [ "$DISTRNAME" = "Cygwin" ] || [ "$DISTRNAME" = "Windows" ] ; then
		# skip sudo using on Windows
		return
	fi
257

258
	EFFUID=`id -u`
259 260

	# do not need sudo
261
	[ $EFFUID = "0" ] && return
262 263 264 265 266

	# use sudo if possible
	which sudo >/dev/null 2>/dev/null && SUDO="sudo" && return

	SUDO="fatal 'Can't find sudo. Please install sudo or run epm under root.'"
267 268
}

269 270
# wait for n seconds (if possible) during executing command
# args: seconds command
271 272 273
withtimeout()
{
	local TO=$(which timeout 2>/dev/null || which gtimeout 2>/dev/null)
Vitaly Lipatov's avatar
Vitaly Lipatov committed
274 275 276 277 278
	if [ -x "$TO" ] ; then
		$TO $@
		return
	fi
	# fallback: drop time arg and run without timeout
279 280
	shift
	$@
281 282
}

283 284 285 286 287 288 289
set_eatmydata()
{
	# skip if disabled
	[ -n "$EPMNOEATMYDATA" ] && return
	# use if possible
	which eatmydata >/dev/null 2>/dev/null || return
	SUDO="$SUDO eatmydata"
290
	[ -n "$verbose" ] && info "Uwaga! eatmydata is installed, we will use it for disable all sync operations."
Vitaly Lipatov's avatar
Vitaly Lipatov committed
291
	return 0
292 293
}

294 295
# 
__get_package_for_command()
296
{
297
	case "$1" in
298
		equery|revdep-rebuild)
299
			echo 'gentoolkit'
300
			;;
301
		update-kernel|remove-old-kernels)
302
			echo 'update-kernel'
303 304 305 306
			;;
	esac
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
307
# TODO: we we can't use epm directly?
308 309 310
assure_exists()
{
	load_helper epm-assure
Vitaly Lipatov's avatar
Vitaly Lipatov committed
311 312
	local package="$2"
	[ -n "$package" ] || package="$(__get_package_for_command "$1")"
313
	__epm_assure "$1" $package || fatal "Can't assure in '$1' command"
314 315
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
316 317
eget()
{
318
	$SHAREDIR/tools-eget "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
319 320
}

321
# TODO: improve and drop!
322 323 324
get_package_type()
{
	local i
325 326 327 328 329 330 331 332 333
	case $1 in
		*.deb)
			echo "deb"
			return
			;;
		*.rpm)
			echo "rpm"
			return
			;;
334 335 336 337 338 339 340 341
		*.txz)
			echo "txz"
			return
			;;
		*.tbz)
			echo "tbz"
			return
			;;
342 343 344 345
		*.exe)
			echo "exe"
			return
			;;
346 347 348 349
		*.msi)
			echo "msi"
			return
			;;
350 351 352 353 354 355 356
		*)
			#fatal "Don't know type of $1"
			# return package name for info
			echo "$1"
			return 1
			;;
	esac
357 358 359
}


360 361 362
# print options description from HELPCMD/HELPOPT lines in the code
get_help()
{
363
    grep -v -- "^#" $0 | grep -- "# $1" | while read n ; do
364 365 366 367 368 369
        opt=$(echo $n | sed -e "s|) # $1:.*||g")
        desc=$(echo $n | sed -e "s|.*) # $1:||g")
        printf "    %-20s %s\n" $opt "$desc"
    done
}

370

371 372 373 374
# FIXME: detect if not recognized
set_pm_type()
{
	local CMD
375 376 377

	# Fill for use: PMTYPE, DISTRNAME, DISTRVERSION, PKGFORMAT, PKGVENDOR, RPMVENDOR
	DISTRVENDOR=$PROGDIR/distr_info
378
	[ -n "$DISTRNAME" ] || DISTRNAME=$($DISTRVENDOR -d) || fatal "Can't get distro name."
379 380 381
	[ -n "$DISTRVERSION" ] || DISTRVERSION=$($DISTRVENDOR -v)
	set_target_pkg_env

382 383 384 385 386 387
# override package manager detection result
if [ -n "$FORCEPM" ] ; then
	PMTYPE=$FORCEPM
	return
fi

388
case $DISTRNAME in
389
	ALTLinux)
390
		CMD="apt-rpm"
391
		#which ds-install 2>/dev/null >/dev/null && CMD=deepsolver-rpm
392 393
		;;
	PCLinux)
394 395
		CMD="apt-rpm"
		;;
396
	Ubuntu|Debian|Mint)
397
		CMD="apt-dpkg"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
398
		#which aptitude 2>/dev/null >/dev/null && CMD=aptitude-dpkg
399
		which snappy 2>/dev/null >/dev/null && CMD=snappy
400
		;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
401
	Mandriva|ROSA)
402 403
		CMD="urpm-rpm"
		;;
404 405
	FreeBSD|NetBSD|OpenBSD|Solaris)
		CMD="pkgsrc"
406
		which pkg 2>/dev/null >/dev/null && CMD=pkgng
407
		;;
408 409 410
	Gentoo)
		CMD="emerge"
		;;
411 412 413 414 415
	ArchLinux)
		CMD="pacman"
		;;
	Fedora|LinuxXP|ASPLinux|CentOS|RHEL|Scientific)
		CMD="yum-rpm"
416
		which dnf 2>/dev/null >/dev/null && test -d /var/lib/dnf/yumdb && CMD=dnf-rpm
417
		;;
418
	Slackware)
419
		CMD="slackpkg"
420
		;;
421 422 423
	SUSE|SLED|SLES)
		CMD="zypper-rpm"
		;;
424 425 426
	ForesightLinux|rPathLinux)
		CMD="conary"
		;;
427
	Windows)
428
		CMD="chocolatey"
429
		;;
430 431 432 433 434 435
	MacOS)
		CMD="homebrew"
		;;
	OpenWRT)
		CMD="ipkg"
		;;
436 437 438
	GNU/Linux/Guix)
		CMD="guix"
		;;
439 440 441
	Android)
		CMD="android"
		;;
442 443 444
	Cygwin)
		CMD="aptcyg"
		;;
445
	*)
446
		fatal "Have no suitable DISTRNAME $DISTRNAME"
447 448 449 450
		;;
esac
PMTYPE=$CMD
}
451