#!/bin/bash
-function update
-{
- sudo xbps-install -Suv
- return $?
+# Make sure we can actually do anything meaningful:
+SUDO=''
+if (( $EUID != 0 )); then
+ if ! command -pv "sudo" > /dev/null ; then
+ echo 'The `sudo´ command is required but not installed, aborting!'
+ echo 'Alternatively you may run this script as root.'
+ exit 99
+ fi
+ SUDO='sudo'
+fi
+
+# Check/install essential prerequisites:
+preq="dialog fzf gawk grep"
+pinst=""
+for cmd in $preq ; do
+ if ! command -pv "$cmd" > /dev/null ; then
+ pinst="$pinst $cmd"
+ fi
+done
+if [[ -n "$pinst" ]] ; then
+ echo "Installing prerequisites: $pinst"
+ $SUDO xbps-install -Suv $pinst
+ if (( $? != 0 )) ; then
+ echo "Prerequisite installation failed, aborting."
+ exit 98
+ fi
+ echo "Press ENTER to continue ..."
+ read
+ pinst=''
+fi
+
+
+# Set up temporary file storage and trap handlers:
+tmp=$(mktemp -dt xbps-disownedXXXXXX)
+
+function cleanup() {
+ rm -rf $tmp
}
-function maintain
-{
- sudo xbps-remove -Oov
- return $?
+trap cleanup EXIT
+trap cleanup SIGINT
+trap cleanup SIGTERM
+trap cleanup SIGQUIT
+trap cleanup SIGHUP
+
+
+# Create resource file for dialog:
+echo "# dialogrc
+use_colors = ON
+use_shadow = OFF
+screen_color = (WHITE,BLACK,ON)
+shadow_color = (BLACK,BLACK,OFF)
+dialog_color = (WHITE,BLACK,OFF)
+title_color = (WHITE,BLACK,ON)
+border_color = (BLACK,BLACK,ON)
+button_active_color = (BLACK,WHITE,ON)
+button_inactive_color = dialog_color
+button_key_active_color = button_active_color
+button_key_inactive_color = (RED,BLACK,ON)
+button_label_active_color = (BLACK,WHITE,ON)
+button_label_inactive_color = (WHITE,BLACK,ON)
+menubox_color = screen_color
+menubox_border_color = border_color
+item_color = dialog_color
+item_selected_color = (BLACK,WHITE,OFF)
+tag_color = title_color
+tag_selected_color = button_label_active_color
+tag_key_color = button_key_inactive_color
+tag_key_selected_color = (RED,WHITE,ON)
+border2_color = dialog_color
+menubox_border2_color = dialog_color
+" > $tmp/dialogrc
+
+
+# Update repository package database:
+function syncRepo() {
+ $SUDO xbps-install -Sv
}
-function install
-{
- pkg="$( xbps-query -Rs "" |
- grep '^\[-\]' |
- awk '{print $2}' |
- sort -u |
- fzf -i \
- --multi \
- --exact \
- --no-sort \
- --cycle \
- --reverse \
- --margin="4%,1%,1%,2%" \
- --inline-info \
- --preview 'xbps-query -R {1} '\
- --preview-window=right:55%:wrap \
- --header="Select packages to install.
+# Update all installed packages to their latest version:
+function distUpgrade() {
+ $SUDO xbps-install -Suv
+}
+
+# Clean cache by removing obsolete binary packages:
+function cleanCache() {
+ echo "Cleaning package cache ..."
+ $SUDO xbps-remove -Ov
+}
+
+# Remove orphaned packages:
+function reapOrphans() {
+ echo "Searching for orphans ..."
+ $SUDO xbps-remove -ov
+}
+
+# Install new packages:
+function instPkg() {
+ pkg="$( xbps-query -Rs "" |
+ awk '{print $1, $2}' |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -R {2} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to install.
TAB toggle | ENTER proceed | ESC cancel" \
- --prompt="filter> " |
- awk '{print $2}'
- )"
- if [[ -n "$pkg" ]] ; then
- echo "Install:"
- echo "$pkg"
- pkg="$( echo "$pkg" | paste -sd " " )"
- sudo xbps-install -v -S $pkg
- return $?
- fi
- return 42
+ --prompt="filter> " |
+ awk '{print $2}'
+ )"
+ if [[ -n "$pkg" ]] ; then
+ echo "Install:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-install -v -S $pkg
+ return $?
+ fi
+ return 42
}
-function purge
-{
- pkg="$( xbps-query -l |
- awk '{print $1, $2}' |
- sort -u |
- fzf -i \
- --multi \
- --exact \
- --no-sort \
- --cycle \
- --reverse \
- --margin="4%,1%,1%,2%" \
- --inline-info \
- --preview 'xbps-query -S {2} '\
- --preview-window=right:55%:wrap \
- --header="Select packages to purge.
+# Reinstall already installed packages:
+function reinstPkg() {
+ pkg="$( xbps-query -l |
+ awk '{print $1, $2}' |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -R {2} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to reinstall.
TAB toggle | ENTER proceed | ESC cancel" \
- --prompt="filter> " |
- awk '{print $2}'
- )"
-
- if [[ -n "$pkg" ]] ; then
- echo "Purge:"
- echo "$pkg"
- pkg="$( echo "$pkg" | paste -sd " " )"
- sudo xbps-remove -v -R $pkg
- return $?
- fi
- return 42
+ --prompt="filter> " |
+ awk '{print $2}'
+ )"
+ if [[ -n "$pkg" ]] ; then
+ echo "Reinstall:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-install -v -f -S $pkg
+ return $?
+ fi
+ return 42
}
-function hold
-{
- pkg="$( xbps-query -l |
- awk '{print $1, $2}' |
- sort -u |
- fzf -i \
- --multi \
- --exact \
- --no-sort \
- --cycle \
- --reverse \
- --margin="4%,1%,1%,2%" \
- --inline-info \
- --preview 'xbps-query -S {2} '\
- --preview-window=right:55%:wrap \
- --header="Select packages to put on hold.
+# Remove installed packages:
+function purgePkg() {
+ pkg="$( xbps-query -l |
+ awk '{print $1, $2}' |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -S {2} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to purge.
TAB toggle | ENTER proceed | ESC cancel" \
- --prompt="filter> " |
- awk '{print $2}'
- )"
-
- if [[ -n "$pkg" ]] ; then
- echo "Hold:"
- echo "$pkg"
- pkg="$( echo "$pkg" | paste -sd " " )"
- sudo xbps-pkgdb -v -m hold $pkg
- return $?
- fi
- return 42
+ --prompt="filter> " |
+ awk '{print $2}'
+ )"
+
+ if [[ -n "$pkg" ]] ; then
+ echo "Purge:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-remove -v -R $pkg
+ return $?
+ fi
+ return 42
}
-function unhold
-{
- pkg="$( xbps-query -H |
- sort -u |
- fzf -i \
- --multi \
- --exact \
- --no-sort \
- --cycle \
- --reverse \
- --margin="4%,1%,1%,2%" \
- --inline-info \
- --preview 'xbps-query -R {1} '\
- --preview-window=right:55%:wrap \
- --header="Select packages to un-hold.
+# Reconfigure installed packages:
+function reconfPkg() {
+ pkg="$( xbps-query -l |
+ awk '{print $1, $2}' |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -S {2} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to reconfigure.
TAB toggle | ENTER proceed | ESC cancel" \
- --prompt="filter> "
- )"
-
- if [[ -n "$pkg" ]] ; then
- echo "Unhold:"
- echo "$pkg"
- pkg="$( echo "$pkg" | paste -sd " " )"
- sudo xbps-pkgdb -v -m unhold $pkg
- return $?
- fi
- return 42
+ --prompt="filter> " |
+ awk '{print $2}'
+ )"
+
+ if [[ -n "$pkg" ]] ; then
+ echo "Reconfigure:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-reconfigure -f -v $pkg
+ return $?
+ fi
+ return 42
}
-function markmanual
-{
- pkg="$( xbps-query -l |
- awk '{print $1, $2}' |
- sort -u |
- fzf -i \
- --multi \
- --exact \
- --no-sort \
- --cycle \
- --reverse \
- --margin="4%,1%,1%,2%" \
- --inline-info \
- --preview 'xbps-query -S {2} '\
- --preview-window=right:55%:wrap \
- --header="Select packages to mark as manual.
+# Put installed packages on hold:
+function holdPkg() {
+ pkg="$( xbps-query -l |
+ awk '{print $2}' |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -S {1} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to put on hold.
TAB toggle | ENTER proceed | ESC cancel" \
- --prompt="filter> " |
- awk '{print $2}'
- )"
-
- if [[ -n "$pkg" ]] ; then
- echo "Marking as manually installed:"
- echo "$pkg"
- pkg="$( echo "$pkg" | paste -sd " " )"
- sudo xbps-pkgdb -v -m manual $pkg
- return $?
- fi
- return 42
+ --prompt="filter> "
+ )"
+
+ if [[ -n "$pkg" ]] ; then
+ echo "Put on hold:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-pkgdb -v -m hold $pkg
+ return $?
+ fi
+ return 42
}
-function markauto
-{
- pkg="$( xbps-query -m |
- sort -u |
- fzf -i \
- --multi \
- --exact \
- --no-sort \
- --cycle \
- --reverse \
- --margin="4%,1%,1%,2%" \
- --inline-info \
- --preview 'xbps-query -R {1} '\
- --preview-window=right:55%:wrap \
- --header="Select packages to mark as as auto.
+# Unhold packages previously put on hold:
+function unholdPkg() {
+ pkg="$( xbps-query -H |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -R {1} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to unhold.
TAB toggle | ENTER proceed | ESC cancel" \
- --prompt="filter> "
- )"
-
- if [[ -n "$pkg" ]] ; then
- echo "Marking as automatically installed:"
- echo "$pkg"
- pkg="$( echo "$pkg" | paste -sd " " )"
- sudo xbps-pkgdb -v -m auto $pkg
- return $?
- fi
- return 42
+ --prompt="filter> "
+ )"
+
+ if [[ -n "$pkg" ]] ; then
+ echo "Unhold held packages:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-pkgdb -v -m unhold $pkg
+ return $?
+ fi
+ return 42
}
-function statrep
-{
- echo
- case "$1" in
- 0 )
- echo -e "\e[42m [OK] \e[0m"
- ;;
- 42 )
- echo -e "\e[7m [NO CHANGES MADE] \e[0m"
- sleep 1
- return 0
- ;;
- * )
- echo -e "\e[41m [FAILED] \e[0m"
- ;;
- esac
- echo "Press ENTER to continue ..."
- read
+# Mark packages as manually installed:
+function markPkgManual() {
+ pkg="$( xbps-query -l |
+ awk '{print $2}' |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -S {1} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to mark as manual.
+TAB toggle | ENTER proceed | ESC cancel" \
+ --prompt="filter> "
+ )"
+
+ if [[ -n "$pkg" ]] ; then
+ echo "Marking as manually installed:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-pkgdb -v -m manual $pkg
+ return $?
+ fi
+ return 42
}
-function ui
-{
- while : ; do
- clear
- echo
- echo -e " XbpsUI Package Manager"
- echo -e "┌─────────────────────────────────────────────────────────┐"
- echo -e "│ 1 \e[1mU\e[0mpdate System 2 \e[1mM\e[0maintain System │"
- echo -e "│ 3 \e[1mI\e[0mnstall Packages 4 \e[1mP\e[0murge Packages │"
- echo -e "│ 5 Hold Packages 6 Unhold Packages │"
- echo -e "│ 7 Mark Pkgs as Manual 8 Mark Pkgs as Auto │"
- echo -e "│ 0 \e[1mQ\e[0muit │"
- echo -e "└─────────────────────────────────────────────────────────┘"
- echo -n "Enter number or highlighted letter: "
- read -r choice
- choice="$(echo "$choice" | tr '[:upper:]' '[:lower:]' )"
- echo
-
+# Mark packages as automatically installed:
+function markPkgAuto() {
+ pkg="$( xbps-query -m |
+ sort -u |
+ fzf -i \
+ --multi \
+ --exact \
+ --no-sort \
+ --cycle \
+ --reverse \
+ --margin="4%,1%,1%,2%" \
+ --inline-info \
+ --preview 'xbps-query -R {1} '\
+ --preview-window=right:55%:wrap \
+ --header="Select packages to mark as as auto.
+TAB toggle | ENTER proceed | ESC cancel" \
+ --prompt="filter> "
+ )"
+
+ if [[ -n "$pkg" ]] ; then
+ echo "Marking as automatically installed:"
+ echo "$pkg"
+ pkg="$( echo "$pkg" | paste -sd " " )"
+ $SUDO xbps-pkgdb -v -m auto $pkg
+ return $?
+ fi
+ return 42
+}
+
+# Main menu:
+function menu() {
+
+ # NOTE: Using explicit output fd redirection, as dialog's --stdout
+ # option might fail in unexpected ways.
+ exec 3>&1
+ choice=$( \
+ DIALOGRC=$tmp/dialogrc \
+ dialog \
+ --backtitle 'XbpsUI v2' \
+ --begin 1 0 \
+ --cancel-label 'Quit' \
+ --colors \
+ --no-lines \
+ --no-shadow \
+ --menu '\Zb\ZuSelect Operation:' 20 60 15 \
+ 'sync' 'Synchronize repository package database' \
+ 'upgrade' 'Update all packages to their latest version' \
+ 'install' 'Install a new package' \
+ 'reinstall' 'Re-install an already installed package' \
+ 'purge' 'Remove a currently installed package' \
+ 'reconfig' 'Forcibly reconfigure an installed package' \
+ 'clean' 'Remove obsolete packages from cache' \
+ 'orphan' 'Remove orphaned packages' \
+ 'manual' 'Mark packages as manually installed' \
+ 'auto' 'Mark packages as automatically installed' \
+ 'hold' 'Set packages on hold' \
+ 'unhold' 'Unhold held packages' \
+ 2>&1 1>&3 \
+ )
+ res=$?
+ exec 3>&-
+ clear
+ if (( $res != 0 )) ; then
+ # quit / cancel dialog
+ exit 0
+ fi
+
+ # Perform requested operation:
case "$choice" in
- 1|u|update|update-system )
- update
- statrep $?
- ;;
- 2|m|maintain|maintain-system )
- maintain
- statrep $?
- ;;
- 3|i|install|install-packages )
- install
- statrep $?
- ;;
- 4|p|purge|purge-packages )
- purge
- statrep $?
- ;;
- 5|h|hold|hold-packages )
- hold
- statrep $?
- ;;
- 6|u|unhold|unhold-packages )
- unhold
- statrep $?
- ;;
- 7|n|markmanual|manual-packages )
- markmanual
- statrep $?
- ;;
- 8|a|markauto|auto-packages )
- markauto
- statrep $?
- ;;
- 0|q|quit|$'\e'|$'\e'$'\e' )
- exit
- ;;
- '' )
- ;;
- * )
- echo -e "\e[7m Unknown option. \e[0m"
- sleep 1
- ;;
- esac
- done
+ "sync" ) syncRepo ;;
+ "upgrade" ) distUpgrade ;;
+ "install" ) instPkg ;;
+ "reinstall" ) reinstPkg ;;
+ "purge" ) purgePkg ;;
+ "reconfig" ) reconfPkg ;;
+ "clean" ) cleanCache ;;
+ "orphan" ) reapOrphans ;;
+ "manual" ) markPkgManual ;;
+ "auto" ) markPkgAuto ;;
+ "hold" ) holdPkg ;;
+ "unhold" ) unholdPkg ;;
+ * ) echo "Oops, unknown operation!?!" ; false ;;
+ esac
+ res=$?
+ return $res
+}
+
+# Report exit status of an operation:
+function statrep() {
+ echo
+ case "$1" in
+ 0 ) echo -e "\e[42m [OK] \e[0m" ;;
+ 42 ) echo -e "\e[7m [NO CHANGES REQUESTED] \e[0m" ;;
+ * ) echo -e "\e[41m [FAILED] \e[0m" ;;
+ esac
+ echo "Press ENTER to continue ..."
+ read
}
-
-ui
+
+# Main loop
+
+while : ; do
+ menu
+ statrep $?
+done
+
+# EOF