mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-05-15 21:35:02 +00:00
update beta ProxMenux 1.2.1.1-beta
This commit is contained in:
@@ -1,13 +1,39 @@
|
||||
#!/bin/bash
|
||||
# ==========================================================
|
||||
# ProxMenux - A menu-driven script for Proxmox VE management
|
||||
# ProxMenux - Settings (Configuration Menu)
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# Author : MacRimi
|
||||
# Contributors : cod378
|
||||
# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# Version : 1.1
|
||||
# Last Updated: 04/07/2025
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.1
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# ProxMenux configuration / settings menu. Options are shown
|
||||
# conditionally based on the install type and current state:
|
||||
#
|
||||
# - ProxMenux Monitor (Activate / Deactivate + Show Status)
|
||||
# Only if proxmenux-monitor.service is registered with
|
||||
# systemd. Toggles between active / inactive states.
|
||||
#
|
||||
# - Deactivate Beta Program
|
||||
# Only if config.json has beta_program.status = "active".
|
||||
# Stops beta update prompts; stable updates continue.
|
||||
#
|
||||
# - Change Language
|
||||
# Only on the Translation install type (venv +
|
||||
# config.json.language present). Languages: en / es / fr /
|
||||
# de / it / pt.
|
||||
#
|
||||
# - Show Version Information
|
||||
# Always shown. Reports installed components, files,
|
||||
# virtual environment state and current language.
|
||||
#
|
||||
# - Uninstall ProxMenux
|
||||
# Always shown. Interactive uninstall with optional
|
||||
# dependency removal (jq, dialog, python3-*, ...) and
|
||||
# restoration of /root/.bashrc + /etc/motd backups.
|
||||
# ==========================================================
|
||||
|
||||
# Configuration ============================================
|
||||
|
||||
@@ -1,27 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# ==========================================================
|
||||
# ProxMenuX - Virtual Machine Creator Script
|
||||
# ProxMenux - Virtual Machine Creator Menu
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.0
|
||||
# Last Updated: 07/05/2025
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# This script is part of the central ProxMenux VM creation module. It allows users
|
||||
# to create virtual machines (VMs) in Proxmox VE using either default or advanced
|
||||
# configurations, streamlining the deployment of Linux, Windows, and other systems.
|
||||
# Central VM creation dispatcher for ProxMenux. Presents the user
|
||||
# with OS-family options (NAS, Windows, Linux, macOS, Others) and
|
||||
# routes to the matching ISO selector and configuration wizard.
|
||||
#
|
||||
# Key features:
|
||||
# - Supports virtual disks, import disks, and Controller + NVMe passthrough.
|
||||
# - Automates CPU, RAM, BIOS, network and storage configuration.
|
||||
# - Provides a user-friendly menu to select OS type, ISO image and disk interface.
|
||||
# - Automatically generates a detailed and styled HTML description for each VM.
|
||||
#
|
||||
# All operations are designed to simplify and accelerate VM creation in a
|
||||
# consistent and maintainable way, using ProxMenux standards.
|
||||
# Features:
|
||||
# - Dispatches to ISO selectors: NAS / Windows / Linux / Others.
|
||||
# - Default vs Advanced flows: CPU, RAM, BIOS, network, storage.
|
||||
# - Virtual disks, disk import, and Controller+NVMe passthrough.
|
||||
# - Optional GPU passthrough wizard post-creation.
|
||||
# - Auto-generates a styled HTML description for each VM.
|
||||
# - macOS path is external: launches the OSX-PROXMOX installer.
|
||||
# ==========================================================
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
@@ -144,7 +143,7 @@ while true; do
|
||||
2 "$(translate "Create") VM System Windows" \
|
||||
3 "$(translate "Create") VM System Linux" \
|
||||
"" "" \
|
||||
"" "\Z4──────────────────────────────────────────────────\Zn" \
|
||||
"" "\Z4───────────────── Community Scripts ─────────────────\Zn" \
|
||||
"" "" \
|
||||
4 "$(translate "Create") VM System macOS (OSX-PROXMOX)" \
|
||||
5 "$(translate "Create") VM System Others (based Linux)" \
|
||||
@@ -152,7 +151,6 @@ while true; do
|
||||
6 "$(translate "Return to Main Menu")" \
|
||||
3>&1 1>&2 2>&3)
|
||||
|
||||
|
||||
[[ $? -ne 0 || "$OS_TYPE" == "6" ]] && exec bash "$MENU_REPO/main_menu.sh"
|
||||
|
||||
case "$OS_TYPE" in
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : MIT
|
||||
# License : GPL-3.0
|
||||
# Version : 2.0
|
||||
# Last Updated: 01/04/2026
|
||||
# ==========================================================
|
||||
|
||||
@@ -1,21 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==========================================================
|
||||
# ProxMenux - A menu-driven script for Proxmox VE management
|
||||
# ProxMenux - Proxmox VE Helper Scripts Browser
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.3
|
||||
# Last Updated: 14/03/2025
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# This script provides a simple and efficient way to access and execute Proxmox VE scripts
|
||||
# from the Community Scripts project (https://community-scripts.github.io/ProxmoxVE/).
|
||||
# Front-end for the community-scripts/ProxmoxVE catalog
|
||||
# (https://community-scripts.github.io/ProxmoxVE/) —
|
||||
# the spiritual continuation of tteck's helper scripts.
|
||||
#
|
||||
# It serves as a convenient tool to run key automation scripts that simplify system management,
|
||||
# continuing the great work and legacy of tteck in making Proxmox VE more accessible.
|
||||
# A streamlined solution for executing must-have tools in Proxmox VE.
|
||||
# Loads a curated JSON cache (helpers_cache.json) maintained
|
||||
# by ProxMenux on GitHub, lists categories + scripts with
|
||||
# search and type filters, and executes the chosen script
|
||||
# via "bash <(curl -s <url>)".
|
||||
#
|
||||
# Features:
|
||||
# - Browse scripts by category (Container, OS, Network, …).
|
||||
# - Free-text search across name and description.
|
||||
# - Per-script details: description, notes, default credentials,
|
||||
# default port, website.
|
||||
# - Choice of source (GitHub or Mirror) per script.
|
||||
# - Type labels: LXC / VM / PVE / ADDON / TK / GEN.
|
||||
#
|
||||
# Requires: curl, jq, dialog. Internet access mandatory.
|
||||
# ==========================================================
|
||||
|
||||
|
||||
@@ -44,7 +56,11 @@ for cmd in curl jq dialog; do
|
||||
fi
|
||||
done
|
||||
|
||||
CACHE_JSON=$(curl -s "$HELPERS_JSON_URL")
|
||||
# `--connect-timeout` caps DNS+TCP setup; `--max-time` caps total fetch.
|
||||
# Without these the menu would hang silently for minutes when the network
|
||||
# is down or the upstream is slow, with no signal to the user. Audit
|
||||
# Tier 6 — `menu_Helper_Scripts.sh` curl sin --max-time.
|
||||
CACHE_JSON=$(curl -s --connect-timeout 5 --max-time 15 "$HELPERS_JSON_URL")
|
||||
|
||||
# Validate that the JSON loaded correctly
|
||||
if ! echo "$CACHE_JSON" | jq -e 'if type == "array" and length > 0 then true else false end' >/dev/null 2>&1; then
|
||||
@@ -93,8 +109,10 @@ get_type_label() {
|
||||
download_script() {
|
||||
local url="$1"
|
||||
|
||||
if curl --silent --head --fail "$url" >/dev/null; then
|
||||
bash <(curl -s "$url")
|
||||
# Same timeouts as the cache fetch above so a stalled mirror can't hang
|
||||
# the menu indefinitely. The HEAD probe and the GET both get bounded.
|
||||
if curl --silent --connect-timeout 5 --max-time 10 --head --fail "$url" >/dev/null; then
|
||||
bash <(curl -s --connect-timeout 5 --max-time 60 "$url")
|
||||
else
|
||||
dialog --title "Helper Scripts" --msgbox "$(translate "Error: Failed to download the script.")" 8 70
|
||||
fi
|
||||
@@ -152,28 +170,45 @@ run_script_by_slug() {
|
||||
decode() { echo "$1" | base64 --decode | jq -r "$2"; }
|
||||
|
||||
local first="${script_infos[0]}"
|
||||
local name desc notes port website
|
||||
local name desc notes warnings port website
|
||||
name=$(decode "$first" ".name")
|
||||
desc=$(decode "$first" ".desc")
|
||||
notes=$(decode "$first" '.notes | join("\n")')
|
||||
notes=$(decode "$first" '.notes // [] | join("\n")')
|
||||
# Sprint 11.7: PocketBase upstream tags certain notes with type=="warning".
|
||||
# The cache generator splits them into a separate `warnings` array so the
|
||||
# menu can render them in red with a dedicated WARNINGS header instead of
|
||||
# burying them inside the regular notes block.
|
||||
warnings=$(decode "$first" '.warnings // [] | join("\n")')
|
||||
port=$(decode "$first" ".port // 0")
|
||||
website=$(decode "$first" ".website // empty")
|
||||
|
||||
# Build notes block
|
||||
local notes_dialog=""
|
||||
if [[ -n "$notes" ]]; then
|
||||
while IFS= read -r line; do
|
||||
[[ -z "$line" ]] && continue
|
||||
notes_dialog+="• $line\n"
|
||||
done <<< "$notes"
|
||||
notes_dialog="${notes_dialog%\\n}"
|
||||
fi
|
||||
|
||||
local credentials
|
||||
credentials=$(format_credentials "$first")
|
||||
|
||||
# Build info message
|
||||
local msg="\Zb\Z4$(translate "Description"):\Zn\n$desc"
|
||||
# Build info message — warnings first, in red, so the user sees them
|
||||
# before deciding to launch the script. Sections are separated by a
|
||||
# single \n (one blank line) instead of \n\n; the bullet builders below
|
||||
# also strip their trailing \n so we don't double up. Helper Scripts
|
||||
# like "PVE LXC Apps Update" carry a lot of text and a fixed-height
|
||||
# dialog clips the bottom menu when each section eats two extra rows.
|
||||
local msg="\Zb\Z4$(translate "Description"):\Zn\n$desc"
|
||||
if [[ -n "$warnings" ]]; then
|
||||
local warn_short=""
|
||||
local char_count=0
|
||||
local max_chars=400
|
||||
while IFS= read -r line; do
|
||||
[[ -z "$line" ]] && continue
|
||||
char_count=$(( char_count + ${#line} ))
|
||||
if [[ $char_count -lt $max_chars ]]; then
|
||||
warn_short+="• $line\n"
|
||||
else
|
||||
warn_short+="...\n"
|
||||
break
|
||||
fi
|
||||
done <<< "$warnings"
|
||||
warn_short="${warn_short%\\n}"
|
||||
msg+="\n\Zb\Z1⚠ $(translate "Warnings"):\Zn\n\Z1${warn_short}\Zn"
|
||||
fi
|
||||
if [[ -n "$notes" ]]; then
|
||||
local notes_short=""
|
||||
local char_count=0
|
||||
@@ -188,13 +223,14 @@ local msg="\Zb\Z4$(translate "Description"):\Zn\n$desc"
|
||||
break
|
||||
fi
|
||||
done <<< "$notes"
|
||||
msg+="\n\n\Zb\Z4$(translate "Notes"):\Zn\n$notes_short"
|
||||
notes_short="${notes_short%\\n}"
|
||||
msg+="\n\Zb\Z4$(translate "Notes"):\Zn\n$notes_short"
|
||||
fi
|
||||
[[ -n "$credentials" ]] && msg+="\n\n\Zb\Z4$(translate "Default Credentials"):\Zn\n$credentials"
|
||||
[[ "$port" -gt 0 ]] && msg+="\n\n\Zb\Z4$(translate "Default Port"):\Zn $port"
|
||||
[[ -n "$credentials" ]] && msg+="\n\Zb\Z4$(translate "Default Credentials"):\Zn\n$credentials"
|
||||
[[ "$port" -gt 0 ]] && msg+="\n\Zb\Z4$(translate "Default Port"):\Zn $port"
|
||||
[[ -n "$website" ]] && msg+="\n\Zb\Z4$(translate "Website"):\Zn $website"
|
||||
|
||||
msg+="\n\n$(translate "Choose how to run the script:")"
|
||||
msg+="\n$(translate "Choose how to run the script:")"
|
||||
|
||||
# Build menu: one or two entries per script_info (GH + optional Mirror)
|
||||
declare -a MENU_OPTS=()
|
||||
@@ -251,9 +287,18 @@ local msg="\Zb\Z4$(translate "Description"):\Zn\n$desc"
|
||||
echo
|
||||
echo
|
||||
|
||||
if [[ -n "$desc" || -n "$notes" || -n "$credentials" ]]; then
|
||||
if [[ -n "$desc" || -n "$notes" || -n "$warnings" || -n "$credentials" ]]; then
|
||||
echo -e "$TAB\e[1;36m$(translate "Script Information"):\e[0m"
|
||||
|
||||
if [[ -n "$warnings" ]]; then
|
||||
echo -e "$TAB\e[1;31m⚠ $(translate "Warnings"):\e[0m"
|
||||
while IFS= read -r line; do
|
||||
[[ -z "$line" ]] && continue
|
||||
echo -e "$TAB\e[31m• $line\e[0m"
|
||||
done <<< "$warnings"
|
||||
echo
|
||||
fi
|
||||
|
||||
if [[ -n "$notes" ]]; then
|
||||
echo -e "$TAB\e[1;33m$(translate "Notes"):\e[0m"
|
||||
while IFS= read -r line; do
|
||||
|
||||
@@ -1,12 +1,19 @@
|
||||
#!/bin/bash
|
||||
# ==========================================================
|
||||
# ProxMenux - A menu-driven script for Proxmox VE management
|
||||
# ProxMenux - Post-Install Menu Dispatcher
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.2
|
||||
# Last Updated: 06/07/2025
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# Dispatcher for the post-installation options: Automated
|
||||
# (zero-prompt baseline), Customizable (checklist per category)
|
||||
# and Uninstall Optimizations (reverse any previously applied
|
||||
# change). Also exposes two community post-install scripts
|
||||
# (Proxmox VE Post Install and Microcode) via wget | bash.
|
||||
# ==========================================================
|
||||
|
||||
LOCAL_SCRIPTS="/usr/local/share/proxmenux/scripts"
|
||||
@@ -85,6 +92,137 @@ declare -a PROXMENUX_SCRIPTS=(
|
||||
"Uninstall optimizations|ProxMenux|bash \"$LOCAL_SCRIPTS/post_install/uninstall-tools.sh\""
|
||||
)
|
||||
|
||||
# ==========================================================
|
||||
# Sprint 12C: post-install function update detection.
|
||||
#
|
||||
# The Monitor's startup hook writes updates_available.json. We read it
|
||||
# here so the bash menu can show a conditional "Apply available updates"
|
||||
# entry above Uninstall when bumped versions are detected on disk vs the
|
||||
# user's installed_tools.json.
|
||||
# ==========================================================
|
||||
UPDATES_FILE="/usr/local/share/proxmenux/updates_available.json"
|
||||
UPDATE_WRAPPER="$LOCAL_SCRIPTS/post_install/update_post_install_function.sh"
|
||||
|
||||
count_post_install_updates() {
|
||||
[[ ! -f "$UPDATES_FILE" ]] && { echo 0; return; }
|
||||
command -v jq >/dev/null 2>&1 || { echo 0; return; }
|
||||
jq '.updates | length' "$UPDATES_FILE" 2>/dev/null || echo 0
|
||||
}
|
||||
|
||||
# Build a dialog checklist with the available updates and run the
|
||||
# wrapper script for whichever the user picks. Entries flagged
|
||||
# `source_certain=false` (legacy bool entries) are listed but not
|
||||
# pre-checked; they need a source pick first via the Monitor or a
|
||||
# fresh re-run of the customizable post-install.
|
||||
run_updates_dialog() {
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
msg_error "$(translate "jq is required to apply updates from this menu.")"
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ ! -f "$UPDATES_FILE" ]]; then
|
||||
msg_warn "$(translate "No updates available — run a scan first or wait for the Monitor to refresh.")"
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
local count
|
||||
count=$(count_post_install_updates)
|
||||
if [[ "$count" -eq 0 ]]; then
|
||||
msg_ok "$(translate "All ProxMenux optimizations are up to date.")"
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
# Build the dialog --checklist arguments. Format per row:
|
||||
# <tag> <description> <on|off>
|
||||
# We use the tool key as the tag so the selection callback can map
|
||||
# back to source/function via jq.
|
||||
local checklist=()
|
||||
while IFS=$'\t' read -r key current available; do
|
||||
# Sprint 12C v2: every row is checked by default. Legacy bool
|
||||
# entries default to the auto flow on the wrapper side so the
|
||||
# user no longer needs to do a "source pick" first.
|
||||
local label="${key} (v${current} → v${available})"
|
||||
checklist+=("$key" "$label" "on")
|
||||
done < <(jq -r '.updates[] | [.key, .current_version, .available_version] | @tsv' "$UPDATES_FILE" 2>/dev/null)
|
||||
|
||||
if [[ ${#checklist[@]} -eq 0 ]]; then
|
||||
msg_warn "$(translate "Updates file is empty or unreadable.")"
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
local selected
|
||||
selected=$(dialog --clear --colors --separate-output \
|
||||
--backtitle "ProxMenux" \
|
||||
--title "$(translate "Apply Available Updates")" \
|
||||
--checklist "\n$(translate "Select the optimizations to update. Each one re-runs its post-install function and registers the new version."):\n" \
|
||||
22 78 12 \
|
||||
"${checklist[@]}" 3>&1 1>&2 2>&3)
|
||||
|
||||
local rc=$?
|
||||
clear
|
||||
[[ $rc -ne 0 ]] && return # cancelled
|
||||
[[ -z "$selected" ]] && return
|
||||
|
||||
# Build FUNCTIONS_BATCH (newline-separated source:function:key) by
|
||||
# looking up each picked key in the JSON. The detector already
|
||||
# populates `.source` (defaulting to "auto" for legacy bool entries
|
||||
# that didn't record one) and `.function`, so this is a straight
|
||||
# passthrough. Sprint 12C v2 dropped the source-pick gate.
|
||||
local batch=""
|
||||
while IFS= read -r key; do
|
||||
[[ -z "$key" ]] && continue
|
||||
local entry
|
||||
entry=$(jq -r --arg k "$key" '
|
||||
.updates[] | select(.key == $k) |
|
||||
select(.function != "") |
|
||||
"\((.source // "auto")):\(.function):\(.key)"
|
||||
' "$UPDATES_FILE")
|
||||
[[ -n "$entry" ]] && batch+="${entry}"$'\n'
|
||||
done <<< "$selected"
|
||||
|
||||
if [[ -z "$batch" ]]; then
|
||||
msg_warn "$(translate "Nothing to apply — none of the selected updates have a runnable function on disk.")"
|
||||
sleep 3
|
||||
return
|
||||
fi
|
||||
|
||||
# Hand off to the same wrapper the Monitor uses. Running it directly
|
||||
# (not through a dialog menu) so the user sees the post-install
|
||||
# function output verbatim.
|
||||
EXECUTION_MODE="cli" FUNCTIONS_BATCH="$batch" bash "$UPDATE_WRAPPER"
|
||||
|
||||
# Sprint 12C v2: force the Monitor to rewrite updates_available.json
|
||||
# so the next loop iteration of show_menu sees the post-update state
|
||||
# and the "Apply available updates (N)" entry hides/decrements
|
||||
# correctly. The endpoint is exposed on localhost without auth (POST
|
||||
# is idempotent — just re-runs the parser), so a plain curl works
|
||||
# whether HTTPS is on or off. Falls back to direct file write via
|
||||
# the Python module if the service isn't reachable (host where the
|
||||
# Monitor isn't running yet).
|
||||
local scheme="http"
|
||||
[[ -f /etc/proxmenux/ssl_config.json ]] && \
|
||||
jq -e '.enabled' /etc/proxmenux/ssl_config.json >/dev/null 2>&1 && \
|
||||
scheme="https"
|
||||
if ! curl -k -s --max-time 5 -X POST "${scheme}://127.0.0.1:8008/api/updates/post-install/scan" >/dev/null 2>&1; then
|
||||
# Fallback: regenerate the JSON via the module directly. We
|
||||
# can't import it from system Python because dependencies live
|
||||
# inside the AppImage, so just rewrite the file by re-running
|
||||
# the detector logic in-process via jq + the on-disk scripts.
|
||||
# Simpler: leave the file stale — the next AppImage restart will
|
||||
# rewrite it. The Monitor's _ensure_fresh_cache also auto-
|
||||
# refreshes when installed_tools.json changes, so the API view
|
||||
# is correct even if the bash menu sees a one-cycle-stale list.
|
||||
:
|
||||
fi
|
||||
|
||||
msg_success "$(translate 'Press ENTER to continue...')"
|
||||
read -r _
|
||||
}
|
||||
|
||||
|
||||
declare -a COMMUNITY_SCRIPTS=(
|
||||
"Proxmox VE Post Install|Helper-Scripts|bash -c \"\$(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/post-pve-install.sh); msg_success \\\"\$(translate 'Press ENTER to continue...')\\\"; read -r _\""
|
||||
@@ -119,14 +257,35 @@ format_menu_item() {
|
||||
show_menu() {
|
||||
while true; do
|
||||
local menu_items=()
|
||||
|
||||
|
||||
|
||||
declare -A script_commands
|
||||
local counter=1
|
||||
|
||||
|
||||
# Sprint 12C: re-evaluate available updates on every loop so the
|
||||
# entry vanishes after the user has applied everything (and the
|
||||
# Monitor has rewritten updates_available.json on its next scan).
|
||||
local update_count
|
||||
update_count=$(count_post_install_updates)
|
||||
|
||||
for script in "${PROXMENUX_SCRIPTS[@]}"; do
|
||||
IFS='|' read -r name source command <<< "$script"
|
||||
|
||||
# Insert the conditional "Apply available updates" item right
|
||||
# above "Uninstall optimizations" so it sits next to the
|
||||
# related rollback action and not buried in the middle.
|
||||
if [[ "$name" == "Uninstall optimizations" && "$update_count" -gt 0 ]]; then
|
||||
local update_label
|
||||
update_label="Apply available updates ($update_count)"
|
||||
local translated_update
|
||||
translated_update="$(translate "$update_label")"
|
||||
local formatted_update
|
||||
formatted_update=$(format_menu_item "$translated_update" "ProxMenux")
|
||||
menu_items+=("$counter" "$formatted_update")
|
||||
script_commands["$counter"]="run_updates_dialog"
|
||||
((counter++))
|
||||
fi
|
||||
|
||||
local translated_name="$(translate "$name")"
|
||||
local formatted_item
|
||||
formatted_item=$(format_menu_item "$translated_name" "$source")
|
||||
|
||||
+181
-27
@@ -4,17 +4,32 @@
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.1
|
||||
# Last Updated: 08/07/2025
|
||||
# ==========================================================
|
||||
|
||||
# Description:
|
||||
# Advanced network management and troubleshooting tool for Proxmox VE.
|
||||
# Features include interface detection, bridge management, connectivity testing,
|
||||
# network diagnostics, configuration backup/restore, and automated repairs.
|
||||
# Special thanks to @Andres_Eduardo_Rojas_Moya for contributing the persistent
|
||||
# network naming function and for the original idea.
|
||||
# Network management and troubleshooting tool for Proxmox VE.
|
||||
# Operates exclusively on the classic Debian/Proxmox network stack
|
||||
# (/etc/network/interfaces). Aborts safely on netplan / systemd-networkd
|
||||
# / NetworkManager hosts to avoid corrupting unsupported configurations.
|
||||
#
|
||||
# Features:
|
||||
# - Read-only diagnostics: routing table, connectivity tests, advanced
|
||||
# network statistics, bridge and interface configuration analysis.
|
||||
# - Real-time monitoring launchers (iftop, iptraf-ng).
|
||||
# - Guided repair flows for invalid bridge ports and orphaned interface
|
||||
# configurations, with mandatory backup and step-by-step preview.
|
||||
# - Persistent network interface naming via systemd .link files
|
||||
# (MAC-based, survives hardware changes and PCI re-enumeration).
|
||||
# - Manual backup / restore of /etc/network/interfaces under
|
||||
# /var/backups/proxmenux/.
|
||||
# - Network service restart with confirmation.
|
||||
# - Curated community scripts (e.g., NIC offloading fix for Intel e1000e).
|
||||
#
|
||||
# Acknowledgements:
|
||||
# Persistent network naming function originally contributed by
|
||||
# @Andres_Eduardo_Rojas_Moya.
|
||||
# Configuration ============================================
|
||||
LOCAL_SCRIPTS="/usr/local/share/proxmenux/scripts"
|
||||
BASE_DIR="/usr/local/share/proxmenux"
|
||||
@@ -112,17 +127,9 @@ get_interface_info() {
|
||||
|
||||
# ==========================================================
|
||||
|
||||
show_routing_table_() {
|
||||
local route_info=""
|
||||
route_info+="$(translate "Routing Table")\n"
|
||||
route_info+="$(printf '=%.0s' {1..30})\n\n"
|
||||
route_info+="$(ip route show)\n\n"
|
||||
route_info+="$(translate "Default Gateway"): $(ip route | grep default | awk '{print $3}' | head -1)\n"
|
||||
|
||||
dialog --backtitle "ProxMenux" --title "$(translate "Routing Information")" \
|
||||
--msgbox "$route_info" 20 80
|
||||
}
|
||||
|
||||
# Note: previous `show_routing_table_` (with trailing underscore) was
|
||||
# dead code — never referenced anywhere. Removed in Sprint 10T.7.
|
||||
# `show_routing_table` below is the active implementation.
|
||||
|
||||
show_routing_table() {
|
||||
local route_info=""
|
||||
@@ -929,9 +936,21 @@ restore_network_backup() {
|
||||
|
||||
if dialog --backtitle "ProxMenux" --title "$(translate "Restart Network")" \
|
||||
--yesno "\n$(translate "Do you want to restart the network service now to apply changes?")" 8 60; then
|
||||
if systemctl restart networking; then
|
||||
# Capture stdout+stderr and check the exit code directly
|
||||
# via the assignment's success — `$?` after a command-
|
||||
# substitution assignment is the substitution's exit code,
|
||||
# which is fragile (non-zero shell options affect it).
|
||||
local _restart_err
|
||||
if _restart_err=$(systemctl restart networking 2>&1); then
|
||||
dialog --backtitle "ProxMenux" --title "$(translate "Network Restarted")" \
|
||||
--msgbox "\n$(translate "Network service restarted successfully.")" 8 50
|
||||
else
|
||||
# Surface the failure — silent failure left the user
|
||||
# thinking the restart worked while they're actually
|
||||
# locked out of network. Audit Tier 7 — restore_network_backup
|
||||
# no reporta fallo del restart de networking.
|
||||
dialog --backtitle "ProxMenux" --title "$(translate "Network Restart Failed")" \
|
||||
--msgbox "\n$(translate "systemctl restart networking failed:")\n\n${_restart_err:-unknown error}\n\n$(translate "Restored config is on disk; reboot the host to apply.")" 14 70
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -939,26 +958,160 @@ restore_network_backup() {
|
||||
}
|
||||
|
||||
|
||||
launch_iftop() {
|
||||
if ! command -v iftop &>/dev/null; then
|
||||
apt-get update -qq && apt-get install -y iftop &>/dev/null
|
||||
# ---------------------------------------------------------------
|
||||
# Shared helper for the monitoring tool launchers.
|
||||
# Ensures a given network tool is installed using the canonical
|
||||
# repo + install pattern from global/utils-install-functions.sh.
|
||||
# Args: package_name verify_command description
|
||||
# Returns: 0 on success, 1 on failure (with the user already
|
||||
# acknowledged via "Press Enter to return to menu").
|
||||
# ---------------------------------------------------------------
|
||||
_ensure_network_tool() {
|
||||
local pkg="$1"
|
||||
local cmd="${2:-$pkg}"
|
||||
local desc="${3:-$pkg}"
|
||||
|
||||
if command -v "$cmd" &>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f "$LOCAL_SCRIPTS/global/utils-install-functions.sh" ]]; then
|
||||
source "$LOCAL_SCRIPTS/global/utils-install-functions.sh"
|
||||
fi
|
||||
|
||||
if ! type ensure_repositories &>/dev/null || ! type install_single_package &>/dev/null; then
|
||||
clear
|
||||
show_proxmenux_logo
|
||||
msg_title "$(translate "Installing") $pkg"
|
||||
msg_error "$(translate "Required install helpers not available.")"
|
||||
msg_warn "$(translate "Cannot find") global/utils-install-functions.sh"
|
||||
echo -e ""
|
||||
msg_success "$(translate "Press Enter to return to menu...")"
|
||||
read -r
|
||||
return 1
|
||||
fi
|
||||
|
||||
clear
|
||||
show_proxmenux_logo
|
||||
msg_title "$(translate "Installing") $pkg"
|
||||
|
||||
if ! ensure_repositories; then
|
||||
msg_error "$(translate "Failed to configure repositories. Installation aborted.")"
|
||||
echo -e ""
|
||||
msg_success "$(translate "Press Enter to return to menu...")"
|
||||
read -r
|
||||
return 1
|
||||
fi
|
||||
|
||||
install_single_package "$pkg" "$cmd" "$desc"
|
||||
local rc=$?
|
||||
|
||||
if [[ $rc -eq 1 ]]; then
|
||||
echo -e ""
|
||||
msg_success "$(translate "Press Enter to return to menu...")"
|
||||
read -r
|
||||
return 1
|
||||
fi
|
||||
|
||||
# rc=0 (installed and available) or rc=2 (installed, hash refresh pending —
|
||||
# invoking the binary by name through PATH lookup still works).
|
||||
return 0
|
||||
}
|
||||
|
||||
launch_iftop() {
|
||||
_ensure_network_tool "iftop" "iftop" "Real-time network usage" || return
|
||||
|
||||
dialog --backtitle "ProxMenux" --title "$(translate "iftop usage")" --msgbox "\n$(translate "To exit iftop, press q")" 8 50
|
||||
clear
|
||||
iftop
|
||||
}
|
||||
|
||||
launch_iptraf() {
|
||||
if ! command -v iptraf-ng &>/dev/null; then
|
||||
apt-get update -qq && apt-get install -y iptraf-ng &>/dev/null
|
||||
fi
|
||||
_ensure_network_tool "iptraf-ng" "iptraf-ng" "Network monitoring tool" || return
|
||||
|
||||
dialog --backtitle "ProxMenux" --title "$(translate "iptraf-ng usage")" --msgbox "\n$(translate "To exit iptraf-ng, press x")" 8 50
|
||||
clear
|
||||
iptraf-ng
|
||||
}
|
||||
|
||||
launch_iperf3() {
|
||||
_ensure_network_tool "iperf3" "iperf3" "Network bandwidth testing" || return
|
||||
|
||||
# Mode selection
|
||||
local mode
|
||||
mode=$(dialog --backtitle "ProxMenux" \
|
||||
--title "$(translate "iperf3 - Bandwidth test")" \
|
||||
--menu "\n$(translate "Choose iperf3 mode:")" 12 70 2 \
|
||||
"1" "$(translate "Server (listen for incoming tests on TCP 5201)")" \
|
||||
"2" "$(translate "Client (run a bandwidth test to a server)")" \
|
||||
3>&1 1>&2 2>&3) || return
|
||||
|
||||
case "$mode" in
|
||||
1)
|
||||
# Server mode
|
||||
dialog --backtitle "ProxMenux" --title "$(translate "iperf3 server")" \
|
||||
--msgbox "\n$(translate "Server will listen on TCP port 5201.")\n\n$(translate "Press Ctrl+C to stop the server and return to menu.")" 11 65
|
||||
|
||||
show_proxmenux_logo
|
||||
msg_title "$(translate "iperf3 - Bandwidth test (Server mode)")"
|
||||
|
||||
echo -e "${TAB}${BGN}$(translate "Listening on:")${CL} ${BL}TCP 0.0.0.0:5201${CL}"
|
||||
echo -e "${TAB}${BGN}$(translate "To stop:")${CL} ${BL}Ctrl+C${CL}"
|
||||
echo -e ""
|
||||
echo -e "${BOLD}─────────── $(translate "iperf3 server output") ───────────${CL}"
|
||||
echo -e ""
|
||||
|
||||
iperf3 -s
|
||||
|
||||
echo -e ""
|
||||
msg_success "$(translate "Server stopped. Press Enter to return to menu...")"
|
||||
read -r
|
||||
;;
|
||||
2)
|
||||
# Client mode
|
||||
local target
|
||||
target=$(dialog --backtitle "ProxMenux" --title "$(translate "iperf3 client")" \
|
||||
--inputbox "\n$(translate "Enter the iperf3 server IP or hostname:")" 10 60 \
|
||||
3>&1 1>&2 2>&3) || return
|
||||
|
||||
# Trim whitespace from input
|
||||
target=$(echo "$target" | tr -d '[:space:]')
|
||||
|
||||
if [[ -z "$target" ]]; then
|
||||
dialog --backtitle "ProxMenux" --title "$(translate "Invalid input")" \
|
||||
--msgbox "\n$(translate "No server IP or hostname provided.")" 8 55
|
||||
return 1
|
||||
fi
|
||||
|
||||
show_proxmenux_logo
|
||||
msg_title "$(translate "iperf3 - Bandwidth test (Client mode)")"
|
||||
|
||||
echo -e "${TAB}${BGN}$(translate "Target server:")${CL} ${BL}$target${CL}"
|
||||
echo -e "${TAB}${BGN}$(translate "Port:")${CL} ${BL}TCP 5201${CL}"
|
||||
echo -e "${TAB}${BGN}$(translate "Duration:")${CL} ${BL}10 $(translate "seconds (default)")${CL}"
|
||||
echo -e ""
|
||||
echo -e "${BOLD}─────────── $(translate "iperf3 client output") ───────────${CL}"
|
||||
echo -e ""
|
||||
|
||||
if iperf3 -c "$target"; then
|
||||
echo -e ""
|
||||
msg_ok "$(translate "Bandwidth test completed successfully")"
|
||||
else
|
||||
echo -e ""
|
||||
msg_error "$(translate "iperf3 test failed")"
|
||||
msg_warn "$(translate "Check that:")"
|
||||
echo -e "${TAB}• $(translate "iperf3 server is running on") ${BL}$target${CL}"
|
||||
echo -e "${TAB}• $(translate "TCP port 5201 is reachable (firewall on server)")"
|
||||
echo -e "${TAB}• $(translate "Network connectivity to") ${BL}$target${CL}"
|
||||
fi
|
||||
|
||||
echo -e ""
|
||||
msg_success "$(translate "Press Enter to return to menu...")"
|
||||
read -r
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
# ==========================================================
|
||||
|
||||
@@ -989,6 +1142,7 @@ confirm_and_run() {
|
||||
declare -a PROXMENUX_SCRIPTS=(
|
||||
"Real-time network usage (iftop)||launch_iftop"
|
||||
"Network monitoring tool (iptraf-ng)||launch_iptraf"
|
||||
"Bandwidth test (iperf3)||launch_iperf3"
|
||||
"Show Routing Table||show_routing_table"
|
||||
"Test Connectivity||test_connectivity"
|
||||
"Advanced Diagnostics||advanced_network_diagnostics"
|
||||
@@ -1075,7 +1229,7 @@ show_menu() {
|
||||
--backtitle "ProxMenux" \
|
||||
--title "$(translate "Network Management")" \
|
||||
--menu "\n$(translate "Select a network management option:"):\n" \
|
||||
26 78 19 \
|
||||
28 78 19 \
|
||||
"${menu_items[@]}" 2>&1 1>&3)
|
||||
exit_status=$?
|
||||
exec 3>&-
|
||||
|
||||
@@ -1,11 +1,25 @@
|
||||
#!/bin/bash
|
||||
# ==========================================================
|
||||
# ProxMenux - Security Menu
|
||||
# ============================================
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.0
|
||||
# ============================================
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# Dispatcher for security tools shipped with ProxMenux. Loads the
|
||||
# selected installer/manager script and returns to the main menu
|
||||
# on cancel.
|
||||
#
|
||||
# Features:
|
||||
# - Fail2Ban — intrusion prevention for SSH and the Proxmox /
|
||||
# ProxMenux Monitor web interfaces, with auto-detected firewall
|
||||
# backend (nftables / iptables).
|
||||
# - Lynis — security auditing tool installed from upstream
|
||||
# GitHub (always latest), with run-audit and update actions.
|
||||
# ==========================================================
|
||||
|
||||
SCRIPT_TITLE="Security Tools"
|
||||
|
||||
|
||||
+23
-15
@@ -1,12 +1,18 @@
|
||||
#!/bin/bash
|
||||
# ==========================================================
|
||||
# ProxMenux - Network Storage Manager Menu
|
||||
# ProxMenux - Storage & Share Manager Menu
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : MIT
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.2
|
||||
# Last Updated: $(date +%d/%m/%Y)
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# Dispatcher for the Storage & Share Manager menu. Two blocks:
|
||||
# HOST (register external or local storage as Proxmox storage,
|
||||
# plus the local shared directory helper) and LXC (bind mount
|
||||
# manager, NFS / Samba client and server for privileged CTs).
|
||||
# ==========================================================
|
||||
|
||||
# Configuration
|
||||
@@ -27,21 +33,23 @@ initialize_cache
|
||||
while true; do
|
||||
OPTION=$(dialog --colors --backtitle "ProxMenux" \
|
||||
--title "$(translate "Storage & Share Manager")" \
|
||||
--menu "\n$(translate "Select an option:")" 26 78 17 \
|
||||
--menu "\n$(translate "Select an option:")" 28 78 17 \
|
||||
"" "\Z4──────────────────────── HOST ─────────────────────────\Zn" \
|
||||
"1" "$(translate "Configure NFS shared on Host")" \
|
||||
"2" "$(translate "Configure Samba shared on Host")" \
|
||||
"3" "$(translate "Configure Local Shared on Host")" \
|
||||
"1" "$(translate "Add NFS share as Proxmox Storage")" \
|
||||
"2" "$(translate "Add Samba share as Proxmox Storage")" \
|
||||
"3" "$(translate "Add iSCSI Target as Proxmox Storage")" \
|
||||
"4" "$(translate "Add Local Disk as Proxmox Storage")" \
|
||||
"5" "$(translate "Add iSCSI Target as Proxmox Storage")" \
|
||||
"" "" \
|
||||
"" "\Z4─────────────── Host-only resources ──────────────────\Zn" \
|
||||
"5" "$(translate "Add Shared Directory on Host")" \
|
||||
"" "" \
|
||||
"" "\Z4──────────────────────── LXC ─────────────────────────\Zn" \
|
||||
"6" "$(translate "Configure LXC Mount Points (Host ↔ Container)")" \
|
||||
"" "" \
|
||||
"7" "$(translate "Configure NFS Client in LXC (only privileged)")" \
|
||||
"7" "$(translate "Configure NFS Client in LXC (only privileged)")" \
|
||||
"8" "$(translate "Configure Samba Client in LXC (only privileged)")" \
|
||||
"9" "$(translate "Configure NFS Server in LXC (only privileged)")" \
|
||||
"10" "$(translate "configure Samba Server in LXC (only privileged)")" \
|
||||
"9" "$(translate "Configure NFS Server in LXC (only privileged)")" \
|
||||
"10" "$(translate "Configure Samba Server in LXC (only privileged)")" \
|
||||
"" "" \
|
||||
"h" "$(translate "Help & Info (commands)")" \
|
||||
"0" "$(translate "Return to Main Menu")" \
|
||||
@@ -61,21 +69,21 @@ while true; do
|
||||
bash "$LOCAL_SCRIPTS/share/samba_host.sh"
|
||||
;;
|
||||
3)
|
||||
bash "$LOCAL_SCRIPTS/share/local-shared-manager.sh"
|
||||
bash "$LOCAL_SCRIPTS/share/iscsi_host.sh"
|
||||
;;
|
||||
4)
|
||||
bash "$LOCAL_SCRIPTS/share/disk_host.sh"
|
||||
;;
|
||||
5)
|
||||
bash "$LOCAL_SCRIPTS/share/iscsi_host.sh"
|
||||
bash "$LOCAL_SCRIPTS/share/local-shared-manager.sh"
|
||||
;;
|
||||
6)
|
||||
bash "$LOCAL_SCRIPTS/share/lxc-mount-manager_minimal.sh"
|
||||
;;
|
||||
7)
|
||||
bash "$LOCAL_SCRIPTS/share/nfs_client.sh"
|
||||
;;
|
||||
8)
|
||||
;;
|
||||
8)
|
||||
bash "$LOCAL_SCRIPTS/share/samba_client.sh"
|
||||
;;
|
||||
9)
|
||||
|
||||
@@ -1,13 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==========================================================
|
||||
# ProxMenux - A menu-driven script for Proxmox VE management
|
||||
# ProxMenux - Utilities Menu
|
||||
# ==========================================================
|
||||
# Author : MacRimi
|
||||
# Copyright : (c) 2024 MacRimi
|
||||
# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)
|
||||
# License : GPL-3.0
|
||||
# https://github.com/MacRimi/ProxMenux/blob/main/LICENSE
|
||||
# Version : 1.0
|
||||
# Last Updated: 02/07/2025
|
||||
# ==========================================================
|
||||
# Description:
|
||||
# Dispatcher for the Utilities & Tools section. Six options that
|
||||
# cover ISO creation, system utility installation, Proxmox updates,
|
||||
# major-version upgrade (PVE 8 → 9) and VM portability (OVA / OVF).
|
||||
#
|
||||
# Features:
|
||||
# - UUP Dump ISO creator: build official Windows ISOs from UUP
|
||||
# Dump using a shared link.
|
||||
# - System Utilities Installer: 26 curated CLI tools (htop, btop,
|
||||
# iperf3, jq, tmux, ...) in custom-pick or predefined groups.
|
||||
# - Proxmox System Update: repos hygiene + apt update + apt
|
||||
# dist-upgrade with reboot prompt (delegates to per-version
|
||||
# worker scripts in global/).
|
||||
# - Upgrade PVE 8 to PVE 9: automated or interactive major-version
|
||||
# upgrade with pre-checks, repo migration and post-upgrade
|
||||
# validation. Manual guide alternative also exposed.
|
||||
# - Export VM to OVA / OVF: convert a Proxmox VM to a portable
|
||||
# OVA archive or OVF directory (VMware / VirtualBox / etc).
|
||||
# - Import VM from OVA / OVF: import a VMware / VirtualBox /
|
||||
# ProxMenux export back into Proxmox.
|
||||
# ==========================================================
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user