Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ Versions follow [Semantic Versioning](https://semver.org/).

## [Unreleased]

## [2.12.1] - 2026-09-19

### Fixed
- Action and snapshot menus now draw a closed frame: every row is padded to the box width and gets a right
border; long guest names in the menu titles are truncated instead of overflowing.

### Changed
- README screenshots regenerated from v2.12.1 on a real PVE 9.2 host; the obsolete, unreferenced
`docs/screenshots/Screenshot.png` (pre-2.8 UI) was removed.

## [2.12.0] - 2026-09-19

### Security
Expand Down Expand Up @@ -153,7 +163,8 @@ Early version with basic console and snapshot management. Replaced by the v2.8.0

---

[Unreleased]: https://github.com/TimInTech/proxmox-manager/compare/v2.12.0...HEAD
[Unreleased]: https://github.com/TimInTech/proxmox-manager/compare/v2.12.1...HEAD
[2.12.1]: https://github.com/TimInTech/proxmox-manager/compare/v2.12.0...v2.12.1
[2.12.0]: https://github.com/TimInTech/proxmox-manager/compare/v2026.05.04...v2.12.0
[2.8.4]: https://github.com/TimInTech/proxmox-manager/compare/v2.8.3...v2.8.4
[2.8.3]: https://github.com/TimInTech/proxmox-manager/compare/v2.8.2...v2.8.3
Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
║ ██████╔╝ ██╔████╔██║ ███████║ ██╔██╗ ██║ ║
║ ██╔═══╝ ██║╚██╔╝██║ ██╔══██║ ██║╚██╗██║ ║
║ ██║ ██║ ╚═╝ ██║ ██║ ██║ ██║ ╚████║ ║
║ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ v2.12.0 ║
║ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ v2.12.1 ║
║ ║
║ Proxmox VM/CT Manager · Single Bash · No Dependencies ║
╚══════════════════════════════════════════════════════════╝
Expand Down Expand Up @@ -227,7 +227,11 @@ cp completions/pman.zsh ~/.zsh/completions/_pman

## 📋 Changelog

### 🆕 [v2.12.0](CHANGELOG.md) — 2026-09-19
### 🆕 [v2.12.1](CHANGELOG.md) — 2026-09-19

> Action and snapshot menus draw a closed frame · README screenshots regenerated

### [v2.12.0](CHANGELOG.md) — 2026-09-19

| Issue | Change |
|---|---|
Expand Down
Binary file removed docs/screenshots/Screenshot.png
Binary file not shown.
Binary file modified docs/screenshots/screenshot-action-menu.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/screenshot-tui.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
77 changes: 33 additions & 44 deletions proxmox-manager.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env bash
# Proxmox VM/CT Management Tool
# Version 2.12.0 — 2026-09-19
# Version 2.12.1 — 2026-09-19
# - fix: action and snapshot menus draw a closed frame (right border, padded rows)
# - fix: #33 TUI frames aligned by visible width; long guest names fit/truncate; PVE version parsed correctly
# - feat: #28 show current IP addresses for running VMs/CTs
# - security: #31 config files parsed as allowlisted data; private log files; no %b on user text
Expand Down Expand Up @@ -983,7 +984,7 @@ action_menu() {
local st
st="$(status_of "$id" "$ty")"

local W=52
local W=53
echo
_draw_line_top $W

Expand All @@ -994,50 +995,37 @@ action_menu() {
VM) printf -v ty_col '%b%s%b' "${BLUE_BRIGHT}${BOLD}" "$ty" "${NC}" ;;
*) ty_col="${BOLD}${ty}${NC}" ;;
esac
printf '%b%s%b %s %s %b(%s)%b\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"$ty_col" \
"${BOLD}${id}${NC}" \
"${DIM}" "$name" "${NC}"
# " TY ID (" + name + ")" + right margin must fit into W - 2
local name_max=$((W - 2 - 2 - ${#ty} - 1 - ${#id} - 3 - 1 - 2))
_box_content "${CYAN}" "${LINE_V}" $W \
" ${ty_col} ${BOLD}${id}${NC} ${DIM}($(_truncate "$name" "$name_max"))${NC}"

# Status row — use _sym_for_status to avoid indirect expansion under set -u
local st_sym
st_sym="$(_sym_for_status "$st")"
printf '%b%s%b Status: ' "${CYAN}" "${LINE_V}" "${NC}"
_status_sym_color "$st" "$st_sym"
printf ' '
_status_color "$st" "$st"
printf '\n'
_box_content "${CYAN}" "${LINE_V}" $W \
" Status: $(_status_sym_color "$st" "$st_sym") $(_status_color "$st" "$st")"

_draw_line_mid $W

# Actions
printf '%b%s%b %b1%b) Start %b2%b) Stop %b3%b) Restart\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"${GREEN_BRIGHT}" "${NC}" \
"${RED_BRIGHT}" "${NC}" \
"${YELLOW_BRIGHT}" "${NC}"
printf '%b%s%b %b4%b) Status %b5%b) Console %b6%b) Snapshots\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"${CYAN_BRIGHT}" "${NC}" \
"${CYAN_BRIGHT}" "${NC}" \
"${CYAN_BRIGHT}" "${NC}"
printf '%b%s%b %b7%b) IP info\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"${CYAN_BRIGHT}" "${NC}"
local row
printf -v row ' %b1%b) Start %b2%b) Stop %b3%b) Restart' \
"${GREEN_BRIGHT}" "${NC}" "${RED_BRIGHT}" "${NC}" "${YELLOW_BRIGHT}" "${NC}"
_box_content "${CYAN}" "${LINE_V}" $W "$row"
printf -v row ' %b4%b) Status %b5%b) Console %b6%b) Snapshots' \
"${CYAN_BRIGHT}" "${NC}" "${CYAN_BRIGHT}" "${NC}" "${CYAN_BRIGHT}" "${NC}"
_box_content "${CYAN}" "${LINE_V}" $W "$row"
if [[ "$ty" == "VM" ]]; then
printf '%b%s%b %b8%b) SPICE info %b9%b) Enable SPICE\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"${CYAN_BRIGHT}" "${NC}" \
"${CYAN_BRIGHT}" "${NC}"
printf '%b%s%b %b10%b) Back\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"${DIM}" "${NC}"
printf -v row ' %b7%b) IP info %b8%b) SPICE info %b9%b) Enable SPICE' \
"${CYAN_BRIGHT}" "${NC}" "${CYAN_BRIGHT}" "${NC}" "${CYAN_BRIGHT}" "${NC}"
_box_content "${CYAN}" "${LINE_V}" $W "$row"
printf -v row ' %b10%b) Back' "${DIM}" "${NC}"
else
printf '%b%s%b %b8%b) Back\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"${DIM}" "${NC}"
printf -v row ' %b7%b) IP info %b8%b) Back' \
"${CYAN_BRIGHT}" "${NC}" "${DIM}" "${NC}"
fi
_box_content "${CYAN}" "${LINE_V}" $W "$row"

_draw_line_bot $W
echo
Expand Down Expand Up @@ -1324,18 +1312,19 @@ _list_snapshots() {

snapshots_menu() {
local id="$1" ty="$2" name="$3"
local W=45
local W=53
echo
_draw_line_top $W
printf '%b%s%b %bSnapshot menu%b — %s %s (%s)\n' \
"${CYAN}" "${LINE_V}" "${NC}" \
"${BOLD}${CYAN_BRIGHT}" "${NC}" "$ty" "$id" "$name"
# " Snapshot menu — TY ID (" + name + ")" + right margin must fit into W - 2
local name_max=$((W - 2 - 18 - ${#ty} - 1 - ${#id} - 2 - 1 - 2))
_box_content "${CYAN}" "${LINE_V}" $W \
" ${BOLD}${CYAN_BRIGHT}Snapshot menu${NC} — ${ty} ${id} ($(_truncate "$name" "$name_max"))"
_draw_line_mid $W
printf '%b%s%b %b1%b) List snapshots\n' "${CYAN}" "${LINE_V}" "${NC}" "${CYAN_BRIGHT}" "${NC}"
printf '%b%s%b %b2%b) Create snapshot\n' "${CYAN}" "${LINE_V}" "${NC}" "${GREEN_BRIGHT}" "${NC}"
printf '%b%s%b %b3%b) Rollback to snapshot\n' "${CYAN}" "${LINE_V}" "${NC}" "${YELLOW_BRIGHT}" "${NC}"
printf '%b%s%b %b4%b) Delete snapshot\n' "${CYAN}" "${LINE_V}" "${NC}" "${RED_BRIGHT}" "${NC}"
printf '%b%s%b %b5%b) Back\n' "${CYAN}" "${LINE_V}" "${NC}" "${DIM}" "${NC}"
_box_content "${CYAN}" "${LINE_V}" $W " ${CYAN_BRIGHT}1${NC}) List snapshots"
_box_content "${CYAN}" "${LINE_V}" $W " ${GREEN_BRIGHT}2${NC}) Create snapshot"
_box_content "${CYAN}" "${LINE_V}" $W " ${YELLOW_BRIGHT}3${NC}) Rollback to snapshot"
_box_content "${CYAN}" "${LINE_V}" $W " ${RED_BRIGHT}4${NC}) Delete snapshot"
_box_content "${CYAN}" "${LINE_V}" $W " ${DIM}5${NC}) Back"
_draw_line_bot $W
echo
printf ' %b→%b Selection [1-5]: ' "${CYAN_BRIGHT}" "${NC}"
Expand Down
Loading