serverType = $serverType; $this->config = config("services.ispconfig.servers.{$serverType}"); if (!$this->config) { throw new Exception("ISPConfig server configuration not found for: {$serverType}"); } } protected function connect(): void { if ($this->client !== null && $this->sessionId !== null) { return; } try { $this->client = new SoapClient(null, [ 'location' => $this->config['soap_location'], 'uri' => $this->config['soap_uri'], 'trace' => 1, 'exceptions' => 1, 'stream_context' => stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ] ]) ]); $this->sessionId = $this->client->login( $this->config['username'], $this->config['password'] ); Log::info("ISPConfig connected", [ 'server' => $this->serverType, 'session_id' => $this->sessionId ]); } catch (SoapFault $e) { Log::error("ISPConfig connection failed", [ 'server' => $this->serverType, 'error' => $e->getMessage() ]); throw new Exception("Failed to connect to ISPConfig: " . $e->getMessage()); } } public function disconnect(): void { if ($this->client && $this->sessionId) { try { $this->client->logout($this->sessionId); Log::info("ISPConfig disconnected", ['server' => $this->serverType]); } catch (SoapFault $e) { Log::warning("ISPConfig logout failed", [ 'server' => $this->serverType, 'error' => $e->getMessage() ]); } $this->sessionId = null; $this->client = null; } } /** * @throws Exception */ protected function call(string $method, array $params = []): mixed { $this->connect(); try { array_unshift($params, $this->sessionId); $result = $this->client->__soapCall($method, $params); Log::debug("ISPConfig API call", [ 'method' => $method, 'server' => $this->serverType, 'success' => true ]); return $result; } catch (SoapFault $e) { Log::error("ISPConfig API call failed", [ 'method' => $method, 'server' => $this->serverType, 'error' => $e->getMessage() ]); throw new Exception("ISPConfig API call failed: " . $e->getMessage()); } } public function __destruct() { $this->disconnect(); } /** * Récupère tous les clients */ public function getAllClients(): array { return Cache::remember( "ispconfig.mail.clients.all", config('services.ispconfig.cache_ttl'), fn() => $this->call('client_get_all') ); } public function getClientData(string $clientId): array { return $this->call('client_get', ['client_id' => $clientId]); } }