* Rewrite of large portions of script; use dialog; support more XBPS actions
authorUrban Wallasch <urban.wallasch@freenet.de>
Fri, 10 Apr 2020 16:09:23 +0000 (18:09 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Fri, 10 Apr 2020 16:09:23 +0000 (18:09 +0200)
XbpsUI.sh

index dcf7df5f54059a64974c76c82a64c8262138c188..24f7f4f60092bae10f05438dc14e208628ed1355 100755 (executable)
--- a/XbpsUI.sh
+++ b/XbpsUI.sh
 #!/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