$this->vmId, 'ip' => $this->guestIp, 'os_family' => $this->osFamily, 'username' => $this->username, ]); // [7] Generate secure password $newPassword = $provision->generatePassword(16); // [8] Change password on OS $this->changePassword($provision, $newPassword); // [9] Verify new credentials work (critical — throws on failure) $this->verifyPassword($provision, $newPassword); // [10] Persist encrypted password + guest IP to DB $provision->savePassword($this->moduleVmwareId, $this->guestIp, $newPassword); // [11] Send credentials email SendVmCredentialsEmailJob::dispatch($this->moduleVmwareId); Log::info('ChangePasswordJob: completed', [ 'vm_id' => $this->vmId, 'module_vmware_id' => $this->moduleVmwareId, ]); } public function failed(\Throwable $e): void { Log::error('ChangePasswordJob: failed after max retries', [ 'vm_id' => $this->vmId, 'module_vmware_id' => $this->moduleVmwareId, 'error' => $e->getMessage(), ]); \App\Models\ModuleVmware::where('id', $this->moduleVmwareId) ->update(['status' => 0]); } // ------------------------------------------------------------------------- private function changePassword(VmProvisionService $provision, string $newPassword): void { if ($this->osFamily === VmProvisionService::OS_WINDOWS) { Log::info('ChangePasswordJob: changing password via WinRM', [ 'vm_id' => $this->vmId, 'ip' => $this->guestIp, ]); $provision->winrmChangePassword( $this->guestIp, $this->username, $newPassword, $this->vmId, ); } else { Log::info('ChangePasswordJob: changing password via SSH', [ 'vm_id' => $this->vmId, 'ip' => $this->guestIp, ]); $provision->sshChangePassword( $this->guestIp, $this->username, $newPassword, $this->vmId, ); } } private function verifyPassword(VmProvisionService $provision, string $newPassword): void { Log::info('ChangePasswordJob: verifying new credentials', [ 'vm_id' => $this->vmId, 'ip' => $this->guestIp, ]); if ($this->osFamily === VmProvisionService::OS_WINDOWS) { $provision->verifyWinrmLogin($this->guestIp, $this->username, $newPassword, $this->vmId); } else { $provision->verifySshLogin($this->guestIp, $this->username, $newPassword, $this->vmId); } Log::info('ChangePasswordJob: credential verification passed', [ 'vm_id' => $this->vmId, ]); } }