PHP code example of codego / php-ksip-telnet
1. Go to this page and download the library: Download codego/php-ksip-telnet library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
codego / php-ksip-telnet example snippets
sipTelnet\SSHClient;
$client = new SSHClient();
// Default port 22
$client->connect('your-server-ip', 'root', 'your-password');
// Custom port
$client->connect('your-server-ip', 'root', 'your-password', 2222);
$result = $client->createExtensionKsip(
'1001', // extension number
'secret123', // extension password
'freepbxuser', // MySQL username
'dbpassword' // MySQL password
);
echo $result['sql_output'];
echo $result['reload_output'];
$extensions = $client->getExtKsipList('freepbxuser', 'dbpassword');
// returns: ['1001', '1002', '1003', ...]
$result = $client->genExtKsip(
[
'extName' => '1005',
'password' => 'secret123' // optional, defaults to extName
],
'freepbxuser',
'dbpassword'
);
// If extension already exists:
// ['status' => 'exists', 'extension' => '1005', 'message' => 'Extension 1005 already exists']
// If extension was created:
// ['status' => 'created', 'extension' => '1005', 'result' => [...]]
$output = $client->exec('asterisk -rx "pjsip show endpoints"');
echo $output;
$client->connect(
getenv('SSH_HOST'),
getenv('SSH_USER'),
getenv('SSH_PASS'),
getenv('SSH_PORT') ?: 22
);
namespace App\Services;
use KsipTelnet\SSHClient;
class FreePBXService
{
protected SSHClient $client;
public function __construct()
{
$this->client = new SSHClient();
$this->client->connect(
config('services.freepbx.host'),
config('services.freepbx.user'),
config('services.freepbx.pass'),
config('services.freepbx.port', 22)
);
}
public function createExtensionKsip(string $ext, string $password): array
{
return $this->client->createExtensionKsip(
$ext,
$password,
config('services.freepbx.db_user'),
config('services.freepbx.db_pass')
);
}
public function getExtKsipList(): array
{
return $this->client->getExtKsipList(
config('services.freepbx.db_user'),
config('services.freepbx.db_pass')
);
}
public function genExtKsip(array $data): array
{
return $this->client->genExtKsip(
$data,
config('services.freepbx.db_user'),
config('services.freepbx.db_pass')
);
}
public function exec(string $command): string
{
return $this->client->exec($command);
}
}
'freepbx' => [
'host' => env('SSH_HOST'),
'user' => env('SSH_USER'),
'pass' => env('SSH_PASS'),
'port' => env('SSH_PORT', 22),
'db_user' => env('SSH_DB_USER'),
'db_pass' => env('SSH_DB_PASS'),
],
use App\Services\FreePBXService;
public function register(): void
{
$this->app->singleton(FreePBXService::class);
}
namespace App\Http\Controllers;
use App\Services\FreePBXService;
use Illuminate\Http\Request;
class ExtensionController extends Controller
{
public function __construct(protected FreePBXService $freepbx) {}
public function store(Request $request)
{
$request->validate([
'extension' => 'KsipList());
}
public function generate(Request $request)
{
$request->validate([
'extName' => '
use App\Http\Controllers\ExtensionController;
Route::get('/extensions', [ExtensionController::class, 'index']);
Route::post('/extensions', [ExtensionController::class, 'store']);
Route::post('/extensions/generate', [ExtensionController::class, 'generate']);
Schema::create('softphone_configs', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
// SIP Connection
$table->string('server')->nullable();
$table->enum('ws_protocol', ['ws', 'wss'])->default('ws');
$table->string('ws_port')->default('8088');
$table->string('extension')->nullable();
$table->string('password')->nullable();
$table->string('display_name')->nullable();
// Codecs
$table->json('audio_codecs')->nullable();
$table->json('video_codecs')->nullable();
// UI Toggles
$table->boolean('enabled_bubble')->default(true);
$table->boolean('show_dialer')->default(true);
$table->boolean('show_setting')->default(true);
$table->boolean('show_opacity')->default(true);
$table->boolean('answer_with_video_call')->default(false);
$table->boolean('show_incoming_call_video_btn')->default(true);
$table->boolean('show_incoming_call_audio')->default(true);
$table->boolean('fullscreen')->default(false);
// Recording
$table->boolean('auto_record')->default(false);
$table->string('recording_dir')->default('video/recordings/Ksip');
$table->string('upload_api_url')->nullable();
// Position
$table->integer('position_top')->nullable();
$table->integer('position_bottom')->nullable();
$table->integer('position_left')->nullable();
$table->integer('position_right')->nullable();
$table->unique('user_id'); // one config per user
$table->timestamps();
});
Route::middleware(['auth:sanctum,web'])->group(function () {
Route::get('/softphone-config', [SoftphoneConfigController::class, 'show']);
Route::post('/softphone-config', [SoftphoneConfigController::class, 'save']);
});
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
class SipController extends Controller
{
public function createExtension(Request $request)
{
$request->validate([
'extension' => '> $request->name,
'--secret' => $request->secret,
]);
// Get the output of the command
$output = Artisan::output();
if ($exitCode === 0) {
return response()->json([
'success' => true,
'message' => "Extension {$request->extension} created successfully!",
'output' => $output,
], 201);
}
return response()->json([
'success' => false,
'message' => 'Failed to create extension',
'output' => $output,
], 500);
}
}
// routes/api.php
Route::post('/sip/create-extension', [SipController::class, 'createExtension']);
'freepbx' => [
'host' => env('SSH_HOST'),
'user' => env('SSH_USER'),
'pass' => env('SSH_PASS'),
'port' => env('SSH_PORT', 22),
'db_user' => env('SSH_DB_USER'),
'db_pass' => env('SSH_DB_PASS'),
],
use KsipTelnet\SSHClient;
// After saving the user in your register() method:
$ssh = new SSHClient();
$ssh->connect(
config('services.freepbx.host'),
config('services.freepbx.user'),
config('services.freepbx.pass'),
config('services.freepbx.port', 22)
);
$result = SSHClient::ksipRegisterUser(
$user,
$ssh,
config('services.freepbx.db_user'),
config('services.freepbx.db_pass')
);
// $result['status'] → 'assigned' | 'skipped' | 'error'
// $result['extension'] → '121013121696'
namespace App\Http\Controllers\Auth;
use App\Models\User;
use Illuminate\Http\Request;
use KsipTelnet\SSHClient;
class RegisterController extends Controller
{
public function register(Request $request)
{
$request->validate([
'first_name' => ' $user = User::create([
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'middle_name' => $request->middle_name,
'birth_date' => $request->birth_date,
'email' => $request->email,
'password' => bcrypt($request->password),
]);
// Assign FreePBX extension immediately on registration
$ssh = new SSHClient();
$ssh->connect(
config('services.freepbx.host'),
config('services.freepbx.user'),
config('services.freepbx.pass'),
config('services.freepbx.port', 22)
);
$result = SSHClient::ksipRegisterUser(
$user,
$ssh,
config('services.freepbx.db_user'),
config('services.freepbx.db_pass')
);
return response()->json([
'user' => $user,
'extension' => $result['extension'],
'status' => $result['status'],
], 201);
}
}
use KsipTelnet\SSHClient;
$ext = SSHClient::generateExtensionFromUser(
'Luna', // last_name
'Juan', // first_name
'Mercado', // middle_name
'12/16/1996' // birth_date
);
// $ext → '121013121696'
Route::prefix('recordings')->group(function () {
Route::post('/upload', [CallRecordingController::class, 'upload']);
Route::get('/', [CallRecordingController::class, 'index']);
Route::get('/{id}', [CallRecordingController::class, 'show']);
Route::get('/{id}/download', [CallRecordingController::class, 'download']);
Route::delete('/{id}', [CallRecordingController::class, 'delete']);
});
Schema::create('call_recordings', function (Blueprint $table) {
$table->id();
$table->string('filename');
$table->string('path');
$table->string('caller')->nullable();
$table->string('callee')->nullable();
$table->integer('duration')->nullable();
$table->timestamps();
});
bash
scp stubs/create_freepbx_extension.php root@your-pbx:/var/lib/asterisk/bin/create_freepbx_extension.php
ssh root@your-pbx "chmod 755 /var/lib/asterisk/bin/create_freepbx_extension.php"
bash
composer bash
export SSH_HOST=your-server-ip
export SSH_USER=root
export SSH_PASS=your-password
export SSH_PORT=22
bash
composer bash
php artisan make:service FreePBXService
bash
php artisan make:controller ExtensionController
bash
php artisan make:ksip-config
php artisan migrate
bash
php artisan make:ksip --extension="1001" --name="Juan Luna" --secret="mypassword"
bash
php artisan make:ksip --extension="1001" --name="Juan Luna"
# Password defaults to: 1001
bash
php artisan make:ksip-register-user
bash
php artisan make:ksipgen
php artisan migrate