V2.2.0 - Security hardening, performance optimizations, and GUI improvements
Security
- SSH Password Exposure - Switched all
sshpass -pcalls tosshpass -e(environment variable)- Passwords no longer visible in
ps auxprocess listing - Applied to all 4 sites in SSH.sh (
__wait_for_ssh__,__ssh_exec__,__scp_send__,__scp_fetch__) - SSHPASS environment variable is unset immediately after each command
- Passwords no longer visible in
- Container Password Exposure - Changed
__ct_change_password__to pipe credentials via stdin- Previously embedded password in
bash -ccommand string (visible in /proc) - Now pipes directly to
pct exec -- chpasswd
- Previously embedded password in
- Guacamole Token Security - Token file now created with restricted permissions
- Directory created with
mkdir -p -m 700, token file set tochmod 600 - Prevents other system users from reading authentication tokens
- Directory created with
- Guacamole API Credentials - Switched to
--data-urlencodefor curl authentication- Prevents special characters in passwords (e.g.,
&,=) from breaking API calls
- Prevents special characters in passwords (e.g.,
- Eval Removal - Replaced
evalwith safer alternatives across 10 sites in 6 files- Command execution contexts now use
bash -cinstead ofeval "$cmd" - ArgumentParser.sh uses
declare -ginstead ofevalfor variable assignment
- Command execution contexts now use
- ArgumentParser Blocklist - Extended reserved variable name list
- Added high-risk names (HOSTNAME, RANDOM, SECONDS, GROUPS, etc.) to prevent overwrites
Fixed
- Filename Typo - Renamed
EnableCPUScalingGoverner.shtoEnableCPUScalingGovernor.sh- Updated all references in CHANGELOG.md, .docs/TODO.md, and internal SCRIPT_NAME
- CreateFromISO Structure - Moved
set -euo pipefailafter header comment block- Added shellcheck source directive for sourced utility files
- RemoveStorage Race Condition - Cached VM/CT config per iteration
- Added
|| continueto skip VMs/CTs deleted between list and config check
- Added
- Locale-Dependent Parsing - Fixed AWK decimal parsing in CreateFromISO.sh
- Added
LC_NUMERIC=Cand comma-to-dot conversion for European locale compatibility
- Added
- GUI Unicode Symbols - Replaced all Unicode checkmarks/crosses with plain text
Changed
- GUI Breadcrumb Navigation - Path display now shows
cc_pve > Storage > Cephstyle - GUI Script Descriptions - Menu listings show inline description extracted from script headers
- GUI Log Level Hint - "Type 'l' to change log level" only shown in remote execution mode
- SSH Error Context - Connection failures now display the SSH error reason at all 7 failure sites
- SSH Keepalive - Added
ServerAliveInterval=5andServerAliveCountMax=3to SSH and SCP - Multi-Node Recovery - Execution summary now lists per-node results with retry option
- Shows
OK: node1 node2andFAIL: node3after multi-remote execution - Prompts to retry only the failed nodes
- Shows
- CreateFromISO ArgumentParser Migration - Replaced
getoptswith__parse_args__- Arguments now use
--vm-name,--iso-url,--vm-storagestyle flags - All 8 arguments optional with interactive fallback preserved
- Arguments now use
Added
- CI Unit Tests - Added unit test stage to
.github/workflows/checks.yml- Runs
Utilities/RunAllTests.shafter static analysis checks
- Runs
- BulkOperations Source Guards - Defensive guards on source calls in BulkOperations.sh
- GUI Update Safety Guard - Validates BASE_DIR before cleanup in
update_scripts() - Documentation - Added
Manuals/README.mdtable of contents and Documentation section in main README
Performance
- FindVMIDFromIP Caching - Config fetched once per VMID instead of 3 times (~67% fewer API calls)
- Double-Sed Consolidation - Merged 9 paired
sed | sedcalls into singlesed -e ... -e ...- Applied to BulkConfigureNetworkBandwidth, BulkConfigureDiskIOPS, BulkConfigureDiskBandwidth
- Bash Builtins - Replaced
echo | trsubprocesses with native${var^^}case conversion- Applied to FindVMIDFromIP, BulkCloneSetIP_Proxmox, BulkReconfigureMacAddresses, Conversion.sh, ChangeAllMACPrefix.sh
- Carriage Return Removal - Replaced
echo | tr -d '\r'with${var//$'\r'/}in GUI.sh
Technical Details
sshpass -ereads fromSSHPASSenvironment variable; inline assignment (SSHPASS=x cmd) used where possibledeclare -grequires Bash 4.2+evalretained in TestFramework.sh (dynamic function stubs) and RemoteExecutor.sh (SSH parameter expansion) - both legitimate uses- Multi-node retry uses recursive
__execute_remote_script__call with filtered target list - FindVMIDFromIP caches both JSON and plain-text config formats per VMID for reuse
--data-urlencodesends each parameter separately, preventing URL parameter injection