ProxMenux/scripts/utilities/system_utils.sh
2025-06-30 18:54:16 +02:00

470 lines
17 KiB
Bash

#!/bin/bash
# ==========================================================
# ProxMenu - A menu-driven script for Proxmox VE management
# ==========================================================
# Author : MacRimi
# Copyright : (c) 2024 MacRimi
# License : MIT (https://raw.githubusercontent.com/MacRimi/ProxMenux/main/LICENSE)
# Version : 1.0
# Last Updated: 30/06/2025
# ==========================================================
# Description:
# This script provides an interactive system utilities installer with a
# comprehensive dialog-based interface for Proxmox VE and Linux systems.
# It simplifies the installation and management of essential command-line
# tools and utilities commonly used in server environments.
#
# The script offers both individual utility selection and predefined groups
# for different use cases, ensuring administrators can quickly set up their
# preferred toolset without manual package management.
#
# Supported utility categories:
# - Basic utilities: grc, htop, tree, curl, wget
# - Development tools: git, vim, nano, dos2unix
# - Compression tools: zip, unzip, rsync, cabextract
# - Network tools: iperf3, nmap, tcpdump, nethogs, iptraf-ng, sshpass
# - Analysis tools: jq, ncdu, iotop, btop, iftop
# - System tools: mlocate, net-tools, ipset, msr-tools
# - Virtualization tools: libguestfs-tools, wimtools, genisoimage, chntpw
# - Download tools: axel, aria2
#
# The script automatically handles package name differences across distributions
# and provides detailed feedback on installation success, warnings, and failures.
# It includes built-in troubleshooting for common PATH and command availability
# issues that may occur after package installation.
#
# Configuration ============================================
REPO_URL="https://raw.githubusercontent.com/MacRimi/ProxMenux/main"
BASE_DIR="/usr/local/share/proxmenux"
UTILS_FILE="$BASE_DIR/utils.sh"
VENV_PATH="/opt/googletrans-env"
if [[ -f "$UTILS_FILE" ]]; then
source "$UTILS_FILE"
fi
load_language
initialize_cache
# ==========================================================
install_system_utils() {
command_exists() {
command -v "$1" >/dev/null 2>&1
}
install_single_package() {
local package="$1"
local command_name="${2:-$package}"
local description="$3"
msg_info "$(translate "Installing") $package ($description)..."
local install_success=false
if command_exists apt; then
if apt update >/dev/null 2>&1 && apt install -y "$package" >/dev/null 2>&1; then
install_success=true
fi
elif command_exists yum; then
if yum install -y "$package" >/dev/null 2>&1; then
install_success=true
fi
elif command_exists dnf; then
if dnf install -y "$package" >/dev/null 2>&1; then
install_success=true
fi
elif command_exists pacman; then
if pacman -S --noconfirm "$package" >/dev/null 2>&1; then
install_success=true
fi
elif command_exists zypper; then
if zypper install -y "$package" >/dev/null 2>&1; then
install_success=true
fi
else
cleanup
msg_error "$(translate "No compatible package manager detected")"
return 1
fi
cleanup
if [ "$install_success" = true ]; then
hash -r 2>/dev/null
sleep 1
if command_exists "$command_name"; then
msg_ok "$package $(translate "installed correctly and available")"
return 0
else
msg_warn "$package $(translate "installed but command not immediately available")"
msg_info2 "$(translate "May need to restart terminal")"
return 2
fi
else
msg_error "$(translate "Error installing") $package"
return 1
fi
}
show_main_utilities_menu() {
local choice
choice=$(dialog --clear --backtitle "ProxMenu - $(translate "System Utilities Installer")" \
--title "$(translate "Utilities Installation Menu")" \
--menu "$(translate "Select an option"):" 20 70 12 \
"1" "$(translate "Custom selection")" \
"2" "$(translate "Install ALL utilities")" \
"3" "$(translate "Install basic utilities") (grc, htop, tree, curl, wget)" \
"4" "$(translate "Install development tools") (git, vim, nano)" \
"5" "$(translate "Install compression tools") (zip, unzip, rsync)" \
"6" "$(translate "Install terminal multiplexers") (screen, tmux)" \
"7" "$(translate "Install analysis tools") (jq, ncdu, iotop)" \
"8" "$(translate "Install network tools") (nethogs, nmap, tcpdump, lsof)" \
"9" "$(translate "Verify installations")" \
"0" "$(translate "Return to main menu")" 2>&1 >/dev/tty)
echo "$choice"
}
show_custom_selection() {
local utilities=(
"axel" "$(translate "Download accelerator")" "OFF"
"dos2unix" "$(translate "Convert DOS/Unix text files")" "OFF"
"grc" "$(translate "Generic log/command colorizer")" "OFF"
"htop" "$(translate "Interactive process viewer")" "OFF"
"btop" "$(translate "Modern resource monitor")" "OFF"
"iftop" "$(translate "Real-time network usage")" "OFF"
"iotop" "$(translate "Monitor disk I/O usage")" "OFF"
"iperf3" "$(translate "Network performance testing")" "OFF"
"ipset" "$(translate "Manage IP sets")" "OFF"
"iptraf-ng" "$(translate "Network monitoring tool")" "OFF"
"mlocate" "$(translate "Locate files quickly")" "OFF"
"msr-tools" "$(translate "Access CPU MSRs")" "OFF"
"net-tools" "$(translate "Legacy networking tools")" "OFF"
"sshpass" "$(translate "Non-interactive SSH login")" "OFF"
"tmux" "$(translate "Terminal multiplexer")" "OFF"
"unzip" "$(translate "Extract ZIP files")" "OFF"
"zip" "$(translate "Create ZIP files")" "OFF"
"libguestfs-tools" "$(translate "VM disk utilities")" "OFF"
"aria2" "$(translate "Multi-source downloader")" "OFF"
"cabextract" "$(translate "Extract CAB files")" "OFF"
"wimtools" "$(translate "Manage WIM images")" "OFF"
"genisoimage" "$(translate "Create ISO images")" "OFF"
"chntpw" "$(translate "Edit Windows registry/passwords")" "OFF"
)
local selected
selected=$(dialog --clear --backtitle "ProxMenu - $(translate "Custom Utility Selection")" \
--title "$(translate "Select utilities to install")" \
--checklist "$(translate "Use SPACE to select/deselect, ENTER to confirm")" \
25 80 20 "${utilities[@]}" 2>&1 >/dev/tty)
echo "$selected"
}
install_utility_group() {
local group_name="$1"
shift
local utilities=("$@")
clear
show_proxmenux_logo
msg_title "$(translate "Installing group"): $group_name"
local failed=0
local success=0
local warning=0
declare -A package_to_command=(
["mlocate"]="locate"
["msr-tools"]="rdmsr"
["net-tools"]="netstat"
["libguestfs-tools"]="virt-filesystems"
["aria2"]="aria2c"
["wimtools"]="wimlib-imagex"
)
for util_info in "${utilities[@]}"; do
IFS=':' read -r package command description <<< "$util_info"
local verify_command="${package_to_command[$package]:-$command}"
install_single_package "$package" "$verify_command" "$description"
local install_result=$?
case $install_result in
0) success=$((success + 1)) ;;
1) failed=$((failed + 1)) ;;
2) warning=$((warning + 1)) ;;
esac
done
echo
msg_info2 "$(translate "Installation summary") - $group_name:"
msg_ok "$(translate "Successful"): $success"
[ $warning -gt 0 ] && msg_warn "$(translate "With warnings"): $warning"
[ $failed -gt 0 ] && msg_error "$(translate "Failed"): $failed"
dialog --clear --backtitle "ProxMenu" \
--title "$(translate "Installation Complete")" \
--msgbox "$(translate "Group"): $group_name\n$(translate "Successful"): $success\n$(translate "With warnings"): $warning\n$(translate "Failed"): $failed" 10 50
}
install_selected_utilities() {
local selected="$1"
if [ -z "$selected" ]; then
dialog --clear --backtitle "ProxMenu" \
--title "$(translate "No Selection")" \
--msgbox "$(translate "No utilities were selected")" 8 40
return
fi
clear
show_proxmenux_logo
msg_title "$(translate "Installing selected utilities")"
local failed=0
local success=0
local warning=0
local selected_array
IFS=' ' read -ra selected_array <<< "$selected"
declare -A package_to_command=(
["mlocate"]="locate"
["msr-tools"]="rdmsr"
["net-tools"]="netstat"
["libguestfs-tools"]="virt-filesystems"
["aria2"]="aria2c"
["wimtools"]="wimlib-imagex"
)
for util in "${selected_array[@]}"; do
util=$(echo "$util" | tr -d '"')
local verify_command="${package_to_command[$util]:-$util}"
install_single_package "$util" "$verify_command" "$util"
local install_result=$?
case $install_result in
0) success=$((success + 1)) ;;
1) failed=$((failed + 1)) ;;
2) warning=$((warning + 1)) ;;
esac
done
if [ -f ~/.bashrc ]; then
source ~/.bashrc >/dev/null 2>&1
fi
hash -r 2>/dev/null
echo
msg_info2 "$(translate "Installation summary"):"
msg_ok "$(translate "Successful"): $success"
[ $warning -gt 0 ] && msg_warn "$(translate "With warnings"): $warning"
[ $failed -gt 0 ] && msg_error "$(translate "Failed"): $failed"
dialog --clear --backtitle "ProxMenu" \
--title "$(translate "Installation Complete")" \
--msgbox "$(translate "Selected utilities installation completed")\n$(translate "Successful"): $success\n$(translate "With warnings"): $warning\n$(translate "Failed"): $failed" 12 60
}
verify_installations() {
clear
show_proxmenux_logo
msg_info "$(translate "Verifying all utilities status")..."
local utilities=(
"axel:Download accelerator"
"dialog:Console GUI dialogs"
"dos2unix:Convert DOS/Unix text files"
"grc:Generic log/command colorizer"
"htop:Interactive process viewer"
"btop:Modern resource monitor"
"iftop:Real-time network usage"
"iotop:Monitor disk I/O usage"
"iperf3:Network performance testing"
"ipset:Manage IP sets"
"iptraf-ng:Network monitoring tool"
"locate:Locate files quickly"
"rdmsr:Access CPU MSRs"
"netstat:Legacy networking tools"
"sshpass:Non-interactive SSH login"
"tmux:Terminal multiplexer"
"unzip:Extract ZIP files"
"zip:Create ZIP files"
"virt-filesystems:VM disk utilities"
"aria2c:Multi-source downloader"
"cabextract:Extract CAB files"
"wimlib-imagex:Manage WIM images"
"genisoimage:Create ISO images"
"chntpw:Edit Windows registry/passwords"
)
local available=0
local missing=0
local status_text=""
for util in "${utilities[@]}"; do
IFS=':' read -r cmd desc <<< "$util"
if command_exists "$cmd"; then
status_text+="\n✓ $cmd - $desc"
available=$((available + 1))
else
status_text+="\n✗ $cmd - $desc"
missing=$((missing + 1))
fi
done
cleanup
local summary="$(translate "Total"): $((available + missing))\n$(translate "Available"): $available\n$(translate "Missing"): $missing"
dialog --clear --backtitle "ProxMenu" \
--title "$(translate "Utilities Verification")" \
--msgbox "$summary$status_text" 25 80
}
while true; do
choice=$(show_main_utilities_menu)
case $choice in
1)
selected=$(show_custom_selection)
install_selected_utilities "$selected"
;;
2)
all_utils=(
"axel:axel:Download accelerator"
"dos2unix:dos2unix:Convert DOS/Unix text files"
"grc:grc:Generic log/command colorizer"
"htop:htop:Interactive process viewer"
"btop:btop:Modern resource monitor"
"iftop:iftop:Real-time network usage"
"iotop:iotop:Monitor disk I/O usage"
"iperf3:iperf3:Network performance testing"
"ipset:ipset:Manage IP sets"
"iptraf-ng:iptraf-ng:Network monitoring tool"
"mlocate:locate:Locate files quickly"
"msr-tools:rdmsr:Access CPU MSRs"
"net-tools:netstat:Legacy networking tools"
"sshpass:sshpass:Non-interactive SSH login"
"tmux:tmux:Terminal multiplexer"
"unzip:unzip:Extract ZIP files"
"zip:zip:Create ZIP files"
"libguestfs-tools:virt-filesystems:VM disk utilities"
"aria2:aria2c:Multi-source downloader"
"cabextract:cabextract:Extract CAB files"
"wimtools:wimlib-imagex:Manage WIM images"
"genisoimage:genisoimage:Create ISO images"
"chntpw:chntpw:Edit Windows registry/passwords"
)
install_utility_group "$(translate "ALL Utilities")" "${all_utils[@]}"
;;
3)
basic_utils=(
"grc:grc:Generic Colouriser"
"htop:htop:Process monitor"
"tree:tree:Directory structure"
"curl:curl:Data transfer"
"wget:wget:Web downloader"
)
install_utility_group "$(translate "Basic Utilities")" "${basic_utils[@]}"
;;
4)
dev_utils=(
"git:git:Version control"
"vim:vim:Advanced editor"
"nano:nano:Simple editor"
)
install_utility_group "$(translate "Development Tools")" "${dev_utils[@]}"
;;
5)
compress_utils=(
"zip:zip:ZIP compressor"
"unzip:unzip:ZIP extractor"
"rsync:rsync:File synchronizer"
)
install_utility_group "$(translate "Compression Tools")" "${compress_utils[@]}"
;;
6)
multiplex_utils=(
"screen:screen:Terminal multiplexer"
"tmux:tmux:Advanced multiplexer"
)
install_utility_group "$(translate "Terminal Multiplexers")" "${multiplex_utils[@]}"
;;
7)
analysis_utils=(
"jq:jq:JSON processor"
"ncdu:ncdu:Disk analyzer"
"iotop:iotop:I/O monitor"
)
install_utility_group "$(translate "Analysis Tools")" "${analysis_utils[@]}"
;;
8)
network_utils=(
"nethogs:nethogs:Network monitor"
"nmap:nmap:Network scanner"
"tcpdump:tcpdump:Packet analyzer"
"lsof:lsof:Open files"
)
install_utility_group "$(translate "Network Tools")" "${network_utils[@]}"
;;
9)
verify_installations
;;
0|"")
break
;;
*)
dialog --clear --backtitle "ProxMenu" \
--title "$(translate "Invalid Option")" \
--msgbox "$(translate "Please select a valid option")" 8 40
;;
esac
done
clear
}
install_system_utils