vbm/vbm

656 lines
15 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# vim: ft=sh ts=2 sw=2 sts=2 et
# vbm - vb-linux management utility for
# XBPS, the X Binary Package System
# original author of vpm: Armin Jenewein <a@m2m.pm>, GitHub: @netzverweigerer
# a lot used from: Dave Eddy <dave@daveeddy.com>, GitHub: @bahamas10
# this fork vbm: zenobit from oSoWoSo <pm@osowoso.xyz>, codeberg.org: @oSoWoSo
# For more information about XBPS, see:
# https://github.com/voidlinux/xbps
# Released under the terms of the GNU general public license, version 3+
# see LICENSE file for license information.
# set version number
version="1.4.1"
# disable verbosity by default
verbose=false
# override color settings
colors=auto
# VPM color definitions
numc1=1
numc2=2
numc3=3
numc4=4
numc5=5
numc6=6
numc7=7
numc8=8
c=$(tput sgr0)
c1=${numc1}
c2=${numc2}
c3=${numc3}
c4=${numc4}
c5=${numc5}
c6=${numc6}
c7=${numc7}
c8=${numc8}
## COLORS
#c=$(tput sgr0) # reset
#c1=$(tput setaf 1) # red
#c2=$(tput setaf 2) # green
#c3=$(tput setaf 3) # yellow
#c4=$(tput setaf 4) # blue
#c5=$(tput setaf 5) # magenta
#c6=$(tput setaf 6) # light blue
#c7=$(tput setaf 7) # white
#c8=$(tput setaf 8) # grey
# program name
progname=${0##*/}
# enable or disable colors based on the argument given, i.e.:
# setcolors on # colors on
# setcolors off # colors off
# setcolors auto # colors on or off depending on environment
declare -A COLORS
setcolors () {
local opt=$1
# determine if colors should be enabled or not
if [[ $opt == auto ]]; then
# if stdout is a TTY and the TERM looks like it supports color enable colors
if [[ -t 1 && $TERM == *color* ]]; then
opt='on'
else
opt='off'
fi
fi
case "$opt" in
on)
local i
for i in {1..11}; do
if [[ -n ${COLORS[$i]} ]]; then
continue
fi
COLORS[$i]=$(tput setaf "$i")
done
c1=${COLORS[$numc1]}
c2=${COLORS[$numc2]}
c3=${COLORS[$numc3]}
c4=${COLORS[$numc4]}
c5=${COLORS[$numc5]}
c6=${COLORS[$numc6]}
c7=${COLORS[$numc7]}
c8=${COLORS[$numc8]}
c=$(tput sgr0)
;;
off)
c1=
c2=
c3=
c4=
c5=
c6=
c7=
c8=
c=
unset COLORS
declare -A COLORS
;;
*)
rmsg 255 "unknown color option: '$opt'"
exit 255
;;
esac
}
# print the logo with brackets colorized
getlogo () {
printf '%s[%s%s%s]%s' \
"$c6" \
"$c5" "$progname" \
"$c6" \
"$c"
}
# prints a message (with vbm-prefix)
msg () {
local logo=$(getlogo)
local newline=true
if [[ $1 == '-n' ]]; then
newline=false
shift
fi
printf '%s %s%s%s' "$logo" "$c4" "$*" "$c"
$newline && echo
}
# rmsg - same (but colorized based on return status passed via $1)
rmsg () {
local code=$1
shift
local logo=$(getlogo)
local statuscolor
if ((code == 0)); then
statuscolor=$c7
else
statuscolor=$c1
fi
printf '%s %s%s%s\n' "$logo" "$statuscolor" "$*" "$c"
}
banner () {
echo -n "$c5"
echo ' __ ___ __ _ __ '
printf " \\ V / '_ \\ ' \ "
echo -n "$c2"
echo " $progname - void package management utility for XBPS"
echo -n "$c5"
echo -n ' \_/| .__/_|_|_\'
echo -n "$c2"
echo ' GitHub: https://github.com/netzverweigerer/vpm'
echo -n "$c5"
echo ' |/ '
echo ' ´ '
echo -n "$c"
}
version () {
banner
msg "$progname - Version: $version (GPLv3+)"
msg "original author: Armin Jenewein <a@m2m.pm>, GitHub: @netzverweigerer"
msg "a lot used from: Dave Eddy <dave@daveeddy.com>, GitHub: @bahamas10"
msg "this fork: zenobit from oSoWoSo <pm@osowoso.xyz>, codeberg.org: @oSoWoSo"
msg "XBPS version: $(xbps-query -v --version | sed 's/GIT: UNSET//')"
}
# check if we have UID 0, exit otherwise
rootcheck () {
if [[ $EUID -gt 0 ]]; then
msg "$(tput setaf 1)This operation needs super-user privileges.$(tput sgr 0)"
SUDO=sudo
else
SUDO=''
fi
}
t () {
if [[ -n $show_translations ]]; then
tput setaf 242
echo ' ' "$@"
echo
tput setaf 109
fi
}
wrapcommand() {
local cmd ret
cmd=("$@")
echo "$c4(${cmd[*]}):$c"
"${cmd[@]}"
ret=$?
rmsg "$ret" "[${cmd[*]}], return code was: $ret"
exit "$ret"
}
usage () {
echo "${c2}USAGE:
${c1}${progname} ${c8}[OPTIONS] ${c7}[SUBCOMMANDS] ${c3}[<ARGS>]
${c8} OPTIONS :
${c8}--color=<yes|no|auto>
${c4}Enable/Disable colorized output (default: auto)
${c8}--help
${c4}(same as: help)
${c8}--help-pager
${c4}(same as: helppager)
${c8}--show-translations
${c4}Show XBPS command translations for $progname sub-commands
${c8}--verbose
${c4}Verbose mode (shows XBPS command translations during execution)
${c2} long : ${c7}SUBCOMMANDS${c1} : ${c1}(short) ${c3}<ARGS>
${c2}help
${c4}Show usage information
${c2}helppager ${c1}(hp)
${c4}Show usage information (will pipe output to less/more)
${c2}version ${c1}(v)
${c4}Show version and exit
${c2}about ${c1}(a) ${c3}<pkg>
${c4}Show information about <package>"
t "xbps-query -v -R"
echo "${c2}filelist ${c1}(fl) ${c3}<pkg>
${c4}Show file-list of <package>"
t "xbps-query -v -R -f"
echo "${c2}deps ${c1}(d) ${c3}<pkg>
${c4}Show dependencies for <package>"
t "xbps-query -v -R -x"
echo "${c2}reverse ${c1}(rd) ${c3}<pkg>
${c4}Show reverse dependendies of <package> (see man xbps-query)"
t "xbps-query -v -R -X"
echo "${c2}search ${c1}(s) ${c3}<pkg>
${c4}Search for package"
t "xbps-query -v -Rs"
echo "${c2}searchlib ${c1}(sl) ${c3}<pkg>
${c4}Search for package (multilib exclude)"
t "xbps-query -v -Rs"
echo "${c2}searchfile ${c1}(sf) ${c3}<file>
${c4}Search for package containing <file> (local)"
t "xbps-query -v -o \"*/$1\""
echo "${c2}whatprovides ${c1}(wp) ${c3}<file>
${c4}Search for package containing <file>"
t "xlocate ${c3}<pkg>"
echo "${c2}list ${c1}(ls)
${c4}List installed packages"
t "xbps-query -v -l"
echo "${c2}listw ${c1}(lw)
${c4}List installed packages without their version"
t "xbps-query -l | awk '{ print $2 }' | xargs -n1 xbps-uhelper getpkgname"
echo "${c2}listalternatives ${c1}(la)
${c4}List alternative candidates"
t "xbps-alternatives -l"
echo "${c2}listrepos ${c1}(lr)
${c4}List configured repositories"
echo "${c2}repolist ${c1}(rl)
${c4}Alias for listrepos"
t "xbps-query -v -L"
echo "${c2}sync ${c1}(sy)
${c4}Synchronize remote repository data"
t "xbps-install -S"
echo "${c2}update ${c1}(up)
${c4}Update the system"
t "xbps-install -Suv"
echo "${c2}addrepo ${c1}(ad) ${c3}<ARGS>
${c4}Add an additional repository"
t "xbps-install <ARGS>"
echo "${c2}install ${c1}(i) ${c3}<pkg(s)>
${c4}Install <package(s)>"
t "xbps-install"
echo "${c2}devinstall ${c1}(di) ${c3}<pkg(s)>
${c4}Install <package> and devel-<package>(s)"
t "xbps-install <package> <package>-devel"
echo "${c2}reconfigure ${c1}(rc) ${c3}<pkg>
${c4}Re-configure installed <package>"
t "xbps-reconfigure -v"
echo "${c2}forceinstall ${c1}(fi) ${c3}<pkg(s)>
${c4}Force installation of <package(s)>"
t "xbps-install -f"
echo "${c2}setalternative ${c1}(sa) ${c3}<pkg(s)>
${c4}Set alternative for <package>"
t "xbps-alternatives -s"
echo "${c2}remove ${c1}(rm) ${c3}<pkg(s)>
${c4}Remove <package(s)> from the system"
t "xbps-remove -v "
echo "${c2}removerecursive ${c1}(rr) ${c3}<pkg(s)>
${c4}Recursively remove package(s) (and its dependencies)"
t "xbps-remove -v -R"
echo "${c2}cleanup ${c1}(cl)
${c4}Remove obsolete packages in cachedir"
t "xbps-remove -v -O"
echo "${c2}autoremove ${c1}(ar)
${c4}Remove orphaned packages"
t "xbps-remove -v -o"
echo "${c2} XBPS COMPATIBILITY ${c2}: "
f=(/usr/sbin/xbps-*)
echo "${c4}$progname also understands all unknown XBPS sub-commands, too:"
echo -n "${c2}Example: ${c7}"
selected=${f[$RANDOM % ${#f[@]}]}
echo "$progname ${selected##*-} <ARGS>
${c2}see also: ${c4}/usr/sbin/xbps-* ${c}"
}
setcolors auto
case "$1" in
--color=true|--color=yes|--color=on)
setcolors on
shift
;;
--color=auto)
setcolors auto
shift
;;
--color=false|--color=off|--color=no)
setcolors off
shift
;;
--verbose=true)
shift
verbose=true
;;
--show-translations)
shift
show_translations=1
;;
--help)
shift
usage
exit 255
;;
--help-pager)
shift
"$0" --color=off --help | less
;;
--*)
msg "Unknown option: $1 (try: $progname --help)"
exit 1
;;
esac
if [[ -z $1 ]]; then
usage
exit 0
fi
cmd=$1
if [[ $arg =~ --.* ]]; then
cmd=${arg:2}
fi
shift
case "$cmd" in
about|a)
wrapcommand xbps-query -v -R "$@"
;;
filelist|fl|listfiles)
wrapcommand xbps-query -v -R -f "$@"
;;
deps|dep|dependencies|d)
wrapcommand xbps-query -v -R -x "$@"
;;
reverse|rd)
msg -n "Reverse dependencies for $* "
wrapcommand xbps-query -v -R -X "$@"
;;
searchfile|sf)
msg -n 'searchfile '
wrapcommand xbps-query -v -o "*/$1"
;;
remotesearchfile|rsf)
msg -n 'remotesearchfile '
wrapcommand xbps-query -R -v -o "*/$1"
;;
list|ls)
msg -n 'Installed packages: '
count=0
while read -r _ pkg _; do
((count++))
pkgname=${pkg%-*}
version=${pkg##*-}
printf '%s%d %s%s %s (%s%s%s) [%s%s%s]%s\n' \
"$c8" "$count" \
"$c4" "$pkgname" \
"$c6" \
"$c2" "$version" \
"$c6" \
"$c7" "$pkg" \
"$c6" \
"$c"
done < <(xbps-query -v -l)
;;
listw|lw)
xbps-query -l | awk '{ print $2 }' | xargs -n1 xbps-uhelper getpkgname
;;
listalternative|listalternatives|la)
wrapcommand xbps-alternatives -l "$@"
;;
setalternative|setalternatives|sa)
rootcheck
wrapcommand xbps-alternatives -s "$@"
echo
;;
repolist|listrepos|rl|lr)
code=0
msg -n "Configured repositories (xbps-query -v -L): "
xbps-query -v -L
ret=$?
((ret == 0)) || code=1
rmsg "$ret" "[xbps-query -v -L] return code: $ret"
echo
msg -n "Available sub-repositories (xbps-query -v -Rs void-repo): "
xbps-query -v -Rs void-repo
ret=$?
((ret == 0)) || code=1
rmsg "$ret" "[xbps-query -v -Rs void-repo] return code: $ret"
echo
msg -n "Use \"$progname addrepo <repository>\" to add a sub-repository."
echo
exit "$code"
;;
addrepo|ad)
rootcheck
echo
if (($# < 1)); then
rmsg 255 "ERROR: install: argument missing, try --help."
exit 1
fi
code=0
for repo in "$@"; do
msg "Adding repository: $repo"
$SUDO xbps-install "$repo"
ret=$?
((ret == 0)) || code=1
rmsg "$ret" "[xbps-install $arg] return code: $ret"
msg "Synchronizing remote repository data (xbps-install -S): "
$SUDO xbps-install -S
ret=$?
((ret == 0)) || code=1
rmsg "$ret" "[xbps-install -S] return code: $ret"
done
exit "$code"
;;
sync|sy)
rootcheck
msg -n 'Synchronizing remote repository data '
echo
wrapcommand "$SUDO" xbps-install -S
;;
install|i)
rootcheck
if (($# < 1)); then
rmsg 255 "ERROR: install: argument missing, try --help."
exit 1
fi
msg -n "Installing packages: $* "
echo
wrapcommand "$SUDO" xbps-install "$@"
;;
yesinstall)
rootcheck
if (($# < 1)); then
rmsg 255 "ERROR: install: argument missing, try --help."
exit 1
fi
msg -n "Installing packages (assumed yes): $* "
echo
wrapcommand "$SUDO" xbps-install -y "$@"
;;
devinstall)
rootcheck
if (($# < 1)); then
rmsg 255 "ERROR: devinstall: argument missing, try --help."
exit 1
fi
args=("$@")
code=0
msg "devinstall: Packages will be installed one-by-one"
msg "Use \"forceinstall\" to override this if you know what you're doing."
msg "(Note: forceinstall won't install -devel packages)"
for arg in "${args[@]}"; do
msg "Installing package: $arg (xbps-install $arg) ..."
$SUDO xbps-install "$arg"
ret=$?
((ret == 0)) || code=1
rmsg "$ret" "[xbps-install $arg] return code: $ret"
msg "installing devel package (${arg}-devel):"
$SUDO xbps-install "${arg}-devel"
ret=$?
((ret == 0)) || code=1
rmsg "$ret" "[xbps-install ${arg}-devel] return code: $ret"
done
exit "$code"
;;
forceinstall|fi)
rootcheck
msg -n "Force-Installing Package(s): $* "
echo
wrapcommand "$SUDO" xbps-install -f "$@"
;;
remove|rm)
rootcheck
msg -n "Removing package(s): $* "
echo
wrapcommand "$SUDO" xbps-remove -v "$@"
;;
removerecursive|rr)
rootcheck
msg -n "Removing package(s) recursively: $* "
echo
wrapcommand "$SUDO" xbps-remove -v -R "$@"
;;
reconfigure|rc)
rootcheck
msg -n 'reconfigure: Re-configuring package(s) '
echo
wrapcommand "$SUDO" xbps-reconfigure -v "$@"
;;
autoremove|ar)
rootcheck
msg -n 'autoremove: Removing orphaned packages '
echo
wrapcommand "$SUDO" xbps-remove -v -o
;;
update|upgrade|up)
rootcheck
msg -n 'Running system update '
echo
$SUDO xbps-install -Suv
if [[ $? == 16 ]]; then
msg -n "$(tput setaf 1)Updating xbps $(tput sgr 0)"
$SUDO xbps-install -u xbps
wrapcommand "$SUDO" xbps-install -Suv
else
if [[ $? == 1 ]]; then
msg 'Your system is up to date.'
else
msg $? 'Something goes wrong!'
fi
fi
msg 'Checking if something need restart...'
xcheckrestart
;;
search|s)
msg -n "Searching for: $* "
wrapcommand xbps-query -v -Rs "$*"
;;
# TODO: instead of grep use proper command
searchlib|sl)
msg -n "Searching for: $* "
wrapcommand xbps-query -v -Rs "$*" | grep -v 32bit
;;
cleanup|clean|cl)
msg -n 'Remove obsolete packages in cachedir '
rootcheck
echo
wrapcommand "$SUDO" xbps-remove -v -O "$@"
;;
h|help|-h|--help)
usage
;;
helppager|help-pager|hp)
pager=$PAGER
if [[ -z $pager ]]; then
if command -v less &>/dev/null; then
pager=less
else
pager=more
fi
fi
"$0" --color=off help | $pager
exit 0
;;
version|v)
version
exit 0
;;
whatprovides|wp)
if ! command -v xlocate &>/dev/null; then
rmsg 255 "xlocate not found. Try installing the xtools package."
exit 1
fi
msg -n "relaying to xlocate - use xlocate -S to (re-)build cached DB. "
wrapcommand xlocate "$@"
;;
''|*)
xbpscmd="xbps-$cmd"
if ! command -v "$xbpscmd" &>/dev/null; then
rmsg 255 "Unrecognized $progname subcommand: $cmd (and $xbpscmd does not exist) - Try: $progname help"
echo
exit 1
fi
# xbps-<subcommand> found
msg -n 'relaying to XBPS: '
wrapcommand "$xbpscmd" "$@"
;;
esac
# enjoy and make better if you can...