- plogical/firewallUtilities: fix inverted success/failure (result==1 = success); write blocked_ips.log under CyberCP/data for cyberpanel write access
- plogical/processUtilities: when root, use normalExecutioner return value so executioner reflects actual command success/failure
- firewall/firewallManager: addBannedIP uses FirewallUtilities.blockIP; ACL and all errors return JSON with error_message/error; rollback store if block fails
- baseTemplate/views: blockIPAddress uses FirewallUtilities.blockIP instead of subprocess
- baseTemplate/homePage: inline Ban IP calls /firewall/addBannedIP with ip/reason/duration; show server error in notifications
- baseTemplate/system-status.js: handle string response and show server error_message in success and error callbacks
- saveSSHConfigs() now writes only one Port line (was writing one per
existing Port line, causing duplicate Port entries and 'Address
already in use' from sshd)
- Match only actual 'Port N' directive; exclude GatewayPorts and other
lines containing 'Port'
- If no Port line exists in config, append one
Fixes: https://github.com/usmannasir/cyberpanel/issues/1668#issue-3881969535