PfSenseGatewayDriver::bootstrap() used raw SSH to log into a freshly
provisioned gateway VM's WAN IP and run pfSsh.php to rotate the
factory-default admin password. That requires inbound reachability to
the appliance from wherever this app runs - an assumption a
firewall/gateway may legitimately never satisfy by design, and the
root cause of the SSH connection timeouts seen in production.
pfsense.agent already exposes pfsense.set_password as a NATS operation
(runs the rotation locally on the box via the agent's own privileges,
same as every other pfsense.* operation this driver already uses), and
it was already whitelisted in
VirtualMachinesMetadataService::buildAgentConfiguration()'s
allowed_operations - just never wired up here. bootstrap() now sends
it over agentSend() instead of opening an SSH connection, removing the
inbound-connectivity requirement entirely.
agentSend() only validates the outer NATS envelope's status
(completed/rejected/failed); the Go agent's SetPasswordResult can
report success=false with no Go-level error, so status alone would
still read "completed" - added an explicit success-field check on top
of agentSend()'s own to catch that case.
Removed the now-unused phpseclib3\Net\SSH2 import and the
FACTORY_PASSWORD constant (no longer needed - the agent doesn't
authenticate against the existing password to rotate it).