'; Log::info('ExtensionHelper: creating WSS extension', [ 'extension' => $ext, 'callerid' => $callerid, ]); self::appendEndpoint($ext, $callerid); self::appendAuth($ext, $password); self::appendAor($ext); self::writeSipTable($ext, $callerid, $password); self::reloadPjsip(); Log::info('ExtensionHelper: WSS extension ready', ['extension' => $ext]); } // ------------------------------------------------------------------------- // PJSIP conf file methods // ------------------------------------------------------------------------- private static function appendEndpoint(string $ext, string $callerid): void { $content = file_exists(self::ENDPOINT_CUSTOM) ? file_get_contents(self::ENDPOINT_CUSTOM) : ''; if (strpos($content, "[{$ext}]") !== false) { Log::info("ExtensionHelper: endpoint [{$ext}] already exists, skipping."); return; } $block = << $ext, 'accountcode' => '', 'aggregate_mwi' => 'no', 'allow' => '', 'avpf' => 'yes', 'bundle' => 'no', 'callerid' => $callerid, 'context' => 'from-internal', 'defaultuser' => '', 'device_state_busy_at' => '0', 'dial' => 'PJSIP/' . $ext, 'direct_media' => 'yes', 'disallow' => '', 'dtmfmode' => 'rfc4733', 'force_callerid' => 'no', 'force_rport' => 'yes', 'icesupport' => 'yes', 'mailbox' => $ext . '@device', 'match' => '', 'max_audio_streams' => '1', 'max_contacts' => '1', 'max_video_streams' => '1', 'maximum_expiration' => '7200', 'md5_cred' => '', 'media_address' => '', 'media_encryption' => 'dtls', 'media_encryption_optimistic' => 'no', 'media_use_received_transport' => 'yes', 'message_context' => '', 'minimum_expiration' => '60', 'mwi_subscription' => 'auto', 'namedcallgroup' => '', 'namedpickupgroup' => '', 'outbound_auth' => 'no', 'outbound_proxy' => '', 'qualifyfreq' => '60', 'refer_blind_progress' => 'yes', 'remove_existing' => 'yes', 'rewrite_contact' => 'yes', 'rtcp_mux' => 'yes', 'rtp_symmetric' => 'yes', 'rtp_timeout' => '0', 'rtp_timeout_hold' => '0', 'secret' => $password, 'send_connected_line' => 'yes', 'sendrpid' => 'pai', 'sipdriver' => 'chan_pjsip', 'timers' => 'no', 'timers_min_se' => '90', 'transport' => '', 'trustrpid' => 'yes', 'user_eq_phone' => 'no', 'vmexten' => '', 'webrtc' => 'yes', ]; foreach ($rows as $keyword => $data) { DB::table('asterisk.sip')->updateOrInsert( ['id' => $ext, 'keyword' => $keyword], ['data' => $data] ); } Log::info('ExtensionHelper: sip table rows written', ['extension' => $ext, 'rows' => count($rows)]); } // ------------------------------------------------------------------------- private static function reloadPjsip(): void { exec('asterisk -rx "pjsip reload" 2>&1', $output, $code); Log::info('ExtensionHelper: pjsip reload', ['exit_code' => $code, 'output' => implode(' ', $output)]); } }