From a54cb0b3ba90c7c51b92de59734a0d10e9685085 Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Fri, 10 Apr 2020 18:09:23 +0200 Subject: [PATCH] * Rewrite of large portions of script; use dialog; support more XBPS actions --- XbpsUI.sh | 641 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 388 insertions(+), 253 deletions(-) diff --git a/XbpsUI.sh b/XbpsUI.sh index dcf7df5..24f7f4f 100755 --- a/XbpsUI.sh +++ b/XbpsUI.sh @@ -1,281 +1,416 @@ #!/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 -- 2.30.2